- outsource logic for boolean options into a central function
authorMarius Mauch <genone@gentoo.org>
Tue, 19 Feb 2008 07:36:49 +0000 (07:36 -0000)
committerMarius Mauch <genone@gentoo.org>
Tue, 19 Feb 2008 07:36:49 +0000 (07:36 -0000)
- enable support for greedy behavior in StaticFileSet

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

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

index 5f82b69b7492fd12db45526af163211b0c510e07..39cebdf842bd8b9a60784ae6208baecd1edae306 100644 (file)
@@ -9,6 +9,16 @@ from portage.const import USER_CONFIG_PATH, GLOBAL_CONFIG_PATH
 
 SETPREFIX = "@"
 
+def get_boolean(options, name, default):
+       if not name in options:
+               return default
+       elif options[name].lower() in ("1", "yes", "on", "true"):
+               return True
+       elif options[name].lower() in ("0", "no", "off", "false"):
+               return False
+       else:
+               raise SetConfigError("invalid value '%s' for option '%s'" % (options[name], name))
+
 class SetConfigError(Exception):
        pass
 
index 220ff2283498a44fc5c27d7c5b2b9178b3fad581..c4f974aa9fcfe0bb3ff47c9fac70b00b1ecd0865 100644 (file)
@@ -4,7 +4,7 @@
 
 from portage.versions import catsplit, catpkgsplit
 from portage.sets.base import PackageSet
-from portage.sets import SetConfigError
+from portage.sets import SetConfigError, get_boolean
 from portage.dbapi.vartree import dblink
 from portage.util import grabfile
 
@@ -65,10 +65,7 @@ class CategorySet(PackageSet):
        _builderGetRepository = classmethod(_builderGetRepository)
 
        def _builderGetVisible(cls, options):
-               visible = options.get("only_visible", "true").lower()
-               if visible not in ["1", "0", "yes", "no", "true", "false", "on", "off"]:
-                       raise SetConfigError("invalid value for only_visible: %s" % visible)
-               return bool(visible in ["1", "yes", "true", "on"])
+               return get_boolean(options, "only_visible", True)
        _builderGetVisible = classmethod(_builderGetVisible)
                
        def singleBuilder(cls, options, settings, trees):
@@ -176,9 +173,6 @@ class MissingLibraryConsumerSet(LibraryConsumerSet):
                self._setAtoms(self.mapPathsToAtoms(consumers))
        
        def singleBuilder(cls, options, settings, trees):
-               if options.get("debug", "true").lower() in ["true", "on", "1", "yes"]:
-                       debug = True
-               else:
-                       debug = False
+               debug = get_boolean(options, "debug", False)
                return MissingLibraryConsumerSet(trees["vartree"].dbapi, debug=debug)
        singleBuilder = classmethod(singleBuilder)
index c6a6f74302fdb95bf778dcab1ab4ef8a678e1a08..cc4862cc8b2021fd9d366e86229f196acb91bc34 100644 (file)
@@ -11,7 +11,7 @@ from portage.const import PRIVATE_PATH, USER_CONFIG_PATH
 from portage.locks import lockfile, unlockfile
 from portage import portage_gid
 from portage.sets.base import PackageSet, EditablePackageSet
-from portage.sets import SetConfigError, SETPREFIX
+from portage.sets import SetConfigError, SETPREFIX, get_boolean
 from portage.env.loaders import ItemFileLoader, KeyListFileLoader
 from portage.env.validators import ValidAtomValidator
 from portage import dep_getkey, cpv_getkey
@@ -21,12 +21,17 @@ __all__ = ["StaticFileSet", "ConfigFileSet", "WorldSet"]
 class StaticFileSet(EditablePackageSet):
        _operations = ["merge", "unmerge"]
        
-       def __init__(self, filename):
+       def __init__(self, filename, greedy=False, dbapi=None):
                super(StaticFileSet, self).__init__()
                self._filename = filename
                self._mtime = None
                self.description = "Package set loaded from file %s" % self._filename
                self.loader = ItemFileLoader(self._filename, self._validate)
