summaryrefslogtreecommitdiff
path: root/portato/backend/portage/system.py
diff options
context:
space:
mode:
authorRené 'Necoro' Neumann <necoro@necoro.net>2008-07-09 22:42:15 +0200
committerRené 'Necoro' Neumann <necoro@necoro.net>2008-07-09 22:42:15 +0200
commiteb87d40f4056e05f38609fc5e8482e21a7a4c42e (patch)
tree4ff92ad73377905840eef41f0211882524058e95 /portato/backend/portage/system.py
parent01fa05da0d80aab1aa1526a5302b3a798d0f0179 (diff)
downloadportato-eb87d40f4056e05f38609fc5e8482e21a7a4c42e.tar.gz
portato-eb87d40f4056e05f38609fc5e8482e21a7a4c42e.tar.bz2
portato-eb87d40f4056e05f38609fc5e8482e21a7a4c42e.zip
Introduced Sets for finding
Diffstat (limited to 'portato/backend/portage/system.py')
-rw-r--r--portato/backend/portage/system.py112
1 files changed, 17 insertions, 95 deletions
diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py
index edbb4f0..c241a4b 100644
--- a/portato/backend/portage/system.py
+++ b/portato/backend/portage/system.py
@@ -23,6 +23,7 @@ from collections import defaultdict
import itertools as itt
from . import VERSION
+from . import sets as syssets
from .package import PortagePackage
from .settings import PortageSettings
from ..system_interface import SystemInterface
@@ -43,6 +44,15 @@ class PortageSystem (SystemInterface):
self.use_descs = {}
self.local_use_descs = defaultdict(dict)
+ self.setmap = {
+ self.SET_ALL : syssets.AllSet,
+ self.SET_INSTALLED : syssets.InstalledSet,
+ self.SET_UNINSTALLED : syssets.UninstalledSet,
+ self.SET_TREE : syssets.TreeSet,
+ "world" : syssets.WorldSet,
+ "system" : syssets.SystemSet
+ }
+
def has_set_support (self):
return False
@@ -157,6 +167,8 @@ class PortageSystem (SystemInterface):
if not only_cpv:
return [self.new_package(x) for x in list_of_packages]
+ elif not isinstance(list_of_packages, list):
+ return list(list_of_packages)
else:
return list_of_packages
@@ -191,104 +203,14 @@ class PortageSystem (SystemInterface):
return None
- 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 ("*","=","<",">","~","!"))
-
- def installed(key):
- if is_regexp:
- if with_version:
- t = self.settings.vartree.dbapi.cpv_all()
- else:
- t = self.settings.vartree.dbapi.cp_all()
-
- if key:
- t = filter(lambda x: re.match(key, x, re.I), t)
-
- return t
- else:
- return self.settings.vartree.dbapi.match(key)
-
- def tree(key):
- if is_regexp:
- if with_version:
- t = self.settings.porttree.dbapi.cpv_all()
- else:
- t = self.settings.porttree.dbapi.cp_all()
-
- if key:
- t = filter(lambda x: re.match(key, x, re.I), t)
-
- elif masked:
- t = self.settings.porttree.dbapi.xmatch("match-all", key)
- else:
- t = self.settings.porttree.dbapi.match(key)
-
- return t
-
- def all(key):
- return unique_array(installed(key)+tree(key))
-
- def uninstalled (key):
- alist = set(all(key))
- inst = set(installed(key))
- return list(alist - inst)
-
- def world (key):
- with open(portage.WORLD_FILE) as f:
- for cp in f:
- cp = cp.strip()
- if cp and cp[0] != "#":
- 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)
-
- def system (key):
- 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 = {
- self.SET_ALL : all,
- self.SET_INSTALLED : installed,
- self.SET_UNINSTALLED : uninstalled,
- self.SET_TREE : tree,
- "world" : world,
- "system" : system
- }
-
+ def _get_set (self, pkgSet):
pkgSet = pkgSet.lower()
- if pkgSet == "": pkgSet = "all"
-
- func = funcmap[pkgSet]
-
- try:
- t = func(key)
- # catch the "ambigous package" Exception
- except ValueError, e:
- if isinstance(e[0], list):
- t = []
- for cp in e[0]:
- t += func(cp)
- else:
- raise
+ if pkgSet == "": pkgSet = self.SET_ALL
- # Make the list of packages unique
- t = unique_array(t)
+ return self.setmap[pkgSet]()
- return self.geneticize_list(t, only_cpv or not with_version)
+ def find_packages (self, key = "", pkgSet = SystemInterface.SET_ALL, masked = False, with_version = True, only_cpv = False):
+ return self.geneticize_list(self._get_set(pkgSet).find(key, masked, with_version, only_cpv), only_cpv or not with_version)
def list_categories (self, name = None):
categories = self.settings.settings.categories