Add --rebuilt-binaries-timestamp option
authorSebastian Luther <SebastianLuther@gmx.de>
Thu, 8 Apr 2010 05:59:15 +0000 (07:59 +0200)
committerZac Medico <zmedico@gentoo.org>
Thu, 27 May 2010 10:52:06 +0000 (03:52 -0700)
This option makes emerge ignore binaries that would have been used
for --rebuilt-binaries, if they are older than the given timestamp.
Binaries are only reinstalled if they have a newer BUILD_TIME than
the installed package (not only unequal) with this option.

man/emerge.1
pym/_emerge/depgraph.py
pym/_emerge/main.py

index e717c9821ce7299f7c7f0355dba71285bf61af53..d1b73778c0a143caec793032bc8ce6be542dee07 100644 (file)
@@ -504,6 +504,13 @@ automatically when using binary packages
 (\fB\-\-usepkgonly\fR or \fB\-\-getbinpkgonly\fR) together with
 \fB\-\-update\fR and \fB\-\-deep\fR.
 .TP
+.BR "\-\-rebuilt\-binaries\-timestamp[=TIMESTAMP]"
+This option modifies emerge's behaviour only if
+\fB\-\-rebuilt\-binaries\fR is given. Only binaries that
+have a BUILD_TIME that is larger than the given TIMESTAMP
+and that is larger than that of the installed package will
+be considered by the rebuilt\-binaries logic.
+.TP
 .BR "\-\-reinstall changed\-use"
 Tells emerge to include installed packages where USE flags have
 changed since installation.  Unlike \fB\-\-newuse\fR, this option does
index 5a7d2b7616c26efe780960fec7e19d099333c81c..ae7b2113393b919d7c8d03aba110a38bda00e5f3 100644 (file)
@@ -2771,10 +2771,28 @@ class depgraph(object):
                                        # non-empty, in order to avoid cases like to
                                        # bug #306659 where BUILD_TIME fields are missing
                                        # in local and/or remote Packages file.
-                                       if built_pkg.metadata['BUILD_TIME'] and \
-                                               (built_pkg.metadata['BUILD_TIME'] != \
-                                               inst_pkg.metadata['BUILD_TIME']):
-                                               return built_pkg, built_pkg
+                                       try:
+                                               built_timestamp = int(built_pkg.metadata['BUILD_TIME'])
+                                       except (KeyError, ValueError):
+                                               built_timestamp = 0
+
+                                       try:
+                                               installed_timestamp = int(inst_pkg.metadata['BUILD_TIME'])
+                                       except (KeyError, ValueError):
+                                               installed_timestamp = 0
+
+                                       if "--rebuilt-binaries-timestamp" in self._frozen_config.myopts:
+                                               minimal_timestamp = self._frozen_config.myopts["--rebuilt-binaries-timestamp"]
+                                               if built_timestamp > installed_timestamp and \
+                                                       built_timestamp >= minimal_timestamp:
+                                                       return built_pkg, built_pkg
+                                       else:
+                                               #Don't care if the binary has an older BUILD_TIME than the installed
+                                               #package. This is for closely tracking a binhost.
+                                               #Use --rebuilt-binaries-timestamp 0 if you want only newer binaries
+                                               #pulled in here.
+                                               if built_timestamp != installed_timestamp:
+                                                       return built_pkg, built_pkg
 
                        if avoid_update:
                                for pkg in matched_packages:
index ca3d17beed1eaf8a90ef87b6188d9cb618231c09..fa2dbaa12cf8c7fe15f47686a0a8b8d640f36d4c 100644 (file)
@@ -637,6 +637,12 @@ def parse_opts(tmpcmdline, silent=False):
                        "type"     : "choice",
                        "choices"  : ("True", "n")
                },
+               
+               "--rebuilt-binaries-timestamp": {
+                       "help"   : "use only binaries that are newer than this " + \
+                                  "timestamp for --rebuilt-binaries",
+                       "action" : "store"
+               },
 
                "--root": {
                 "help"   : "specify the target root filesystem for merging packages",
@@ -855,6 +861,20 @@ def parse_opts(tmpcmdline, silent=False):
                                        (myoptions.load_average,), noiselevel=-1)
 
                myoptions.load_average = load_average
+       
+       if myoptions.rebuilt_binaries_timestamp:
+               try:
+                       rebuilt_binaries_timestamp = int(myoptions.rebuilt_binaries_timestamp)
+               except ValueError:
+                       rebuilt_binaries_timestamp = -1
+
+               if rebuilt_binaries_timestamp < 0:
+                       rebuilt_binaries_timestamp = 0
+                       if not silent:
+                               writemsg("!!! Invalid --rebuilt-binaries-timestamp parameter: '%s'\n" % \
+                                       (myoptions.rebuilt_binaries_timestamp,), noiselevel=-1)
+
+               myoptions.rebuilt_binaries_timestamp = rebuilt_binaries_timestamp
 
        if myoptions.use_ebuild_visibility in ("True",):
                myoptions.use_ebuild_visibility = True