summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--man/emerge.17
-rw-r--r--pym/_emerge/depgraph.py23
-rw-r--r--pym/_emerge/help.py9
-rw-r--r--pym/_emerge/main.py12
4 files changed, 49 insertions, 2 deletions
diff --git a/man/emerge.1 b/man/emerge.1
index 47149061..6c2727de 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -477,6 +477,13 @@ output from portage's displays.
Redirect all build output to logs alone, and do not
display it on stdout.
.TP
+.BR "\-\-rebuilt\-binaries[=n]"
+Replace installed packages with binary packages that have
+been rebuilt. Rebuilds are detected by comparison of
+BUILD_TIME package metadata. This option is enabled
+automatically when using binary packages (see
+\fB\-\-usepkg\fR and \fB\-\-getbinpkg\fR).
+.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
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 38a48d6f..ac6744a6 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -2396,6 +2396,9 @@ class depgraph(object):
atom_set = InternalPackageSet(initial_atoms=(atom,))
existing_node = None
myeb = None
+ usepkg = "--usepkg" in self._frozen_config.myopts
+ rebuilt_binaries = usepkg and \
+ self._frozen_config.myopts.get('--rebuilt-binaries') != 'n'
usepkgonly = "--usepkgonly" in self._frozen_config.myopts
empty = "empty" in self._dynamic_config.myparams
selective = "selective" in self._dynamic_config.myparams
@@ -2615,10 +2618,26 @@ class depgraph(object):
if pkg.cp == cp]
break
+ if existing_node is not None and \
+ existing_node in matched_packages:
+ return existing_node, existing_node
+
if len(matched_packages) > 1:
+ if rebuilt_binaries:
+ inst_pkg = None
+ built_pkg = None
+ for pkg in matched_packages:
+ if pkg.installed:
+ inst_pkg = pkg
+ elif pkg.built:
+ built_pkg = pkg
+ if built_pkg is not None and inst_pkg is not None:
+ if built_pkg >= inst_pkg and \
+ built_pkg.metadata['BUILD_TIME'] != \
+ inst_pkg.metadata['BUILD_TIME']:
+ return built_pkg, built_pkg
+
if avoid_update:
- if existing_node is not None:
- return existing_node, existing_node
for pkg in matched_packages:
if pkg.installed:
return pkg, existing_node
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py
index 88b818cf..a30b6dad 100644
--- a/pym/_emerge/help.py
+++ b/pym/_emerge/help.py
@@ -506,6 +506,15 @@ def help(myopts, havecolor=1):
for line in wrap(desc, desc_width):
print(desc_indent + line)
print()
+ print(" "+green("--rebuilt-binaries[=n]"))
+ desc = "Replace installed packages with binary packages that have " + \
+ "been rebuilt. Rebuilds are detected by comparison of " + \
+ "BUILD_TIME package metadata. This option is enabled " + \
+ "automatically when using binary packages (see " + \
+ "--usepkg and --getbinpkg)."
+ for line in wrap(desc, desc_width):
+ print(desc_indent + line)
+ print()
print(" "+green("--reinstall ") + turquoise("changed-use"))
print(" Tells emerge to include installed packages where USE flags have")
print(" changed since installation. Unlike --newuse, this option does")
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index f96654ee..a92ae035 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -395,6 +395,7 @@ def insert_optional_args(args):
'--getbinpkgonly' : ('n',),
'--jobs' : valid_integers,
'--keep-going' : ('n',),
+ '--rebuilt-binaries' : ('n',),
'--root-deps' : ('rdeps',),
'--select' : ('n',),
'--selective' : ('n',),
@@ -620,6 +621,13 @@ def parse_opts(tmpcmdline, silent=False):
"choices" : ("True", "n")
},
+ "--rebuilt-binaries": {
+ "help" : "replace installed packages with binary " + \
+ "packages that have been rebuilt",
+ "type" : "choice",
+ "choices" : ("True", "n")
+ },
+
"--root": {
"help" : "specify the target root filesystem for merging packages",
"action" : "store"
@@ -732,6 +740,10 @@ def parse_opts(tmpcmdline, silent=False):
else:
myoptions.keep_going = None
+ if myoptions.rebuilt_binaries in ("True",):
+ # The depgraph will enable this by default unless 'n' is specified.
+ myoptions.rebuilt_binaries = None
+
if myoptions.root_deps == "True":
myoptions.root_deps = True