commit: c65bbcf7630f454ce84a4fa6b8ebff8488c6bfb2 Author: Tom Gillespie <tgbugs <AT> gmail <DOT> com> AuthorDate: Sun Jan 15 22:46:25 2023 +0000 Commit: Sam James <sam <AT> gentoo <DOT> org> CommitDate: Fri Feb 17 05:49:01 2023 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c65bbcf7
emerge: add --onlydeps-with-ideps=<y|n> option (bug 890777) Add --onlydeps-with-ideps option in order to include install-time dependencies with --onlydeps and --onlydeps-with-rdeps=n. The dependencies that get pulled in are those that are necessary for emerge --nodeps to succeed when run after the equivalent --onlydeps. The default --onlydeps --onlydeps-with-rdeps=n behavior is unchanged. This also adds a new test file test_onlydeps_ideps.py that is derived from test_onlydeps_minimal.py and tests the behavior for EAPI={7,8}. Additional tests have been added to test_onlydeps_minimal.py to ensure that the behavior at EAPI=0 remains unchanged. Bug: https://bugs.gentoo.org/890777 Signed-off-by: Tom Gillespie <tgbugs <AT> gmail.com> Closes: https://github.com/gentoo/portage/pull/979 Signed-off-by: Sam James <sam <AT> gentoo.org> NEWS | 1 + lib/_emerge/depgraph.py | 3 +- lib/_emerge/main.py | 9 +- lib/portage/tests/resolver/test_onlydeps_ideps.py | 172 +++++++++++++++++++++ .../tests/resolver/test_onlydeps_minimal.py | 25 +++ man/emerge.1 | 5 + 6 files changed, 212 insertions(+), 3 deletions(-) diff --git a/NEWS b/NEWS index 3322fe32a..b1f317ce3 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ Features: * ebuild: Set GNUMAKEFLAGS="--output-sync=line" to ensure build logs are written to synchronously when running GNU make in parallel. This option is only set if MAKEOPTS and GNUMAKEFLAGS are left unset by the user. +* emerge: add --onlydeps-with-ideps=<y|n> option (bug #890777). Bug fixes: * gpkg: Handle out-of-space errors (bug #891391). diff --git a/lib/_emerge/depgraph.py b/lib/_emerge/depgraph.py index 9030b6543..1631ed126 100644 --- a/lib/_emerge/depgraph.py +++ b/lib/_emerge/depgraph.py @@ -3718,7 +3718,8 @@ class depgraph: ): edepend["RDEPEND"] = "" edepend["PDEPEND"] = "" - edepend["IDEPEND"] = "" + if self._frozen_config.myopts.get("--onlydeps-with-ideps") in ("n", None): + edepend["IDEPEND"] = "" ignore_build_time_deps = False if pkg.built and not removal_action: diff --git a/lib/_emerge/main.py b/lib/_emerge/main.py index 921d8cae7..38233e05c 100644 --- a/lib/_emerge/main.py +++ b/lib/_emerge/main.py @@ -162,6 +162,7 @@ def insert_optional_args(args): "--jobs": valid_integers, "--keep-going": y_or_n, "--load-average": valid_floats, + "--onlydeps-with-ideps": y_or_n, "--onlydeps-with-rdeps": y_or_n, "--package-moves": y_or_n, "--quiet": y_or_n, @@ -573,8 +574,12 @@ def parse_opts(tmpcmdline, silent=False): + "Emerge will ignore matching binary packages. ", "action": "append", }, + "--onlydeps-with-ideps": { + "help": "modify interpretation of dependencies to include IDEPEND", + "choices": true_y_or_n, + }, "--onlydeps-with-rdeps": { - "help": "modify interpretation of depedencies", + "help": "modify interpretation of dependencies", "choices": true_y_or_n, }, "--rebuild-exclude": { @@ -671,7 +676,7 @@ def parse_opts(tmpcmdline, silent=False): "action": "store", }, "--root-deps": { - "help": "modify interpretation of depedencies", + "help": "modify interpretation of dependencies", "choices": ("True", "rdeps"), }, "--search-index": { diff --git a/lib/portage/tests/resolver/test_onlydeps_ideps.py b/lib/portage/tests/resolver/test_onlydeps_ideps.py new file mode 100644 index 000000000..e34ee2aed --- /dev/null +++ b/lib/portage/tests/resolver/test_onlydeps_ideps.py @@ -0,0 +1,172 @@ +# Copyright 2023 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 OnlydepsIdepsTestCase(TestCase): + def testOnlydepsIdepsEAPI7(self): + ebuilds = { + "dev-libs/A-1": { + "EAPI": "7", + "DEPEND": "dev-libs/B", + "RDEPEND": "dev-libs/C", + "PDEPEND": "dev-libs/D", + "IDEPEND": "dev-libs/E", + }, + "dev-libs/B-1": {}, + "dev-libs/C-1": {}, + "dev-libs/D-1": {}, + "dev-libs/E-1": {}, + } + ebuilds["dev-libs/F-1"] = ebuilds["dev-libs/A-1"] + installed = {} + + test_cases = ( + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={"--onlydeps": True, "--onlydeps-with-rdeps": "y"}, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1")], + ), + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={"--onlydeps": True, "--onlydeps-with-rdeps": "n"}, + mergelist=["dev-libs/B-1"], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "y", + }, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1")], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": True, + }, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1")], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "n", + }, + mergelist=["dev-libs/B-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.cleanup() + + def testOnlydepsIdepsEAPI8(self): + ebuilds = { + "dev-libs/A-1": { + "EAPI": "8", + "DEPEND": "dev-libs/B", + "RDEPEND": "dev-libs/C", + "PDEPEND": "dev-libs/D", + "IDEPEND": "dev-libs/E", + }, + "dev-libs/B-1": {}, + "dev-libs/C-1": {}, + "dev-libs/D-1": {}, + "dev-libs/E-1": {}, + } + ebuilds["dev-libs/F-1"] = ebuilds["dev-libs/A-1"] + installed = {} + + test_cases = ( + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={"--onlydeps": True, "--onlydeps-with-rdeps": "y"}, + ambiguous_merge_order=True, + mergelist=[ + ("dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1", "dev-libs/E-1") + ], + ), + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={"--onlydeps": True, "--onlydeps-with-rdeps": "n"}, + mergelist=["dev-libs/B-1"], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "y", + }, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1", "dev-libs/E-1")], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": True, + }, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1", "dev-libs/E-1")], + ), + ResolverPlaygroundTestCase( + ["dev-libs/F"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "n", + }, + mergelist=["dev-libs/B-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.cleanup() diff --git a/lib/portage/tests/resolver/test_onlydeps_minimal.py b/lib/portage/tests/resolver/test_onlydeps_minimal.py index 0dec40c2e..372c0e5aa 100644 --- a/lib/portage/tests/resolver/test_onlydeps_minimal.py +++ b/lib/portage/tests/resolver/test_onlydeps_minimal.py @@ -15,10 +15,12 @@ class OnlydepsMinimalTestCase(TestCase): "DEPEND": "dev-libs/B", "RDEPEND": "dev-libs/C", "PDEPEND": "dev-libs/D", + "IDEPEND": "dev-libs/E", }, "dev-libs/B-1": {}, "dev-libs/C-1": {}, "dev-libs/D-1": {}, + "dev-libs/E-1": {}, } installed = {} @@ -38,6 +40,29 @@ class OnlydepsMinimalTestCase(TestCase): options={"--onlydeps": True, "--onlydeps-with-rdeps": "n"}, mergelist=["dev-libs/B-1"], ), + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "y", + }, + ambiguous_merge_order=True, + mergelist=[("dev-libs/B-1",)], + ), + ResolverPlaygroundTestCase( + ["dev-libs/A"], + all_permutations=True, + success=True, + options={ + "--onlydeps": True, + "--onlydeps-with-rdeps": "n", + "--onlydeps-with-ideps": "n", + }, + mergelist=["dev-libs/B-1"], + ), ) playground = ResolverPlayground( diff --git a/man/emerge.1 b/man/emerge.1 index f70ae9f23..c85ffd7b6 100644 --- a/man/emerge.1 +++ b/man/emerge.1 @@ -800,6 +800,11 @@ Include run time dependencies when \fB\-\-onlydeps\fR is specified. When this is disabled only build time dependencies are included. This option is enabled by default. .TP +.BR "\-\-onlydeps\-with\-ideps < y | n >" +Include install time dependencies when \fB\-\-onlydeps\fR and +\fB\-\-onlydeps\-with\-rdeps=n\fR are both specified. This option is +disabled by default. +.TP .BR "\-\-package\-moves [ y | n ]" Perform package moves when necessary. This option is enabled by default. Package moves are typically applied immediately