Add a new @module-rebuild set which emulates the behavior of the
authorZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 06:11:18 +0000 (06:11 -0000)
committerZac Medico <zmedico@gentoo.org>
Thu, 31 Jul 2008 06:11:18 +0000 (06:11 -0000)
module-rebuild tool. The /lib/modules path is set in sets.conf
via a "files" attribute of an OwnerSet instance. This can be easily
used to define similar sets based on paths on installed files.

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

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

index 13c09a366f2cacd4b93a7f841286cec2c30898f2..9f08c50a5330c1783d25206435cd864b6aebdb42 100644 (file)
@@ -47,3 +47,9 @@ world-candidate = False
 class = portage.sets.dbapi.InheritSet
 world-candidate = False
 inherits = "cvs darcs git mercurial subversion"
+
+# Installed packages that own files inside /lib/modules.
+[module-rebuild]
+class = portage.sets.dbapi.OwnerSet
+world-candidate = False
+files = /lib/modules
index c31db554298faefe26815d81bb40ab4c3b946e99..66c014272baa0240ee6450912c30c8496a989fd6 100644 (file)
@@ -2,7 +2,7 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
-from portage.versions import catsplit
+from portage.versions import catpkgsplit, catsplit
 from portage.sets.base import PackageSet
 from portage.sets import SetConfigError, get_boolean
 
@@ -32,6 +32,42 @@ class EverythingSet(PackageSet):
                return EverythingSet(trees["vartree"].dbapi)
        singleBuilder = classmethod(singleBuilder)
 
+class OwnerSet(PackageSet):
+
+       _operations = ["merge", "unmerge"]
+
+       description = "Package set which contains all packages " + \
+               "that own one or more files."
+
+       def __init__(self, vardb=None, files=None):
+               super(OwnerSet, self).__init__()
+               self._db = vardb
+               self._files = files
+
+       def mapPathsToAtoms(self, paths):
+               rValue = set()
+               vardb = self._db
+               aux_get = vardb.aux_get
+               aux_keys = ["SLOT"]
+               for link, p in vardb._owners.iter_owners(paths):
+                       cat, pn = catpkgsplit(link.mycpv)[:2]
+                       slot, = aux_get(link.mycpv, aux_keys)
+                       rValue.add("%s/%s:%s" % (cat, pn, slot))
+               return rValue
+
+       def load(self):
+               self._setAtoms(self.mapPathsToAtoms(self._files))
+
+       def singleBuilder(cls, options, settings, trees):
+               if not "files" in options:
+                       raise SetConfigError("no files given")
+
+               import shlex
+               return cls(vardb=trees["vartree"].dbapi,
+                       files=frozenset(shlex.split(options["files"])))
+
+       singleBuilder = classmethod(singleBuilder)
+
 class InheritSet(PackageSet):
 
        _operations = ["merge", "unmerge"]