summaryrefslogtreecommitdiff
path: root/portato/backend/portage/sets.py
diff options
context:
space:
mode:
Diffstat (limited to 'portato/backend/portage/sets.py')
-rw-r--r--portato/backend/portage/sets.py145
1 files changed, 145 insertions, 0 deletions
diff --git a/portato/backend/portage/sets.py b/portato/backend/portage/sets.py
new file mode 100644
index 0000000..7984d3d
--- /dev/null
+++ b/portato/backend/portage/sets.py
@@ -0,0 +1,145 @@
+# -*- coding: utf-8 -*-
+#
+# File: portato/backend/portage/sets.py
+# This file is part of the Portato-Project, a graphical portage-frontend.
+#
+# Copyright (C) 2008 René 'Necoro' Neumann
+# This is free software. You may redistribute copies of it under the terms of
+# the GNU General Public License version 2.
+# There is NO WARRANTY, to the extent permitted by law.
+#
+# Written by René 'Necoro' Neumann <necoro@necoro.net>
+
+from __future__ import absolute_import, with_statement
+
+import re
+
+import portage
+try:
+ import portage.dep as portage_dep
+except ImportError:
+ import portage_dep
+
+from .. import system
+from ...helper import debug
+
+class Set(object):
+
+ def get_pkgs(self, key, is_regexp, masked, with_version, only_cpv):
+ raise NotImplementedError
+
+ def find (self, key, masked = False, with_version = True, only_cpv = False):
+ if key is None: key = ""
+
+ is_regexp = key == "" or ("*" in key and key[0] not in ("*","=","<",">","~","!"))
+
+ try:
+ t = self.get_pkgs(key, is_regexp, masked, with_version, only_cpv)
+ # catch the "ambigous package" Exception
+ except ValueError, e:
+ if isinstance(e[0], list):
+ t = set()
+ for cp in e[0]:
+ t.update(self.get_pkgs(cp, is_regexp, masked, with_version, only_cpv))
+ else:
+ raise
+
+ return t
+
+class FilterSet (Set):
+
+ def get_list(self):
+ raise NotImplementedError
+
+ def get_pkgs (self, key, is_regexp, masked, with_version, only_cpv):
+ t = set()
+ for pkg in self.get_list():
+ if is_regexp:
+ if not re.match(key, pkg, re.I): continue
+
+ if not with_version:
+ t.add(portage_dep.dep_getkey(pkg))
+
+ t.add(system.find_best_match(pkg, only_cpv = True))
+
+ return t
+
+class PortageSet (FilterSet):
+ def __init__ (self, name):
+ FilterSet.__init__(self)
+ debug("Loading portage set '%s'", name)
+ self.portageSet = system.settings.setsconfig.getSets()[name]
+
+ def get_list(self):
+ return self.portageSet.getAtoms()
+
+class SystemSet (FilterSet):
+
+ def get_list(self):
+ for cp in system.settings.settings.packages:
+ if cp[0] == "*": yield cp[1:]
+
+class WorldSet (FilterSet):
+
+ def get_list(self):
+ with open(portage.WORLD_FILE) as f:
+ for cp in f:
+ cp = cp.strip()
+ if cp and cp[0] != "#":
+ yield cp
+
+class InstalledSet (Set):
+
+ def get_pkgs (self, key, is_regexp, masked, with_version, only_cpv):
+ if is_regexp:
+ if with_version:
+ t = system.settings.vartree.dbapi.cpv_all()
+ else:
+ t = system.settings.vartree.dbapi.cp_all()
+
+ if key:
+ t = filter(lambda x: re.match(key, x, re.I), t)
+
+ return set(t)
+ else:
+ return set(system.settings.vartree.dbapi.match(key))
+
+class TreeSet (Set):
+
+ def get_pkgs (self, key, is_regexp, masked, with_version, only_cpv):
+ if is_regexp:
+ if with_version:
+ t = system.settings.porttree.dbapi.cpv_all()
+ else:
+ t = system.settings.porttree.dbapi.cp_all()
+
+ if key:
+ t = filter(lambda x: re.match(key, x, re.I), t)
+
+ elif masked:
+ t = system.settings.porttree.dbapi.xmatch("match-all", key)
+ else:
+ t = system.settings.porttree.dbapi.match(key)
+
+ return set(t)
+
+class AllSet (Set):
+
+ def __init__ (self):
+ Set.__init__(self)
+ self.tree = TreeSet()
+ self.installed = InstalledSet()
+
+ def find (self, *args, **kwargs):
+ return self.tree.find(*args, **kwargs) | self.installed.find(*args, **kwargs)
+
+class UninstalledSet (Set):
+
+ def __init__ (self):
+ Set.__init__(self)
+ self.all = AllSet()
+ self.installed = InstalledSet()
+
+ def find (self, *args, **kwargs):
+ return self.all.find(*args, **kwargs) - self.installed.find(*args, **kwargs)
+