Implement a new @live-ebuilds which is generated from installed packages
authorZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 05:45:56 +0000 (05:45 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 05:45:56 +0000 (05:45 -0000)
that inherit from know live eclasses such as cvs, darcs, git, mercurial,
and subversion. The list of eclasses is controlled by an "inherits"
attribute that is configure in sets.conf for and instance of InheritSet.
This set serves a purpose similar to the -scm ebuild suffix that has
been proposed in GLEP 54.

svn path=/main/trunk/; revision=11292

cnf/sets.conf
pym/portage/sets/dbapi.py

index f422f5004c0970c8509f637de1a6ce9fa60117d8..13c09a366f2cacd4b93a7f841286cec2c30898f2 100644 (file)
@@ -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"
index 5352a32f3e444896733a1074218a8e9d0aacc46a..c31db554298faefe26815d81bb40ab4c3b946e99 100644 (file)
@@ -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"]