diff options
-rw-r--r-- | cnf/sets.conf | 6 | ||||
-rw-r--r-- | pym/portage/sets/dbapi.py | 39 |
2 files changed, 44 insertions, 1 deletions
diff --git a/cnf/sets.conf b/cnf/sets.conf index f422f5004..13c09a366 100644 --- a/cnf/sets.conf +++ b/cnf/sets.conf @@ -41,3 +41,9 @@ directory = /etc/portage/sets [preserved-rebuild] class = portage.sets.libs.PreservedLibraryConsumerSet world-candidate = False + +# Installed ebuilds that inherit from known live eclasses. +[live-ebuilds] +class = portage.sets.dbapi.InheritSet +world-candidate = False +inherits = "cvs darcs git mercurial subversion" diff --git a/pym/portage/sets/dbapi.py b/pym/portage/sets/dbapi.py index 5352a32f3..c31db5542 100644 --- a/pym/portage/sets/dbapi.py +++ b/pym/portage/sets/dbapi.py @@ -6,7 +6,7 @@ from portage.versions import catsplit from portage.sets.base import PackageSet from portage.sets import SetConfigError, get_boolean -__all__ = ["CategorySet", "EverythingSet"] +__all__ = ["CategorySet", "EverythingSet", "InheritSet"] class EverythingSet(PackageSet): _operations = ["merge", "unmerge"] @@ -32,6 +32,43 @@ class EverythingSet(PackageSet): return EverythingSet(trees["vartree"].dbapi) singleBuilder = classmethod(singleBuilder) +class InheritSet(PackageSet): + + _operations = ["merge", "unmerge"] + + description = "Package set which contains all packages " + \ + "that inherit one or more specific eclasses." + + def __init__(self, vardb=None, inherits=None): + super(InheritSet, self).__init__() + self._db = vardb + self._inherits = inherits + + def load(self): + atoms = [] + inherits = self._inherits + cp_list = self._db.cp_list + aux_get = self._db.aux_get + aux_keys = ["INHERITED", "SLOT"] + for cp in self._db.cp_all(): + for cpv in cp_list(cp): + inherited, slot = aux_get(cpv, aux_keys) + inherited = inherited.split() + if inherits.intersection(inherited): + atoms.append("%s:%s" % (cp, slot)) + + self._setAtoms(atoms) + + def singleBuilder(cls, options, settings, trees): + if not "inherits" in options: + raise SetConfigError("no inherits given") + + inherits = options["inherits"] + return cls(vardb=trees["vartree"].dbapi, + inherits=frozenset(inherits.split())) + + singleBuilder = classmethod(singleBuilder) + class CategorySet(PackageSet): _operations = ["merge", "unmerge"] |