+               if greedy and not dbapi:
+                       self.errors.append("%s configured as greedy set, but no dbapi instance passed in constructor" % self._filename)
+                       greedy = False
+               self.greedy = greedy
+               self.dbapi = dbapi
 
                metadata = grabfile(self._filename + ".metadata")
                key = None
@@ -70,13 +75,25 @@ class StaticFileSet(EditablePackageSet):
                                        raise
                                del e
                                data = {}
-                       self._setAtoms(data.keys())
+                       if self.greedy:
+                               atoms = []
+                               for a in data.keys():
+                                       matches = self.dbapi.match(a)
+                                       if len(matches) > 1:
+                                               for cpv in matches:
+                                                       atoms.append(dep_getkey(cpv)+":"+self.dbapi.aux_get(cpv, ["SLOT"])[0])
+                                       else:
+                                               atoms.append(a)
+                       else:
+                               atoms = data.keys()
+                       self._setAtoms(atoms)
                        self._mtime = mtime
                
        def singleBuilder(self, options, settings, trees):
                if not "filename" in options:
                        raise SetConfigError("no filename specified")
-               return ConfigFileSet(options[filename])
+               greedy = get_boolean(options, "greedy", True)
+               return StaticFileSet(options["filename"], greedy=greedy, dbapi=trees["vartree"].dbapi)
        singleBuilder = classmethod(singleBuilder)
        
        def multiBuilder(self, options, settings, trees):
@@ -85,13 +102,14 @@ class StaticFileSet(EditablePackageSet):
                name_pattern = options.get("name_pattern", "sets/$name")
                if not "$name" in name_pattern and not "${name}" in name_pattern:
                        raise SetConfigError("name_pattern doesn't include $name placeholder")
+               greedy = get_boolean(options, "greedy", True)
                if os.path.isdir(directory):
                        for filename in os.listdir(directory):
                                if filename.endswith(".metadata"):
                                        continue
                                myname = name_pattern.replace("$name", filename)
                                myname = myname.replace("${name}", filename)
-                               rValue[myname] = StaticFileSet(os.path.join(directory, filename))
+                               rValue[myname] = StaticFileSet(os.path.join(directory, filename), greedy=greedy, dbapi=trees["vartree"].dbapi)
                return rValue
        multiBuilder = classmethod(multiBuilder)
        
@@ -109,7 +127,7 @@ class ConfigFileSet(PackageSet):
        def singleBuilder(self, options, settings, trees):
                if not "filename" in options:
                        raise SetConfigError("no filename specified")
-               return ConfigFileSet(options[filename])
+               return ConfigFileSet(options["filename"])
        singleBuilder = classmethod(singleBuilder)
        
        def multiBuilder(self, options, settings, trees):
index f93b34ef88fc74d4eccc88c0216a8d6eb4f38582..928fecbcfb68f08a0b7dcbba15a00b6ee7582d86 100644 (file)
@@ -7,6 +7,7 @@ import portage.glsa as glsa
 from portage.util import grabfile, write_atomic
 from portage.sets.base import PackageSet
 from portage.versions import catpkgsplit, pkgcmp
+from portage.sets import get_boolean
 
 __all__ = ["SecuritySet", "NewGlsaSet", "NewAffectedSet", "AffectedSet"]
 
@@ -69,11 +70,7 @@ class SecuritySet(PackageSet):
                                myglsa.inject()
        
        def singleBuilder(cls, options, settings, trees):
-               if "use_emerge_resoler" in options \
-                               and options.get("use_emerge_resolver").lower() in ["1", "yes", "true", "on"]:
-                       least_change = False
-               else:
-                       least_change = True
+               least_change = not get_boolean(options, "use_emerge_resolver", False)
                return cls(settings, trees["vartree"].dbapi, trees["porttree"].dbapi, least_change=least_change)
        singleBuilder = classmethod(singleBuilder)