diff options
author | Zac Medico <zmedico@gentoo.org> | 2020-11-27 17:57:14 -0800 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2020-11-28 12:50:13 -0800 |
commit | b991f23ad915d1fc37088f11ca855c8c8374f5ae (patch) | |
tree | 80ac54946ea4f3a63efac8877645d76bdaf7a121 /lib/portage/tests | |
parent | backtracking: fix virtual choices for circular deps (bug 757306) (diff) | |
download | portage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.tar.gz portage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.tar.bz2 portage-b991f23ad915d1fc37088f11ca855c8c8374f5ae.zip |
Allow a package to replace its own buildtime dependency
If a package has a buildtime dependency on a previous version that
it will replace, then do not treat it as a slot conflict. This
solves inappropriate behavior for dev-lang/rust[system-bootstrap].
This requires adjustments to package selection logic in several
locations, in order to ensure that an installed package instance
will be selected to satisfy a buildtime dependency when
appropriate. Dependencies of the installed package will be
entirely ignored, but that has already been the case when using
installed package to break cycles, as discussed in bug 199856.
Bug: https://bugs.gentoo.org/756793
Bug: https://bugs.gentoo.org/756961
Signed-off-by: Zac Medico <zmedico@gentoo.org>
Diffstat (limited to 'lib/portage/tests')
-rw-r--r-- | lib/portage/tests/resolver/test_circular_choices_rust.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/portage/tests/resolver/test_circular_choices_rust.py b/lib/portage/tests/resolver/test_circular_choices_rust.py new file mode 100644 index 000000000..612f76c48 --- /dev/null +++ b/lib/portage/tests/resolver/test_circular_choices_rust.py @@ -0,0 +1,94 @@ +# Copyright 2020 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 CircularRustTestCase(TestCase): + def testCircularPypyExe(self): + + ebuilds = { + "dev-lang/rust-1.47.0-r2": { + "EAPI": "7", + "SLOT": "stable/1.47", + "BDEPEND": "|| ( =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* =dev-lang/rust-1.47* =dev-lang/rust-bin-1.47* )", + }, + "dev-lang/rust-1.46.0": { + "EAPI": "7", + "SLOT": "stable/1.46", + "BDEPEND": "|| ( =dev-lang/rust-1.45* =dev-lang/rust-bin-1.45* =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* )", + }, + "dev-lang/rust-bin-1.47.0": { + "EAPI": "7", + }, + "dev-lang/rust-bin-1.46.0": { + "EAPI": "7", + }, + } + + installed = { + "dev-lang/rust-1.46.0": { + "EAPI": "7", + "SLOT": "stable/1.46", + "BDEPEND": "|| ( =dev-lang/rust-1.45* =dev-lang/rust-bin-1.45* =dev-lang/rust-1.46* =dev-lang/rust-bin-1.46* )", + }, + } + + test_cases = ( + # Test bug 756961, where a circular dependency was reported + # when a package would replace its own builtime dependency. + # This needs to be tested with and without --update, since + # that affects package selection logic significantly, + # expecially for packages given as arguments. + ResolverPlaygroundTestCase( + ["=dev-lang/rust-1.46*"], + mergelist=["dev-lang/rust-1.46.0"], + success=True, + ), + ResolverPlaygroundTestCase( + ["=dev-lang/rust-1.46*"], + options={"--update": True}, + mergelist=[], + success=True, + ), + ResolverPlaygroundTestCase( + ["=dev-lang/rust-1.46*"], + options={"--deep": True, "--update": True}, + mergelist=[], + success=True, + ), + ResolverPlaygroundTestCase( + ["dev-lang/rust"], + mergelist=["dev-lang/rust-1.47.0-r2"], + success=True, + ), + ResolverPlaygroundTestCase( + ["dev-lang/rust"], + options={"--update": True}, + mergelist=["dev-lang/rust-1.47.0-r2"], + success=True, + ), + ResolverPlaygroundTestCase( + ["@world"], + options={"--deep": True, "--update": True}, + mergelist=["dev-lang/rust-1.47.0-r2"], + success=True, + ), + ) + + world = ["dev-lang/rust"] + + 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() |