From 1898e03577eac27a8e27561eda952647643ec69b Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Thu, 26 Jun 2008 20:26:25 +0200 Subject: Added very basic set querying --- portato/backend/system_interface.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'portato/backend/system_interface.py') diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index 4b0f8df..16f0a9c 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -12,6 +12,21 @@ class SystemInterface (object): + def has_set_support (self): + """Signals, whether this backend supports sets. + + @rtype: boolean + """ + raise NotImplementedError + + def get_sets (self): + """Returns all supported sets in tuples consisting of name and description. + If sets aren't supported, at least "world" and "system" have to be returned. + + @rtype: (string, string)[] + """ + raise NotImplementedError + def get_version (self): """Returns the version of the used backend. -- cgit v1.2.3-54-g00ecf From c10d60d57fc5c3f0eff217f216ce4f0a0897cb55 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Thu, 26 Jun 2008 22:37:56 +0200 Subject: Removed '__find_resolved_unresolved' as it is quite useless. Also removed the "find_packages::ws" and moved the content into "world" and "system" to prepare for exchangebility. --- portato/backend/portage/system.py | 78 +++++++++++++------------------------ portato/backend/system_interface.py | 2 +- portato/helper.py | 2 +- 3 files changed, 29 insertions(+), 53 deletions(-) (limited to 'portato/backend/system_interface.py') diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 58f687e..229bcc9 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -14,6 +14,11 @@ from __future__ import absolute_import, with_statement import re, os, os.path import portage +try: + import portage.dep as portage_dep +except ImportError: + import portage_dep + from collections import defaultdict from . import VERSION @@ -226,24 +231,30 @@ class PortageSystem (SystemInterface): inst = set(installed(key)) return list(alist - inst) - def _ws (key, crit, pkglist): - pkgs = self.__find_resolved_unresolved(pkglist, crit, only_cpv = with_version)[0] - if not with_version: - pkgs = [x.get_cp(x) for x in list] - - if is_regexp: - return filter(lambda x: re.match(key, x, re.I), pkgs) - - return pkgs - def world (key): with open(portage.WORLD_FILE) as f: - pkglist = f.readlines() + for cp in f: + cp = cp.strip() + if cp and cp[0] != "#": + if is_regexp: + if not re.match(key, cp, re.I): continue - return _ws(key, lambda cpv: cpv[0] != "#", pkglist) + if not with_version: + yield portage_dep.dep_getkey(cp) + + yield self.find_best_match(cp, only_cpv = True) def system (key): - return _ws(key, lambda cpv: cpv[0] == "*", self.settings.settings.packages) + for cp in self.settings.settings.packages: + if cp[0] != "*": continue + + if is_regexp: + if not re.match(key, cp, re.I): continue + + if not with_version: + yield portage_dep.dep_getkey(cp) + + yield self.find_best_match(cp, only_cpv = True) funcmap = { "all" : all, @@ -272,34 +283,9 @@ class PortageSystem (SystemInterface): # Make the list of packages unique t = unique_array(t) - t.sort() return self.geneticize_list(t, only_cpv or not with_version) - def __find_resolved_unresolved (self, list, check, only_cpv = False): - """Checks a given list and divides it into a "resolved" and an "unresolved" part. - - @param list: list of cpv's - @type list: string[] - @param check: function called to check whether an entry is ok - @type check: function(cpv) - @param only_cpv: do not return packages but cpv-strings - @type only_cpv: boolean - - @returns: the divided list: (resolved, unresolved) - @rtype: (Package[], Package[]) or (string[], string[])""" - resolved = [] - unresolved = [] - for x in list: - cpv = x.strip() - if cpv and check(cpv): - pkg = self.find_best_match(cpv, only_cpv = only_cpv) - if pkg: - resolved.append(pkg) - else: - unresolved.append(self.find_best_match(cpv, True, only_cpv = only_cpv)) - return (resolved, unresolved) - def list_categories (self, name = None): categories = self.settings.settings.categories return filter(self.find_lambda(name), categories) @@ -357,19 +343,9 @@ class PortageSystem (SystemInterface): return packages def update_world (self, newuse = False, deep = False): - # read world file - world = open(portage.WORLD_FILE) - packages = [] - for line in world: - line = line.strip() - if len(line) == 0: continue # empty line - if line[0] == "#": continue # comment - packages.append(line) - world.close() - - # append system packages - packages.extend(unique_array([p.get_cp() for p in self.find_packages(pkgSet = "system")])) - + packages = self.find_packages(pkgSet="world", with_version = False) + packages.extend(self.find_packages(pkgSet = "system", with_version = False)) + states = [(["RDEPEND", "PDEPEND"], True)] if self.with_bdeps(): states.append((["DEPEND"], True)) diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index 16f0a9c..c118f6d 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -23,7 +23,7 @@ class SystemInterface (object): """Returns all supported sets in tuples consisting of name and description. If sets aren't supported, at least "world" and "system" have to be returned. - @rtype: (string, string)[] + @rtype: iter(string, string) """ raise NotImplementedError diff --git a/portato/helper.py b/portato/helper.py index 31e25d9..145716e 100644 --- a/portato/helper.py +++ b/portato/helper.py @@ -110,7 +110,6 @@ def unique_array(s): """Stolen from portage_utils: lifted from python cookbook, credit: Tim Peters Return a list of the elements in s in arbitrary order, sans duplicates""" - n = len(s) # assume all elements are hashable, if so, it's linear try: return list(set(s)) @@ -124,6 +123,7 @@ def unique_array(s): except TypeError: pass else: + n = len(s) assert n > 0 last = t[0] lasti = i = 1 -- cgit v1.2.3-54-g00ecf From 01fa05da0d80aab1aa1526a5302b3a798d0f0179 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Wed, 9 Jul 2008 22:00:49 +0200 Subject: Renamed generic package sets --- portato/backend/portage/package.py | 2 +- portato/backend/portage/system.py | 30 +++++++++++++++--------------- portato/backend/system_interface.py | 7 ++++++- portato/gui/queue.py | 4 ++-- portato/gui/utils.py | 2 +- portato/gui/windows/main.py | 2 +- 6 files changed, 26 insertions(+), 21 deletions(-) (limited to 'portato/backend/system_interface.py') diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index 78125ee..351b7e0 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -226,7 +226,7 @@ class PortagePackage (Package): for dep in deps: if dep[0] == '!': # blocking sth - blocked = system.find_packages(dep, "installed") + blocked = system.find_packages(dep, system.SET_INSTALLED) if len(blocked) == 1: # only exact one match allowed to be harmless if blocked[0].get_slot_cp() == self.get_slot_cp(): # blocks in the same slot are harmless continue diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 246f20c..edbb4f0 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -174,16 +174,16 @@ class PortageSystem (SystemInterface): t = [] if not only_installed: - pkgSet = "tree" + pkgSet = self.SET_TREE else: - pkgSet = "installed" + pkgSet = self.SET_INSTALLED t = self.find_packages(search_key, pkgSet = pkgSet, masked = masked, with_version = True, only_cpv = True) if VERSION >= (2,1,5): - t += [pkg.get_cpv() for pkg in self.find_packages(search_key, "installed") if not (pkg.is_testing(True) or pkg.is_masked())] + t += [pkg.get_cpv() for pkg in self.find_packages(search_key, self.SET_INSTALLED) if not (pkg.is_testing(True) or pkg.is_masked())] else: - t = self.find_packages(search_key, "installed", only_cpv=True) + t = self.find_packages(search_key, self.SET_INSTALLED, only_cpv=True) if t: t = unique_array(t) @@ -191,7 +191,7 @@ class PortageSystem (SystemInterface): return None - def find_packages (self, key = "", pkgSet = "all", masked = False, with_version = True, only_cpv = False): + def find_packages (self, key = "", pkgSet = SystemInterface.SET_ALL, masked = False, with_version = True, only_cpv = False): if key is None: key = "" is_regexp = key == "" or ("*" in key and key[0] not in ("*","=","<",">","~","!")) @@ -261,12 +261,12 @@ class PortageSystem (SystemInterface): yield self.find_best_match(cp, only_cpv = True) funcmap = { - "all" : all, - "installed" : installed, - "uninstalled" : uninstalled, + self.SET_ALL : all, + self.SET_INSTALLED : installed, + self.SET_UNINSTALLED : uninstalled, + self.SET_TREE : tree, "world" : world, - "system" : system, - "tree" : tree + "system" : system } pkgSet = pkgSet.lower() @@ -316,7 +316,7 @@ class PortageSystem (SystemInterface): new_packages = [] for p in packages: - inst = self.find_packages(p, "installed") + inst = self.find_packages(p, self.SET_INSTALLED) best_p = self.find_best_match(p) if best_p is None: @@ -342,7 +342,7 @@ class PortageSystem (SystemInterface): return new_packages def get_updated_packages (self): - packages = self.get_new_packages(self.find_packages(pkgSet = "installed", with_version = False)) + packages = self.get_new_packages(self.find_packages(pkgSet = self.SET_INSTALLED, with_version = False)) packages = [x for x in packages if x is not None and not x.is_installed()] return packages @@ -374,11 +374,11 @@ class PortageSystem (SystemInterface): tempDeep = False if not p.is_installed(): - oldList = self.find_packages(p.get_slot_cp(), "installed") + oldList = self.find_packages(p.get_slot_cp(), self.SET_INSTALLED) if oldList: old = oldList[0] # we should only have one package here - else it is a bug else: - oldList = self.sort_package_list(self.find_packages(p.get_cp(), "installed")) + oldList = self.sort_package_list(self.find_packages(p.get_cp(), self.SET_INSTALLED)) if not oldList: info(_("Found a not installed dependency: %s.") % p.get_cpv()) oldList = [p] @@ -428,7 +428,7 @@ class PortageSystem (SystemInterface): if not pkg: continue if not pkg.is_installed() and (pkg.is_masked() or pkg.is_testing(True)): # check to not update unnecessairily cont = False - for inst in self.find_packages(pkg.get_cp(), "installed", only_cpv = True): + for inst in self.find_packages(pkg.get_cp(), self.SET_INSTALLED, only_cpv = True): if self.cpv_matches(inst, i): debug("The installed %s matches %s. Discarding upgrade to masked version.", inst, i) cont = True diff --git a/portato/backend/system_interface.py b/portato/backend/system_interface.py index c118f6d..1cb0ed1 100644 --- a/portato/backend/system_interface.py +++ b/portato/backend/system_interface.py @@ -11,6 +11,11 @@ # Written by René 'Necoro' Neumann class SystemInterface (object): + + SET_ALL = "__portato_all__" + SET_TREE = "__portato_tree__" + SET_INSTALLED = "__portato_installed__" + SET_UNINSTALLED = "__portato_uninstalled__" def has_set_support (self): """Signals, whether this backend supports sets. @@ -90,7 +95,7 @@ class SystemInterface (object): raise NotImplementedError - def find_packages (self, key, pkgSet = "all", masked = False, with_version = True, only_cpv = False): + def find_packages (self, key, pkgSet = SET_ALL, masked = False, with_version = True, only_cpv = False): """This returns a list of packages matching the key. As key, it is allowed to use basic regexps (".*") and the normal package specs. But not a combination of them. diff --git a/portato/gui/queue.py b/portato/gui/queue.py index ce7e620..cb5b334 100644 --- a/portato/gui/queue.py +++ b/portato/gui/queue.py @@ -143,7 +143,7 @@ class EmergeQueue: try: pkg = self._get_pkg_from_cpv(cpv, unmask) if not pkg.is_installed(): - old = system.find_packages(pkg.get_slot_cp(), "installed") + old = system.find_packages(pkg.get_slot_cp(), system.SET_INSTALLED) if old: old = old[0] # assume we have only one there cmp = pkg.compare_version(old) @@ -272,7 +272,7 @@ class EmergeQueue: # get the blocks that block an installed package inst = [] for block in self.blocks[type]: - pkgs = system.find_packages(block, "installed") + pkgs = system.find_packages(block, system.SET_INSTALLED) if pkgs: inst.append((pkgs, block)) diff --git a/portato/gui/utils.py b/portato/gui/utils.py index 035d1c6..a4e1e6e 100644 --- a/portato/gui/utils.py +++ b/portato/gui/utils.py @@ -185,7 +185,7 @@ class Database (object): # get the lists packages = system.find_packages(category, with_version = False) - installed = system.find_packages(category, "installed", with_version = False) + installed = system.find_packages(category, system.SET_INSTALLED, with_version = False) # cycle through packages for p in packages: diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index 8f456d9..188a5e1 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -1315,7 +1315,7 @@ class MainWindow (Window): if pkg.is_installed(): installed = set(pkg.get_iuse_flags()).intersection(pkg.get_installed_use_flags()) else: - inst = system.find_packages(pkg.get_slot_cp(), "installed") + inst = system.find_packages(pkg.get_slot_cp(), system.SET_INSTALLED) if inst: installed = set(inst[0].get_iuse_flags()).intersection(inst[0].get_installed_use_flags()) else: -- cgit v1.2.3-54-g00ecf