commit: 1b3131db0e22085dba7d0fb9fc6e5ec70c8c577d Author: Zac Medico <zmedico <AT> gentoo <DOT> org> AuthorDate: Tue Nov 26 18:05:47 2019 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Tue Nov 26 20:34:53 2019 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=1b3131db
emerge --buildpkgonly: respect buildtime hard blockers Bug: https://bugs.gentoo.org/689226 Signed-off-by: Zac Medico <zmedico <AT> gentoo.org> lib/_emerge/depgraph.py | 24 ++++++--- lib/portage/tests/resolver/test_blocker.py | 87 +++++++++++++++++++++++++++++- 2 files changed, 102 insertions(+), 9 deletions(-) diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py index 68b5bdb2e..1127a6234 100644 --- a/lib/_emerge/depgraph.py +++ b/lib/_emerge/depgraph.py @@ -2791,7 +2791,6 @@ class depgraph(object): def _add_dep(self, dep, allow_unsatisfied=False): debug = "--debug" in self._frozen_config.myopts - buildpkgonly = "--buildpkgonly" in self._frozen_config.myopts nodeps = "--nodeps" in self._frozen_config.myopts if dep.blocker: @@ -2799,8 +2798,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 +6803,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 +7058,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 +7334,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 +8292,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()