commit: 1e61c439143b12d079e1fc344bbc0c192a84cbe0
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Wed Sep 11 02:54:51 2019 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Thu Sep 12 01:31:21 2019 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=1e61c439
_add_dep: less aggressive backtracking (bug 693836)
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 <zmedico <AT> gentoo.org>
lib/_emerge/depgraph.py | 13 ++++
.../test_aggressive_backtrack_downgrade.py | 91 ++++++++++++++++++++++
2 files changed, 104 insertions(+)
diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py
index 6be1b3ec7..51614fc14 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
+ not
reasons.get("slot conflict", True)):
+
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..fbe85dc89
--- /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.6.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()