Fix check_reverse_dependencies to ignore dependencies of parent packages
for which updates are desirable, and add required  _want_update_pkg
support for DependencyArg parents. This solves a missed llvm update by
ignoring a reverse dependency from the installed instance of clang,
since an update to a newer version of clang is desirable.

In order to cope with this change, there are 2 existing unit tests
that require larger --backtrack settings in order to succeed.

X-Gentoo-Bug: 584626
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=584626
---
 pym/_emerge/depgraph.py                            | 40 ++++++++++++++++++++--
 .../soname/test_slot_conflict_reinstall.py         |  1 +
 .../tests/resolver/test_slot_conflict_rebuild.py   |  2 +-
 .../resolver/test_slot_operator_reverse_deps.py    |  6 +++-
 4 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index f78f08d..ef3cc5d 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -1822,6 +1822,22 @@ class depgraph(object):
                                                # necessarily relevant.
                                                continue
 
+                                       if (not 
self._frozen_config.excluded_pkgs.
+                                               findAtomForPackage(parent,
+                                               
modified_use=self._pkg_use_enabled(parent)) and
+                                               
self._upgrade_available(parent)):
+                                               want_update = False
+                                               for grandparent in 
self._dynamic_config.digraph.\
+                                                       parent_nodes(parent):
+                                                       if 
self._want_update_pkg(grandparent, parent):
+                                                               want_update = 
True
+                                                               break
+
+                                               if want_update:
+                                                       # This parent may be 
irrelevant, since an
+                                                       # update is available 
(see bug 584626).
+                                                       continue
+
                                atom_set = 
InternalPackageSet(initial_atoms=(atom,),
                                        allow_repo=True)
                                if not 
atom_set.findAtomForPackage(candidate_pkg,
@@ -2113,6 +2129,19 @@ class depgraph(object):
 
                self._dynamic_config._need_restart = True
 
+       def _upgrade_available(self, pkg):
+               """
+               Detect cases where an upgrade of the given package is available
+               within the same slot.
+               """
+               available_pkg = None
+               for available_pkg in self._iter_similar_available(pkg,
+                       pkg.slot_atom):
+                       if available_pkg >= pkg:
+                               return True
+
+               return False
+
        def _downgrade_probe(self, pkg):
                """
                Detect cases where a downgrade of the given package is 
considered
@@ -5382,9 +5411,14 @@ class depgraph(object):
                                # should have been masked before it was selected
                                raise
 
-               depth = parent.depth or 0
-               if isinstance(depth, int):
-                       depth += 1
+               if isinstance(parent, Package):
+                       depth = parent.depth or 0
+                       if isinstance(depth, int):
+                               depth += 1
+               elif parent.reset_depth:
+                       depth = 0
+               else:
+                       depth = self._UNREACHABLE_DEPTH
 
                if arg_atoms:
                        for arg, atom in arg_atoms:
diff --git a/pym/portage/tests/resolver/soname/test_slot_conflict_reinstall.py 
b/pym/portage/tests/resolver/soname/test_slot_conflict_reinstall.py
index 40e6995..f474761 100644
--- a/pym/portage/tests/resolver/soname/test_slot_conflict_reinstall.py
+++ b/pym/portage/tests/resolver/soname/test_slot_conflict_reinstall.py
@@ -89,6 +89,7 @@ class SonameSlotConflictReinstallTestCase(TestCase):
                                        "--ignore-soname-deps": "n",
                                        "--update": True,
                                        "--usepkgonly": True,
+                                       "--backtrack": 10,
                                },
                                success = True,
                                mergelist = [
diff --git a/pym/portage/tests/resolver/test_slot_conflict_rebuild.py 
b/pym/portage/tests/resolver/test_slot_conflict_rebuild.py
index b39eaf0..2dfa79c 100644
--- a/pym/portage/tests/resolver/test_slot_conflict_rebuild.py
+++ b/pym/portage/tests/resolver/test_slot_conflict_rebuild.py
@@ -91,7 +91,7 @@ class SlotConflictRebuildTestCase(TestCase):
                        # upgrade and we don't want to trigger unnecessary 
rebuilds.
                        ResolverPlaygroundTestCase(
                                ["@world"],
-                               options = {"--update": True, "--deep": True},
+                               options = {"--update": True, "--deep": True, 
"--backtrack": 4},
                                success = True,
                                mergelist = ["app-misc/D-2", "app-misc/E-0"]),
 
diff --git a/pym/portage/tests/resolver/test_slot_operator_reverse_deps.py 
b/pym/portage/tests/resolver/test_slot_operator_reverse_deps.py
index 72879f8..ce614a4 100644
--- a/pym/portage/tests/resolver/test_slot_operator_reverse_deps.py
+++ b/pym/portage/tests/resolver/test_slot_operator_reverse_deps.py
@@ -79,7 +79,11 @@ class SlotOperatorReverseDepsTestCase(TestCase):
                                ["@world"],
                                options = {"--update": True, "--deep": True},
                                success = True,
-                               mergelist = [],
+                               mergelist = [
+                                       'sys-devel/llvm-3.8.0-r2',
+                                       'sys-devel/clang-3.8.0-r100',
+                                       'media-libs/mesa-11.2.2',
+                               ],
                        ),
 
                        ResolverPlaygroundTestCase(
-- 
2.7.4


Reply via email to