summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man/emerge.19
-rw-r--r--pym/_emerge/depgraph.py37
-rw-r--r--pym/_emerge/help.py11
-rw-r--r--pym/_emerge/main.py11
4 files changed, 62 insertions, 6 deletions
diff --git a/man/emerge.1 b/man/emerge.1
index 572002d3d..73c90d3fd 100644
--- a/man/emerge.1
+++ b/man/emerge.1
@@ -284,6 +284,15 @@ acceptance of the first choice. This option is
intended to be set in the \fBmake.conf\fR(5)
\fBEMERGE_DEFAULT_OPTS\fR variable.
.TP
+.BR "\-\-autounmask[=n]"
+Automatically unmask packages. If any configuration
+changes are required, then they will be displayed
+after the merge list and emerge will immediately
+abort. If the displayed configuration changes are
+satisfactory, you should copy and paste them into
+the specified configuration file(s). Currently,
+this only works for unstable KEYWORDS masks.
+.TP
.BR \-\-backtrack=COUNT
Specifies an integer number of times to backtrack if
dependency calculation fails due to a conflict or an
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index 056c7bdb5..05c108592 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -2483,15 +2483,40 @@ class depgraph(object):
self._dynamic_config._visible_pkgs[pkg.root].cpv_inject(pkg)
return ret
+ def _want_installed_pkg(self, pkg):
+ """
+ Given an installed package returned from select_pkg, return
+ True if the user has not explicitly requested for this package
+ to be replaced (typically via an atom on the command line).
+ """
+ if "selective" not in self._dynamic_config.myparams and \
+ pkg.root == self._frozen_config.target_root:
+ try:
+ next(self._iter_atoms_for_pkg(pkg))
+ except StopIteration:
+ pass
+ except portage.exception.InvalidDependString:
+ pass
+ else:
+ return False
+ return True
+
def _select_pkg_highest_available_imp(self, root, atom, onlydeps=False):
pkg, existing = self._wrapped_select_pkg_highest_available_imp(root, atom, onlydeps=onlydeps)
- if pkg is None:
- pkg, existing = self._wrapped_select_pkg_highest_available_imp(root, atom, \
- onlydeps=onlydeps, allow_missing_keywords=True)
-
- if pkg is not None and not pkg.visible:
- self._dynamic_config._needed_user_config_changes.setdefault(pkg, set()).add("unstable keyword")
+ if self._frozen_config.myopts.get('--autounmask', 'n') is True:
+ if pkg is not None and \
+ pkg.installed and \
+ not self._want_installed_pkg(pkg):
+ pkg = None
+ if pkg is None:
+ pkg, existing = \
+ self._wrapped_select_pkg_highest_available_imp(
+ root, atom, onlydeps=onlydeps,
+ allow_missing_keywords=True)
+
+ if pkg is not None and not pkg.visible:
+ self._dynamic_config._needed_user_config_changes.setdefault(pkg, set()).add("unstable keyword")
return pkg, existing
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py
index 43e9794ed..72bb56d41 100644
--- a/pym/_emerge/help.py
+++ b/pym/_emerge/help.py
@@ -291,6 +291,17 @@ def help(myopts, havecolor=1):
"EMERGE_DEFAULT_OPTS variable."
for line in wrap(desc, desc_width):
print(desc_indent + line)
+ print()
+ print(" " + green("--autounmask") + "[=%s]" % turquoise("n"))
+ desc = "Automatically unmask packages. If any configuration " + \
+ "changes are required, then they will be displayed " + \
+ "after the merge list and emerge will immediately " + \
+ "abort. If the displayed configuration changes are " + \
+ "satisfactory, you should copy and paste them into " + \
+ "the specified configuration file(s). Currently, " + \
+ "this only works for unstable KEYWORDS masks."
+ for line in wrap(desc, desc_width):
+ print(desc_indent + line)
print()
print(" " + green("--backtrack") + " " + turquoise("COUNT"))
desc = "Specifies an integer number of times to backtrack if " + \
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py
index b2bb362f8..92df3bfb4 100644
--- a/pym/_emerge/main.py
+++ b/pym/_emerge/main.py
@@ -388,6 +388,7 @@ def insert_optional_args(args):
new_args = []
default_arg_opts = {
+ '--autounmask' : ('n',),
'--complete-graph' : ('n',),
'--deep' : valid_integers,
'--depclean-lib-check' : ('n',),
@@ -515,6 +516,13 @@ def parse_opts(tmpcmdline, silent=False):
longopt_aliases = {"--cols":"--columns", "--skip-first":"--skipfirst"}
argument_options = {
+
+ "--autounmask": {
+ "help" : "automatically unmask packages",
+ "type" : "choice",
+ "choices" : ("True", "n")
+ },
+
"--accept-properties": {
"help":"temporarily override ACCEPT_PROPERTIES",
"action":"store"
@@ -735,6 +743,9 @@ def parse_opts(tmpcmdline, silent=False):
myoptions, myargs = parser.parse_args(args=tmpcmdline)
+ if myoptions.autounmask in ("True",):
+ myoptions.autounmask = True
+
if myoptions.changed_use is not False:
myoptions.reinstall = "changed-use"
myoptions.changed_use = False