Bug: https://bugs.gentoo.org/689226 Signed-off-by: Zac Medico <zmed...@gentoo.org> --- lib/_emerge/depgraph.py | 23 ++++-- lib/portage/tests/resolver/test_blocker.py | 87 +++++++++++++++++++++- 2 files changed, 102 insertions(+), 8 deletions(-)
diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py index 68b5bdb2e..c4c813f7c 100644 --- a/lib/_emerge/depgraph.py +++ b/lib/_emerge/depgraph.py @@ -2799,8 +2799,7 @@ class depgraph(object): # blocker validation is only able to account for one package per slot. is_slot_conflict_parent = any(dep.parent in conflict.pkgs[1:] for conflict in \ self._dynamic_config._package_tracker.slot_conflicts()) - if not buildpkgonly and \ - not nodeps and \ + if not nodeps and \ not dep.collapsed_priority.ignored and \ not dep.collapsed_priority.optional and \ not is_slot_conflict_parent: @@ -6805,8 +6804,7 @@ class depgraph(object): for depclean and prune removal operations) @type required_sets: dict """ - if "--buildpkgonly" in self._frozen_config.myopts or \ - "recurse" not in self._dynamic_config.myparams: + if "recurse" not in self._dynamic_config.myparams: return 1 complete_if_new_use = self._dynamic_config.myparams.get( @@ -7061,8 +7059,7 @@ class depgraph(object): # has been called before it, by checking that it is not None. self._dynamic_config._blocked_pkgs = digraph() - if "--buildpkgonly" in self._frozen_config.myopts or \ - "--nodeps" in self._frozen_config.myopts: + if "--nodeps" in self._frozen_config.myopts: return True if True: @@ -7338,6 +7335,10 @@ class depgraph(object): # so apparently this one is unresolvable. unresolved_blocks = True + if "--buildpkgonly" in self._frozen_config.myopts and not ( + blocker.priority.buildtime and blocker.atom.blocker.overlap.forbid): + depends_on_order.clear() + # Make sure we don't unmerge any package that have been pulled # into the graph. if not unresolved_blocks and depends_on_order: @@ -8292,9 +8293,17 @@ class depgraph(object): retlist.extend(unsolvable_blockers) retlist = tuple(retlist) + buildtime_blockers = [] + if unsolvable_blockers and "--buildpkgonly" in self._frozen_config.myopts: + for blocker in unsolvable_blockers: + if blocker.priority.buildtime and blocker.atom.blocker.overlap.forbid: + buildtime_blockers.append(blocker) + if unsolvable_blockers and \ + not buildtime_blockers and \ not self._accept_blocker_conflicts(): - self._dynamic_config._unsatisfied_blockers_for_display = unsolvable_blockers + self._dynamic_config._unsatisfied_blockers_for_display = (tuple(buildtime_blockers) + if buildtime_blockers else unsolvable_blockers) self._dynamic_config._serialized_tasks_cache = retlist self._dynamic_config._scheduler_graph = scheduler_graph # Blockers don't trigger the _skip_restart flag, since diff --git a/lib/portage/tests/resolver/test_blocker.py b/lib/portage/tests/resolver/test_blocker.py index 94a88b8b4..6534f99e6 100644 --- a/lib/portage/tests/resolver/test_blocker.py +++ b/lib/portage/tests/resolver/test_blocker.py @@ -1,4 +1,4 @@ -# Copyright 2014 Gentoo Foundation +# Copyright 2014-2019 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 from portage.tests import TestCase @@ -46,3 +46,88 @@ class SlotConflictWithBlockerTestCase(TestCase): self.assertEqual(test_case.test_success, True, test_case.fail_msg) finally: playground.cleanup() + + def testBlockerBuildpkgonly(self): + ebuilds = { + 'dev-libs/A-1': { + 'EAPI': '7', + 'DEPEND': '!!dev-libs/X' + }, + + 'dev-libs/B-1': { + 'EAPI': '7', + 'BDEPEND': '!!dev-libs/X' + }, + + 'dev-libs/C-1': { + 'EAPI': '7', + 'BDEPEND': '!dev-libs/X' + }, + + 'dev-libs/D-1': { + 'EAPI': '7', + 'DEPEND': '!dev-libs/X' + }, + + 'dev-libs/E-1': { + 'EAPI': '7', + 'RDEPEND': '!dev-libs/X !!dev-libs/X' + }, + + 'dev-libs/F-1': { + 'EAPI': '7', + 'PDEPEND': '!dev-libs/X !!dev-libs/X' + }, + } + + installed = { + 'dev-libs/X-1': {}, + } + + test_cases = ( + ResolverPlaygroundTestCase( + ['dev-libs/A'], + success = False, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/A-1', '!!dev-libs/X']), + + ResolverPlaygroundTestCase( + ['dev-libs/B'], + success = False, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/B-1', '!!dev-libs/X']), + + ResolverPlaygroundTestCase( + ['dev-libs/C'], + success = True, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/C-1']), + + ResolverPlaygroundTestCase( + ['dev-libs/D'], + success = True, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/D-1']), + + ResolverPlaygroundTestCase( + ['dev-libs/E'], + success = True, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/E-1']), + + ResolverPlaygroundTestCase( + ['dev-libs/F'], + success = True, + options = {'--buildpkgonly': True}, + mergelist = ['dev-libs/F-1']), + ) + + playground = ResolverPlayground(ebuilds=ebuilds, + installed=installed, 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