@@ -, +, @@ downgrade matched by all parent atoms (bug 692746) ---------------------------------------------------------------------- File "lib/portage/tests/__init__.py, line 211, in run testMethod() File "lib/portage/tests/resolver/test_slot_operator_complete_graph.py", line 137, in testSlotOperatorCompleteGraph test_case.fail_msg) ---------------------------------------------------------------------- File "lib/portage/tests/__init__.py", line 211, in run testMethod() File "lib/portage/tests/resolver/test_slot_operator_runtime_pkg_mask.py", line 132, in testSlotOperatorRuntimePkgMask test_case.fail_msg) ---------------------------------------------------------------------- File "lib/portage/tests/__init__.py", line 211, in run testMethod() File "lib/portage/tests/resolver/soname/test_skip_update.py", line 82, in testSonameSkipUpdate test_case.fail_msg) --- lib/_emerge/depgraph.py | 6 ++++++ lib/_emerge/resolver/backtracking.py | 5 +++++ 2 files changed, 11 insertions(+) --- a/lib/_emerge/depgraph.py +++ a/lib/_emerge/depgraph.py @@ -1771,6 +1771,12 @@ class depgraph(object): # In order to avoid a missed update, first mask lower versions # that conflict with higher versions (the backtracker visits # these in reverse order). + if (existing_node not in conflict_pkgs and + any(pkg > existing_node for pkg in conflict_pkgs)): + # Even though all parent atoms match existing_node, add it + # to conflict_pkgs in order to avoid a missed update for + # bug 692746. + conflict_pkgs.append(existing_node) conflict_pkgs.sort(reverse=True) backtrack_data = [] for to_be_masked in conflict_pkgs: --- a/lib/_emerge/resolver/backtracking.py +++ a/lib/_emerge/resolver/backtracking.py @@ -135,11 +135,16 @@ class Backtracker(object): continue entry_is_valid = False + any_parents = False for ppkg, patom in runtime_pkg_mask[pkg].get("slot conflict", set()): + any_parents = True if ppkg not in runtime_pkg_mask: entry_is_valid = True break + else: + if not any_parents: + entry_is_valid = True if not entry_is_valid: return False --