When searching for slot operator rebuilds, respect non slot-operator
components of parent dependencies, so that a <foo-version:= dependency
like the <dev-libs/libgit2-1:0=[ssh?] dependency from bug 717140 will
not be completely ignored. This will prevent erroneous attempts to
trigger slot operator rebuilds for upgrades that would break
<foo-version:= dependencies (which triggered upgrade/downgrade loops
when backtracking tried to resolve the breakage).

Bug: https://bugs.gentoo.org/717140
Signed-off-by: Zac Medico <zmed...@gentoo.org>
---
 lib/_emerge/depgraph.py                              | 12 +++++++++---
 .../resolver/test_slot_operator_reverse_deps.py      |  1 -
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 6d1f62178..ec90e59df 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -2068,9 +2068,15 @@ class depgraph(object):
                        for parent, atom in 
self._dynamic_config._parent_atoms.get(existing_pkg, []):
                                if isinstance(parent, Package):
                                        if parent in 
built_slot_operator_parents:
-                                               # This parent may need to be 
rebuilt, so its
-                                               # dependencies aren't 
necessarily relevant.
-                                               continue
+                                               # This parent may need to be 
rebuilt, therefore
+                                               # discard its soname and built 
slot operator
+                                               # dependency components which 
are not necessarily
+                                               # relevant.
+                                               if atom.soname:
+                                                       continue
+                                               elif atom.package and 
atom.slot_operator_built:
+                                                       # This discards the 
slot/subslot component.
+                                                       atom = 
atom.with_slot("=")
 
                                        if replacement_parent is not None and \
                                                (replacement_parent.slot_atom 
== parent.slot_atom
diff --git a/lib/portage/tests/resolver/test_slot_operator_reverse_deps.py 
b/lib/portage/tests/resolver/test_slot_operator_reverse_deps.py
index 5c5295510..e0e738d6b 100644
--- a/lib/portage/tests/resolver/test_slot_operator_reverse_deps.py
+++ b/lib/portage/tests/resolver/test_slot_operator_reverse_deps.py
@@ -122,7 +122,6 @@ class SlotOperatorReverseDepsLibGit2TestCase(TestCase):
                trigger an upgrade to dev-libs/libgit2-1.0.0-r1, ultimately
                resulting in an undesirable downgrade to 
dev-libs/libgit2-0.28.4-r1.
                """
-               self.todo = True
 
                ebuilds = {
 
-- 
2.24.1


Reply via email to