Add a set to group all consumers of missing libraries as a simple revdep-rebuild...
authorMarius Mauch <genone@gentoo.org>
Thu, 11 Oct 2007 05:59:11 +0000 (05:59 -0000)
committerMarius Mauch <genone@gentoo.org>
Thu, 11 Oct 2007 05:59:11 +0000 (05:59 -0000)
svn path=/main/trunk/; revision=8046

pym/portage/sets/__init__.py
pym/portage/sets/dbapi.py

index 124e6892443805e9b8020f05b94c4993b8dcb726..dc281dea3e5b94eb870c192d2c9b80d3910f227a 100644 (file)
@@ -268,7 +268,7 @@ def make_default_config(settings, trees):
        sc.set("user-sets", "multiset", "true")
 
        sc.add_section("rebuild-needed")
-       sc.set("rebuild-needed", "class", "portage.sets.dbapi.PreservedLibraryConsumerSet")
+       sc.set("rebuild-needed", "class", "portage.sets.dbapi.MissingLibraryConsumerSet")
        
        return sc
 
index ed333ce005aa0d43aa5330df126f681304d8ca02..fbff27054d3222f5d74dcf30134c0d640a1a240e 100644 (file)
@@ -5,6 +5,7 @@
 from portage.versions import catsplit, catpkgsplit
 from portage.sets import PackageSet, SetConfigError
 from portage.dbapi.vartree import dblink
+from portage.util import grabfile
 
 import os
 
@@ -109,32 +110,63 @@ class CategorySet(PackageSet):
                return rValue
        multiBuilder = classmethod(multiBuilder)
 
-class PreservedLibraryConsumerSet(PackageSet):
+class LibraryConsumerSet(PackageSet):
        _operations = ["merge", "unmerge"]
-       
+
        def __init__(self, vardbapi):
-               super(PreservedLibraryConsumerSet, self).__init__()
+               super(LibraryConsumerSet, self).__init__()
                self.dbapi = vardbapi
+
+       def mapPathsToAtoms(self, paths):
+               rValue = set()
+               for cpv in self.dbapi.cpv_all():
+                       mysplit = catsplit(cpv)
+                       link = dblink(mysplit[0], mysplit[1], myroot=self.dbapi.root, \
+                                       mysettings=self.dbapi.settings, treetype='vartree', \
+                                       vartree=self.dbapi.vartree)
+                       if paths.intersection(link.getcontents().keys()):
+                               rValue.add("/".join(catpkgsplit(cpv)[:2]))
+               return rValue
        
+
+class PreservedLibraryConsumerSet(LibraryConsumerSet):
        def load(self):
                reg = self.dbapi.plib_registry
                libmap = self.dbapi.libmap.get()
-               atoms = set()
                consumers = set()
                if reg:
                        for libs in reg.getPreservedLibs().values():
                                for lib in libs:
                                        paths = libmap.get(os.path.basename(lib), [])
                                        consumers.update(paths)
-               for cpv in self.dbapi.cpv_all():
-                       mysplit = catsplit(cpv)
-                       link = dblink(mysplit[0], mysplit[1], myroot=self.dbapi.root, \
-                                       mysettings=self.dbapi.settings, treetype='vartree', \
-                                       vartree=self.dbapi.vartree)
-                       if consumers.intersection(link.getcontents().keys()):
-                               atoms.add("/".join(catpkgsplit(cpv)[:2]))
-               self._setAtoms(atoms)
+               else:
+                       return
+               if not consumers:
+                       return
+               self._setAtoms(self.mapPathsToAtoms(consumers))
 
        def singleBuilder(cls, options, settings, trees):
                return PreservedLibraryConsumerSet(trees["vartree"].dbapi)
        singleBuilder = classmethod(singleBuilder)
+
+class MissingLibraryConsumerSet(LibraryConsumerSet):
+       _operations = ["merge", "unmerge"]
+       
+       def load(self):
+               atoms = set()
+               consumers = set()
+               for lib in self.dbapi.libmap.get():
+                       found=False
+                       for searchdir in grabfile(os.path.join(os.sep, self.dbapi.root, "etc/ld.so.conf")):
+                               if os.path.exists(os.path.join(searchdir, lib)):
+                                       found=True
+                                       break
+                       if not found:
+                               consumers.update(self.dbapi.libmap.get()[lib])
+               if not consumers:
+                       return
+               self._setAtoms(self.mapPathsToAtoms(consumers))
+       
+       def singleBuilder(cls, options, settings, trees):
+               return MissingLibraryConsumerSet(trees["vartree"].dbapi)
+       singleBuilder = classmethod(singleBuilder)