commit:     70cbb9b693782eaa779cd7f9f5de6f72edc381d1
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 19 05:25:40 2023 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Dec 19 06:27:26 2023 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=70cbb9b6

depgraph: Use strip_libc_deps in _eliminate_rebuilds

The included test case will fail without strip_libc_deps
because the "injected" >=sys-libs/glibc-2.37 dependency
will be interpreted as a dependency change, triggering
unwanted reinstall of app-misc/A-1.

Bug: https://bugs.gentoo.org/915494
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/_emerge/depgraph.py                            | 33 ++++++++++++++--------
 .../tests/resolver/soname/test_skip_update.py      | 17 +++++++++--
 2 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 4612ac2049..e92c6962ac 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -2966,6 +2966,23 @@ class depgraph:
                 return flags
         return None
 
+    def _installed_libc_deps(self, eroot):
+        """
+        Return find_libc_deps result for installed packages from the
+        given EROOT.
+        """
+        try:
+            return self._frozen_config._libc_deps_cache[eroot]
+        except (AttributeError, KeyError) as e:
+            if isinstance(e, AttributeError):
+                self._frozen_config._libc_deps_cache = {}
+
+            self._frozen_config._libc_deps_cache[eroot] = find_libc_deps(
+                self._frozen_config._trees_orig[eroot]["vartree"].dbapi,
+                False,
+            )
+        return self._frozen_config._libc_deps_cache[eroot]
+
     def _changed_deps(self, pkg):
         ebuild = None
         try:
@@ -2985,18 +3002,7 @@ class depgraph:
             else:
                 depvars = Package._runtime_keys
 
-            eroot = pkg.root_config.settings["EROOT"]
-            try:
-                libc_deps = self._frozen_config._libc_deps_cache[eroot]
-            except (AttributeError, KeyError) as e:
-                if isinstance(e, AttributeError):
-                    self._frozen_config._libc_deps_cache = {}
-
-                self._frozen_config._libc_deps_cache[eroot] = find_libc_deps(
-                    self._frozen_config._trees_orig[eroot]["vartree"].dbapi,
-                    False,
-                )
-            libc_deps = self._frozen_config._libc_deps_cache[eroot]
+            libc_deps = self._installed_libc_deps(pkg.root)
 
             # Use _raw_metadata, in order to avoid interaction
             # with --dynamic-deps.
@@ -3726,6 +3732,7 @@ class depgraph:
                     if pkg.requires != installed_instance.requires:
                         continue
 
+                libc_deps = self._installed_libc_deps(pkg.root)
                 depvars = Package._dep_keys
                 try:
                     installed_deps = []
@@ -3736,6 +3743,7 @@ class depgraph:
                             eapi=pkg.eapi,
                             token_class=Atom,
                         )
+                        strip_libc_deps(dep_struct, libc_deps)
                         installed_deps.append(dep_struct)
                 except InvalidDependString:
                     continue
@@ -3759,6 +3767,7 @@ class depgraph:
                             eapi=pkg.eapi,
                             token_class=Atom,
                         )
+                        strip_libc_deps(dep_struct, libc_deps)
                         new_deps.append(dep_struct)
 
                     if new_deps != installed_deps:

diff --git a/lib/portage/tests/resolver/soname/test_skip_update.py 
b/lib/portage/tests/resolver/soname/test_skip_update.py
index 407c16a548..dc48a66f9f 100644
--- a/lib/portage/tests/resolver/soname/test_skip_update.py
+++ b/lib/portage/tests/resolver/soname/test_skip_update.py
@@ -1,4 +1,4 @@
-# Copyright 2015-2023 Gentoo Foundation
+# Copyright 2015-2023 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 import sys
@@ -29,7 +29,10 @@ class SonameSkipUpdateTestCase(TestCase):
     def testSonameSkipUpdate(self, backtrack=3):
         binpkgs = {
             "app-misc/A-1": {
-                "RDEPEND": "dev-libs/B",
+                # Simulate injected libc dep which should not trigger
+                # reinstall due to use of strip_libc_deps in
+                # depgraph._eliminate_rebuilds dep comparison.
+                "RDEPEND": "dev-libs/B >=sys-libs/glibc-2.37",
                 "DEPEND": "dev-libs/B",
                 "REQUIRES": "x86_32: libB.so.1",
             },
@@ -39,6 +42,10 @@ class SonameSkipUpdateTestCase(TestCase):
             "dev-libs/B-1": {
                 "PROVIDES": "x86_32: libB.so.1",
             },
+            "sys-libs/glibc-2.37-r7": {
+                "PROVIDES": "x86_32: libc.so.6",
+            },
+            "virtual/libc-1-r1": {"RDEPEND": "sys-libs/glibc"},
         }
 
         installed = {
@@ -50,6 +57,12 @@ class SonameSkipUpdateTestCase(TestCase):
             "dev-libs/B-1": {
                 "PROVIDES": "x86_32: libB.so.1",
             },
+            "sys-libs/glibc-2.37-r7": {
+                "PROVIDES": "x86_32: libc.so.6",
+            },
+            "virtual/libc-1-r1": {
+                "RDEPEND": "sys-libs/glibc",
+            },
         }
 
         world = ("app-misc/A",)

Reply via email to