While testing changes for bug 615680, I found that emerge fails to report slot conflicts triggered by autounmask USE changes. The problem is that the _check_slot_conflict fails to identify the slot conflict, since it only sees one package instance, when there should actually be 2 different instances with different USE settings. The problem can be solved by making _check_slot_conflict check if all parent atoms match pkg, and making _add_pkg use pkg.with_use(self._pkg_use_enabled(pkg)) to generate a second package instance (this will cause PackageTracker to recognize the slot conflict). The following test case triggers the problem: from portage.tests import TestCase from portage.tests.resolver.ResolverPlayground import ( ResolverPlayground, ResolverPlaygroundTestCase, ) class AutounmaskUseSlotConflictTestCase(TestCase): def testAutounmaskUseSlotConflict(self): ebuilds = { "sci-libs/K-1": { "IUSE": "+foo", "EAPI": 1 }, "sci-libs/L-1": { "DEPEND": "sci-libs/K[-foo]", "EAPI": 2 }, "sci-libs/M-1": { "DEPEND": "sci-libs/K[foo=]", "IUSE": "+foo", "EAPI": 2 }, } installed = {} test_cases = ( ResolverPlaygroundTestCase( ["sci-libs/L", "sci-libs/M"], options={"--backtrack": 0}, success = False, mergelist = [ "sci-libs/L-1", "sci-libs/M-1", "sci-libs/K-1", ], ignore_mergelist_order = True, slot_collision_solutions = [ { "sci-libs/K-1": {"foo": False}, "sci-libs/M-1": {"foo": False} } ] ), ) playground = ResolverPlayground( ebuilds=ebuilds, installed=installed, debug=True) 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()
If we're going to add pkg.with_use(self._pkg_use_enabled(pkg)) to the graph, then we need to add USE to the hash key. Also, the way that _pkg_use_enabled is used everywhere needs to be carefully considered. Maybe it will be okay as long as USE is part of the hash key.
Fixing this bug will require significant changes, and it shouldn't block bug 615680.
The bug has been referenced in the following commit(s): https://gitweb.gentoo.org/proj/portage.git/commit/?id=f5a58b3f2e2adc7f9d2794d4e91d44ec1419b56a commit f5a58b3f2e2adc7f9d2794d4e91d44ec1419b56a Author: Zac Medico <zmedico@gentoo.org> AuthorDate: 2021-02-23 22:14:30 +0000 Commit: Zac Medico <zmedico@gentoo.org> CommitDate: 2021-02-23 22:37:34 +0000 Add USE conflict unit test for bug 615824 Test bug 615824, where an automask USE change results in a conflict which is not reported. In order to install L, foo must be disabled for both K and M, but autounmask disables foo for K and leaves it enabled for M: [ebuild N ] sci-libs/K-1 USE="-foo" [ebuild N ] sci-libs/L-1 [ebuild N ] sci-libs/M-1 USE="foo" The following USE changes are necessary to proceed: (see "package.use" in the portage(5) man page for more details) # required by sci-libs/L-1::test_repo # required by sci-libs/L (argument) >=sci-libs/K-1 -foo Bug: https://bugs.gentoo.org/615824 Signed-off-by: Zac Medico <zmedico@gentoo.org> .../resolver/test_autounmask_use_slot_conflict.py | 51 ++++++++++++++++++++++ 1 file changed, 51 insertions(+)