Add @rebuilt-binaries set which uses BUILD_TIME to pull in binary packages
authorZac Medico <zmedico@gentoo.org>
Wed, 17 Feb 2010 05:30:40 +0000 (05:30 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 17 Feb 2010 05:30:40 +0000 (05:30 -0000)
that have a different build time from a currently installed package of the
exact same version.

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

cnf/sets.conf
pym/_emerge/depgraph.py
pym/_emerge/main.py
pym/portage/sets/dbapi.py

index 46c86e7506f4b1e91e4279d4d85fde59efa94aba..87280cef631eb83ba0db6cf57c90e0017e139020 100644 (file)
@@ -65,6 +65,12 @@ class = portage.sets.dbapi.OwnerSet
 world-candidate = False
 files = %(ROOT)slib/modules
 
+# Binary packages that have a different build time from a currently
+# installed package of the exact same version.
+[rebuilt-binaries]
+class = portage.sets.dbapi.RebuiltBinaries
+world-candidate = False
+
 # Installed packages for which the highest visible ebuild
 # version is lower than the currently installed version.
 [downgrade]
index 7a4872424757d2cf801fcc69a5b35404d52b3d9c..38a48d6fe1b5c0fdc769ea281f81c3acfdfa244c 100644 (file)
@@ -229,11 +229,6 @@ class _dynamic_depgraph_config(object):
                                ]["vartree"].dbapi._aux_cache_keys)
                        dbs.append((vardb, "installed", True, True, db_keys))
                        self._filtered_trees[myroot]["dbs"] = dbs
-                       if "--usepkg" in depgraph._frozen_config.myopts:
-                               depgraph._frozen_config._trees_orig[myroot
-                                       ]["bintree"].populate(
-                                       "--getbinpkg" in depgraph._frozen_config.myopts,
-                                       "--getbinpkgonly" in depgraph._frozen_config.myopts)
 
 class depgraph(object):
 
index f66b0bb5c4044e60488a075e1810d6aa36bb2cad..f96654eeabd88cc4fc14033eb3203ecea847be68 100644 (file)
@@ -1208,10 +1208,43 @@ def emerge_main():
                config_protect_check(trees)
        check_procfs()
 
+       if "getbinpkg" in settings.features:
+               myopts["--getbinpkg"] = True
+
+       if "--getbinpkgonly" in myopts:
+               myopts["--getbinpkg"] = True
+
+       if "--getbinpkgonly" in myopts:
+               myopts["--usepkgonly"] = True
+
+       if "--getbinpkg" in myopts:
+               myopts["--usepkg"] = True
+
+       if "--usepkgonly" in myopts:
+               myopts["--usepkg"] = True
+
+       if "buildpkg" in settings.features or "--buildpkgonly" in myopts:
+               myopts["--buildpkg"] = True
+
+       if "--buildpkgonly" in myopts:
+               # --buildpkgonly will not merge anything, so
+               # it cancels all binary package options.
+               for opt in ("--getbinpkg", "--getbinpkgonly",
+                       "--usepkg", "--usepkgonly"):
+                       myopts.pop(opt, None)
+
        for mytrees in trees.values():
                mydb = mytrees["porttree"].dbapi
                # Freeze the portdbapi for performance (memoize all xmatch results).
                mydb.freeze()
+
+               if "--usepkg" in myopts:
+                       # Populate the bintree with current --getbinpkg setting.
+                       # This needs to happen before expand_set_arguments(), in case
+                       # any sets use the bintree.
+                       mytrees["bintree"].populate(
+                               getbinpkgs="--getbinpkg" in myopts)
+
        del mytrees, mydb
 
        if "moo" in myfiles:
@@ -1270,42 +1303,12 @@ def emerge_main():
                spinner.update = spinner.update_quiet
                portage.util.noiselimit = -1
 
-       # Always create packages if FEATURES=buildpkg
-       # Imply --buildpkg if --buildpkgonly
-       if ("buildpkg" in settings.features) or ("--buildpkgonly" in myopts):
-               if "--buildpkg" not in myopts:
-                       myopts["--buildpkg"] = True
-
-       # Always try and fetch binary packages if FEATURES=getbinpkg
-       if ("getbinpkg" in settings.features):
-               myopts["--getbinpkg"] = True
-
-       if "--buildpkgonly" in myopts:
-               # --buildpkgonly will not merge anything, so
-               # it cancels all binary package options.
-               for opt in ("--getbinpkg", "--getbinpkgonly",
-                       "--usepkg", "--usepkgonly"):
-                       myopts.pop(opt, None)
-
        if "--fetch-all-uri" in myopts:
                myopts["--fetchonly"] = True
 
        if "--skipfirst" in myopts and "--resume" not in myopts:
                myopts["--resume"] = True
 
-       if ("--getbinpkgonly" in myopts) and not ("--usepkgonly" in myopts):
-               myopts["--usepkgonly"] = True
-
-       if ("--getbinpkgonly" in myopts) and not ("--getbinpkg" in myopts):
-               myopts["--getbinpkg"] = True
-
-       if ("--getbinpkg" in myopts) and not ("--usepkg" in myopts):
-               myopts["--usepkg"] = True
-
-       # Also allow -K to apply --usepkg/-k
-       if ("--usepkgonly" in myopts) and not ("--usepkg" in myopts):
-               myopts["--usepkg"] = True
-
        # Allow -p to remove --ask
        if "--pretend" in myopts:
                myopts.pop("--ask", None)
index a5d7c715368cb6a303dc25a1edae9a82d603a76f..3ece6f642cf30d62ef106d06b338532976363a53 100644 (file)
@@ -21,7 +21,7 @@ class EverythingSet(PackageSet):
                "atoms to match all installed packages"
        _filter = None
 
-       def __init__(self, vdbapi):
+       def __init__(self, vdbapi, **kwargs):
                super(EverythingSet, self).__init__()
                self._db = vdbapi
 
@@ -313,3 +313,26 @@ class AgeSet(EverythingSet):
                return AgeSet(vardb=trees["vartree"].dbapi, mode=mode, age=age)
 
        singleBuilder = classmethod(singleBuilder)
+
+class RebuiltBinaries(EverythingSet):
+       _operations = ('merge',)
+       _aux_keys = ('BUILD_TIME',)
+
+       def __init__(self, vardb, bindb=None):
+               super(RebuiltBinaries, self).__init__(vardb, bindb=bindb)
+               self._bindb = bindb
+
+       def _filter(self, atom):
+               cpv = self._db.match(atom)[0]
+               inst_build_time, = self._db.aux_get(cpv, self._aux_keys)
+               try:
+                       bin_build_time, = self._bindb.aux_get(cpv, self._aux_keys)
+               except KeyError:
+                       return False
+               return inst_build_time != bin_build_time
+
+       def singleBuilder(cls, options, settings, trees):
+               return RebuiltBinaries(trees["vartree"].dbapi,
+                       bindb=trees["bintree"].dbapi)
+
+       singleBuilder = classmethod(singleBuilder)