From 5a5cc64f36f0645e298ac349b96f8421c2a30350 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Thu, 18 Sep 2014 11:33:19 -0700 Subject: [PATCH] _backtrack_depgraph: fix bug #523048 This fixes _backtrack_depgraph to immediately report necessary REQUIRED_USE changes instead of discarding the graph. This is accomplished by replacing the depgraph.success_without_autounmask method with a new need_config_change method that accounts for both autounmask and REQUIRED_USE changes. X-Gentoo-Bug: 523048 X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=523048 --- pym/_emerge/depgraph.py | 11 +++++++---- pym/portage/tests/resolver/ResolverPlayground.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 6332733..e7ae720 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -421,6 +421,7 @@ class _dynamic_depgraph_config(object): self._buildpkgonly_deps_unsatisfied = False self._autounmask = depgraph._frozen_config.myopts.get('--autounmask') != 'n' self._success_without_autounmask = False + self._required_use_unsatisfied = False self._traverse_ignored_deps = False self._complete_mode = False self._slot_operator_deps = {} @@ -2461,6 +2462,7 @@ class depgraph(object): self._dynamic_config._unsatisfied_deps_for_display.append( ((pkg.root, atom), {"myparent" : dep.parent, "show_req_use" : pkg})) + self._dynamic_config._required_use_unsatisfied = True self._dynamic_config._skip_restart = True return 0 @@ -8390,8 +8392,9 @@ class depgraph(object): return self._dynamic_config._need_restart and \ not self._dynamic_config._skip_restart - def success_without_autounmask(self): - return self._dynamic_config._success_without_autounmask + def need_config_change(self): + return self._dynamic_config._success_without_autounmask or \ + self._dynamic_config._required_use_unsatisfied def autounmask_breakage_detected(self): try: @@ -8665,7 +8668,7 @@ def _backtrack_depgraph(settings, trees, myopts, myparams, myaction, myfiles, sp backtrack_parameters=backtrack_parameters) success, favorites = mydepgraph.select_files(myfiles) - if success or mydepgraph.success_without_autounmask(): + if success or mydepgraph.need_config_change(): break elif not allow_backtracking: break @@ -8677,7 +8680,7 @@ def _backtrack_depgraph(settings, trees, myopts, myparams, myaction, myfiles, sp else: break - if not (success or mydepgraph.success_without_autounmask()) and backtracked: + if not (success or mydepgraph.need_config_change()) and backtracked: if debug: writemsg_level( diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py index 646987d..8560871 100644 --- a/pym/portage/tests/resolver/ResolverPlayground.py +++ b/pym/portage/tests/resolver/ResolverPlayground.py @@ -674,7 +674,8 @@ class ResolverPlaygroundTestCase(object): expected = x break elif key in ("unstable_keywords", "needed_p_mask_changes", - "unsatisfied_deps") and expected is not None: + "unsatisfied_deps", "required_use_unsatisfied") and \ + expected is not None: expected = set(expected) elif key == "forced_rebuilds" and expected is not None: @@ -693,10 +694,12 @@ class ResolverPlaygroundResult(object): checks = ( "success", "mergelist", "use_changes", "license_changes", "unstable_keywords", "slot_collision_solutions", - "circular_dependency_solutions", "needed_p_mask_changes", "unsatisfied_deps", "forced_rebuilds" + "circular_dependency_solutions", "needed_p_mask_changes", "unsatisfied_deps", "forced_rebuilds", + "required_use_unsatisfied" ) optional_checks = ( "forced_rebuilds", + "required_use_unsatisfied", "unsatisfied_deps" ) @@ -714,6 +717,7 @@ class ResolverPlaygroundResult(object): self.circular_dependency_solutions = None self.unsatisfied_deps = frozenset() self.forced_rebuilds = None + self.required_use_unsatisfied = None if self.depgraph._dynamic_config._serialized_tasks_cache is not None: self.mergelist = [] @@ -780,6 +784,14 @@ class ResolverPlaygroundResult(object): if self.depgraph._forced_rebuilds: self.forced_rebuilds = dict(self._iter_forced_rebuilds()) + required_use_unsatisfied = [] + for pargs, kwargs in \ + self.depgraph._dynamic_config._unsatisfied_deps_for_display: + if "show_req_use" in kwargs: + required_use_unsatisfied.append(pargs[1]) + if required_use_unsatisfied: + self.required_use_unsatisfied = set(required_use_unsatisfied) + def _iter_forced_rebuilds(self): for child_dict in self.depgraph._forced_rebuilds.values(): for child, parents in child_dict.items(): -- 1.8.5.5