Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: lib/_emerge/, lib/portage/tests/resolver/
Date: Thu, 12 Sep 2019 01:51:39
Message-Id: 1568251881.1e61c439143b12d079e1fc344bbc0c192a84cbe0.zmedico@gentoo
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()