diff options
-rw-r--r-- | man/emerge.1 | 9 | ||||
-rw-r--r-- | pym/_emerge/depgraph.py | 37 | ||||
-rw-r--r-- | pym/_emerge/help.py | 11 | ||||
-rw-r--r-- | pym/_emerge/main.py | 11 |
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 |