summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cnf/sets.conf6
-rw-r--r--pym/portage/sets/dbapi.py39
2 files changed, 44 insertions, 1 deletions
diff --git a/cnf/sets.conf b/cnf/sets.conf
index f422f500..13c09a36 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 5352a32f..c31db554 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"]