diff --git a/bin/InstallDB.py b/bin/InstallDB.py --- a/bin/InstallDB.py +++ b/bin/InstallDB.py @@ -272,9 +272,3 @@ # get a global object installdb = InstallDB() - -# an additional function from portage.py -def printInstalled(): - """get all the packages that are already installed""" - host = target = portage.alwaysTrue - portage.printCategoriesPackagesAndVersions(installdb.getDistinctInstalled(), portage.alwaysTrue, host, target) diff --git a/bin/Package/PackageBase.py b/bin/Package/PackageBase.py --- a/bin/Package/PackageBase.py +++ b/bin/Package/PackageBase.py @@ -135,15 +135,6 @@ basepath = os.path.join( self.installDir() ) utils.createImportLibs( pkgName, basepath ) - def printFiles(self): - packageList = installdb.getInstalledPackages(self.category, self.package) - for package in packageList: - fileList = package.getFiles() - fileList.sort() - for file in fileList: - print(file[0]) - return True - def getAction(self, cmd = None ): if not cmd: command = sys.argv[ 1 ] @@ -212,8 +203,6 @@ "package": "createPackage", "createpatch": "createPatch", "geturls": "getUrls", - "print-revision": "printSourceVersion", - "print-files": "printFiles", "checkdigest": "checkDigest", "fetch-binary": "fetchBinary"} if command in functions: diff --git a/bin/Source/SourceBase.py b/bin/Source/SourceBase.py --- a/bin/Source/SourceBase.py +++ b/bin/Source/SourceBase.py @@ -110,9 +110,3 @@ :return: Same as sourceVersion for Cvs systems, None for all other """ return None - - def printSourceVersion(self): - """ return the current revision or version of the source directory, - return True in case it is not applicable and give out nothing """ - print(self.sourceVersion()) - return True \ No newline at end of file diff --git a/bin/craft.py b/bin/craft.py --- a/bin/craft.py +++ b/bin/craft.py @@ -109,9 +109,7 @@ elif buildAction in [ "fetch", "fetch-binary", "unpack", "configure", "compile", "make", "checkdigest", "test", "package", "unmerge", "cleanimage", "cleanbuild", "createpatch", - "geturls", - "print-revision", - "print-files" + "geturls" ]: success = doExec( package, buildAction, continueFlag ) elif buildAction == "install": @@ -121,12 +119,6 @@ #success = doExec( package, "cleanimage" ) #success = success and doExec( package, "install") success = success and doExec( package, "qmerge" ) - elif buildAction == "print-source-version": - print( "%s-%s" % ( packageName, package.sourceVersion( ) ) ) - success = True - elif buildAction == "print-package-version": - print( "%s-%s-%s" % ( packageName, compiler.getCompilerName( ), package.sourceVersion( ) ) ) - success = True else: success = craftDebug.log.error("could not understand this buildAction: %s" % buildAction) @@ -179,10 +171,7 @@ maxDepth = args.dependencydepth ) # no package found if len( deplist ) == 0: - category = "" - if not packageName.find( "/" ) == -1: - (category, package) = packageName.split( "/" ) - portageSearch.printSearch( category, packageName ) + portageSearch.printSearch( [packageName] ) return False for item in deplist: @@ -363,7 +352,7 @@ parser.add_argument( "--target", action = "store", help = "This will override the build of the default target." ) - parser.add_argument( "--search", action = "store_true", + parser.add_argument( "--search", action = "store", help = "This will search for a package or a description matching or similar to the search term." ) parser.add_argument( "--noclean", action = "store_true", default = craftSettings.getboolean( "General", "EMERGE_NOCLEAN", False ), @@ -401,12 +390,6 @@ actionHandler.addAction( "update", help = "Update a single package" ) # read-only actions - actionHandler.addAction( "print-source-version" ) - actionHandler.addAction( "print-package-version" ) - actionHandler.addAction( "print-installed", - help = "This will show a list of all packages that are installed currently." ) - actionHandler.addAction( "print-revision", help = "Print the revision of the package and exit" ) - actionHandler.addAction( "print-files", help = "Print the files installed by the package and exit" ) actionHandler.addActionWithArg( "search-file", help = "Print packages owning the file" ) # other actions @@ -449,11 +432,7 @@ portage.PortageInstance.options = args.options if args.search: - for package in args.packageNames: - category = "" - if not package.find( "/" ) == -1: - (category, package) = package.split( "/" ) - portageSearch.printSearch( category, package ) + portageSearch.printSearch( args.packageNames, args=args.search) return True @@ -475,9 +454,7 @@ craftDebug.log.debug("KDEROOT: %s" % CraftStandardDirs.craftRoot()) craftDebug.debug_line() - if action == "print-installed": - InstallDB.printInstalled( ) - elif action == "search-file": + if action == "search-file": portage.printPackagesForFileSearch(tempArgs.search_file) elif tempArgs.list_file: handleSinglePackage( "", action, tempArgs ) diff --git a/bin/portage.py b/bin/portage.py --- a/bin/portage.py +++ b/bin/portage.py @@ -570,19 +570,6 @@ msg += ")" return msg -def printCategoriesPackagesAndVersions( lines, condition, hostEnabled=alwaysTrue, targetEnabled=alwaysTrue ): - """prints a number of 'lines', each consisting of category, package and version field""" - def printLine( cat, pack, ver, hnt="" ): - catlen = 25 - packlen = 25 - craftDebug.log.info(cat + " " * ( catlen - len( cat ) ) + pack + " " * ( packlen - len( pack ) ) + ver + hnt) - - printLine( 'Category', 'Package', 'Version' ) - printLine( '--------', '-------', '-------' ) - for category, package, version in lines: - if condition( category, package, version ): - printLine( category, package, version ) - def printPackagesForFileSearch(filename): packages = InstallDB.installdb.getPackagesForFileSearch(filename) for pId, filename in packages: diff --git a/bin/portageSearch.py b/bin/portageSearch.py --- a/bin/portageSearch.py +++ b/bin/portageSearch.py @@ -21,75 +21,134 @@ self.availableVersions = ", ".join(versions) - def __str__(self): + def _installedPackage(self): installed = InstallDB.installdb.getInstalledPackages(self.category, self.package) - version = None - revision = None - if installed: - if (len(installed)>1): - raise Exception("Multiple installs are not supported") - version = installed[0].getVersion() or None - revision = installed[0].getRevision() or None + if not installed: + return None + if (len(installed) > 1): + raise Exception("Multiple installs are not supported") + return installed[0] + + @property + def revision(self): + installed = self._installedPackage() + return installed.getRevision() if installed else None + + @property + def version(self): + installed = self._installedPackage() + return installed.getVersion() if installed else None + + @property + def files(self): + installed = self._installedPackage() + return installed.getFiles() if installed else None + + def __str__(self): subpackage = f"/{self.subpackage}" if self.subpackage else "" latestVersion = portage.PortageInstance.getDefaultTarget(self.category, self.package) return f"""\ {self.category}{subpackage}/{self.package} Homepage: {self.homepage} Description: {self.shortDescription} Latest version: {latestVersion} - Installed versions: {version} - Installed revision: {revision} + Installed versions: {self.version} + Installed revision: {self.revision} Available versions: {self.availableVersions} """ def packages(): if not utils.utilsCache.availablePackages: - utils.utilsCache.availablePackages = [] + utils.utilsCache.availablePackages = {} craftDebug.log.info("Updating search cache:") total = len(portage.PortageInstance.getInstallables()) for p in portage.PortageInstance.getInstallables(): pi = portage.PortageInstance.getPackageInstance(p.category, p.package) if pi: package = SeachPackage(pi) - utils.utilsCache.availablePackages.append(package) - percent = int(len(utils.utilsCache.availablePackages)/total * 100) + utils.utilsCache.availablePackages[f"{p.category}/{p.package}"] = package + percent = int(len(utils.utilsCache.availablePackages)/total * 100) utils.printProgress(percent) utils.printProgress(100) craftDebug.log.info("") return utils.utilsCache.availablePackages - -def printSearch(search_category, search_package,maxDist = 2): - with CraftTimer.Timer("Search", 0) as timer: - similar = [] - match = None - package_re = re.compile(".*%s.*" % search_package, re.IGNORECASE) - for package in packages(): +def _search(search_category, search_package ,maxDist): + with CraftTimer.Timer("Search", 0) as timer: + similar = [] + match = None + package_re = re.compile(".*%s.*" % search_package, re.IGNORECASE) + if f"{search_category}/{search_package}" in packages(): + match = (0, packages()[f"{search_category}/{search_package}"]) + else: + for package in packages().values(): if search_category == "" or search_category == package.category: - levDist = utils.levenshtein(search_package.lower(),package.package.lower()) - if levDist == 0 : - match = (levDist,package) + levDist = utils.levenshtein(search_package.lower(), package.package.lower()) + if levDist == 0: + match = package break elif package_re.match(package.package): - similar.append((levDist-maxDist,package)) - elif len(package.package)>maxDist and levDist <= maxDist: - similar.append((levDist,package)) + similar.append((levDist - maxDist, package)) + elif len(package.package) > maxDist and levDist <= maxDist: + similar.append((levDist, package)) else: if package_re.match(package.shortDescription): - similar.append((100,package)) - - if match == None: - if len(similar)>0: - print("Craft was unable to find %s, similar packages are:" % search_package) - similar.sort( key = lambda x: x[0]) - else: - print("Craft was unable to find %s" % search_package) + similar.append((100, package)) + return match, similar + + +def _printSearch(search_category, search_package ,maxDist): + match, similar = _search(search_category, search_package, maxDist) + if match == None: + if len(similar) > 0: + print("Craft was unable to find %s, similar packages are:" % search_package) + similar.sort(key=lambda x: x[0]) else: - print("Package %s found:" % search_package) - similar = [match] + print("Craft was unable to find %s" % search_package) + else: + print("Package %s found:" % search_package) + similar = [(0, match)] + + for levDist, package in similar: + craftDebug.log.debug((package, levDist)) + print(package) + +def printSearch(packageList, maxDist = 2, args = None): + if args not in [None, "revision", "files", "installed"]: + packageList += [args] + args = None + categoryPackageList = [] + for p in packageList: + tmp = p.split("/") + category = package = "" + if len(tmp) == 3: + category = tmp[0] + package = tmp[2] + elif len(tmp) == 2: + category = tmp[0] + package = tmp[1] + else: + package = p + categoryPackageList.append((category, package)) + + if args == "installed": + categoryPackageList = InstallDB.installdb.getDistinctInstalled() + for p in categoryPackageList: + print(packages()[f"{p[0]}/{p[1]}"]) + else: + for category, package in categoryPackageList: + if args == None: + _printSearch(category, package, maxDist) + else: + match, _ = _search(category, package, maxDist) + if match: + if args == "revision": + print(match.revision) + elif args == "files": + for f in match.files: + print(f[0]) + + - for levDist,package in similar: - craftDebug.log.debug((package, levDist)) - print(package)