[PATCH] _add_dep: less aggressive backtracking (bug 693836)

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] _add_dep: less aggressive backtracking (bug 693836)

Zac Medico-2
In order to suppress the sort of aggressive backtracking that can
trigger undesirable downgrades as in bug 693836, do not backtrack
for an unsatisfied dependency if there's an available package in
the runtime package mask which was involved in a slot conflict and
satisfied all involved parent atoms. Instead, discard the current
depgraph in favor of other backtracking configurations that may
exist. This case would not have been encountered prior to the fix
for bug 692746 which enabled backtracking for the type of slot
conflict that is detected here.

Fixes: 994ac00aa764 ("_slot_confict_backtrack: consider masking a package matched by all parent atoms (bug 692746)")
Bug: https://bugs.gentoo.org/693836
Signed-off-by: Zac Medico <[hidden email]>
---
 lib/_emerge/depgraph.py                       | 13 +++
 .../test_aggressive_backtrack_downgrade.py    | 91 +++++++++++++++++++
 2 files changed, 104 insertions(+)
 create mode 100644 lib/portage/tests/resolver/test_aggressive_backtrack_downgrade.py

diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 6be1b3ec7..ab9f89cc2 100644
--- a/lib/_emerge/depgraph.py
+++ b/lib/_emerge/depgraph.py
@@ -2888,6 +2888,19 @@ class depgraph(object):
  dep.atom.without_use if dep.atom.package
  else dep.atom, onlydeps=dep.onlydeps)
  if dep_pkg is None:
+
+ # In order to suppress the sort of aggressive
+ # backtracking that can trigger undesirable downgrades
+ # as in bug 693836, do not backtrack if there's an
+ # available package which was involved in a slot
+ # conflict and satisfied all involved parent atoms.
+ for dep_pkg, reasons in self._dynamic_config._runtime_pkg_mask.items():
+ if (dep.atom.match(dep_pkg) and
+ len(reasons) == 1 and "slot conflict" in reasons and
+ not reasons["slot conflict"]):
+ self._dynamic_config._skip_restart = True
+ return 0
+
  self._dynamic_config._backtrack_infos["missing dependency"] = dep
  self._dynamic_config._need_restart = True
  if debug:
diff --git a/lib/portage/tests/resolver/test_aggressive_backtrack_downgrade.py b/lib/portage/tests/resolver/test_aggressive_backtrack_downgrade.py
new file mode 100644
index 000000000..ab4a83ee5
--- /dev/null
+++ b/lib/portage/tests/resolver/test_aggressive_backtrack_downgrade.py
@@ -0,0 +1,91 @@
+# Copyright 2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import (ResolverPlayground,
+ ResolverPlaygroundTestCase)
+
+class AgressiveBacktrackDowngradeTestCase(TestCase):
+
+ def testAgressiveBacktrackDowngrade(self):
+
+ ebuilds = {
+ "www-client/firefox-69.0" : {
+ "EAPI": "7",
+ "RDEPEND": "=media-libs/libvpx-1.7*:0=[postproc] media-video/ffmpeg"
+ },
+
+ "www-client/firefox-60.9.0" : {
+ "EAPI": "7",
+ "RDEPEND": ""
+ },
+
+ "media-libs/libvpx-1.8.0" : {
+ "EAPI": "7",
+ "SLOT" : "0/6",
+ "IUSE": "postproc",
+ },
+
+ "media-libs/libvpx-1.7.0" : {
+ "EAPI": "7",
+ "SLOT" : "0/5",
+ "IUSE": "+postproc",
+ },
+
+ "media-libs/libvpx-1.5.0" : {
+ "EAPI": "7",
+ "SLOT" : "0/4",
+ "IUSE": "postproc",
+ },
+
+ "media-video/ffmpeg-4.2" : {
+ "EAPI": "7",
+ "RDEPEND": "media-libs/libvpx:=",
+ },
+ }
+
+ installed = {
+ "www-client/firefox-69.0" : {
+ "EAPI": "7",
+ "RDEPEND": "=media-libs/libvpx-1.7*:0/5=[postproc] media-video/ffmpeg"
+ },
+
+ "media-libs/libvpx-1.7.0" : {
+ "EAPI": "7",
+ "SLOT" : "0/5",
+ "IUSE": "+postproc",
+ "USE": "postproc",
+ },
+
+ "media-video/ffmpeg-4.2" : {
+ "EAPI": "7",
+ "RDEPEND": "media-libs/libvpx:0/5=",
+ },
+ }
+
+ world = ["media-video/ffmpeg", "www-client/firefox"]
+
+ test_cases = (
+ # Test bug 693836, where an attempt to upgrade libvpx lead
+ # to aggressive backtracking which ultimately triggered an
+ # undesirable firefox downgrade like this:
+ # [ebuild     U  ] media-libs/libvpx-1.8.0 [1.7.0]
+ # [ebuild     UD ] www-client/firefox-60.9.0 [69.0]
+ # [ebuild  rR    ] media-video/ffmpeg-4.2
+ ResolverPlaygroundTestCase(
+ ['@world'],
+ options = {"--update": True, "--deep": True},
+ success = True,
+ mergelist = [],
+ ),
+ )
+
+ playground = ResolverPlayground(ebuilds=ebuilds,
+ installed=installed, world=world, debug=False)
+ try:
+ for test_case in test_cases:
+ playground.run_TestCase(test_case)
+ self.assertEqual(test_case.test_success, True, test_case.fail_msg)
+ finally:
+ playground.debug = False
+ playground.cleanup()
--
2.21.0