Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] depgraph: eval disjunctive build deps earlier (bug 639346)
Date: Sun, 03 Dec 2017 23:22:05
Message-Id: 20171203231944.114446-1-zmedico@gentoo.org
1 Since built-time deps tend to be a superset of run-time deps, evaluate
2 disjunctive build-time deps before run-time deps, so that choices for
3 build-time deps influence choices for run-time deps.
4
5 Also, fix OnlydepsMinimalTestCase to specify ambiguous_merge_order,
6 since the merge order is affected by the order of evaluation.
7
8 Bug: https://bugs.gentoo.org/639346
9 ---
10 pym/_emerge/depgraph.py | 12 ++-
11 .../resolver/test_disjunctive_depend_order.py | 87 ++++++++++++++++++++++
12 .../tests/resolver/test_onlydeps_minimal.py | 5 +-
13 3 files changed, 98 insertions(+), 6 deletions(-)
14 create mode 100644 pym/portage/tests/resolver/test_disjunctive_depend_order.py
15
16 diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
17 index f54acdc26..6e5ca6508 100644
18 --- a/pym/_emerge/depgraph.py
19 +++ b/pym/_emerge/depgraph.py
20 @@ -3234,7 +3234,15 @@ class depgraph(object):
21 if ignore_hdepend_deps:
22 edepend["HDEPEND"] = ""
23
24 + # Since build-time deps tend to be a superset of run-time deps, order
25 + # dep processing such that build-time deps are popped from
26 + # _dep_disjunctive_stack first, so that choices for build-time
27 + # deps influence choices for run-time deps (bug 639346).
28 deps = (
29 + (myroot, edepend["RDEPEND"],
30 + self._priority(runtime=True)),
31 + (myroot, edepend["PDEPEND"],
32 + self._priority(runtime_post=True)),
33 (depend_root, edepend["DEPEND"],
34 self._priority(buildtime=True,
35 optional=(pkg.built or ignore_depend_deps),
36 @@ -3243,10 +3251,6 @@ class depgraph(object):
37 self._priority(buildtime=True,
38 optional=(pkg.built or ignore_hdepend_deps),
39 ignored=ignore_hdepend_deps)),
40 - (myroot, edepend["RDEPEND"],
41 - self._priority(runtime=True)),
42 - (myroot, edepend["PDEPEND"],
43 - self._priority(runtime_post=True))
44 )
45
46 debug = "--debug" in self._frozen_config.myopts
47 diff --git a/pym/portage/tests/resolver/test_disjunctive_depend_order.py b/pym/portage/tests/resolver/test_disjunctive_depend_order.py
48 new file mode 100644
49 index 000000000..88f6dac2d
50 --- /dev/null
51 +++ b/pym/portage/tests/resolver/test_disjunctive_depend_order.py
52 @@ -0,0 +1,87 @@
53 +# Copyright 2017 Gentoo Foundation
54 +# Distributed under the terms of the GNU General Public License v2
55 +
56 +from portage.tests import TestCase
57 +from portage.tests.resolver.ResolverPlayground import (
58 + ResolverPlayground,
59 + ResolverPlaygroundTestCase,
60 +)
61 +
62 +class DisjunctiveDependOrderTestCase(TestCase):
63 +
64 + def testDisjunctiveDependOrderTestCase(self):
65 + ebuilds = {
66 + 'virtual/jre-1.8': {
67 + 'EAPI': '6',
68 + 'SLOT' : '1.8',
69 + 'RDEPEND' : '|| ( dev-java/oracle-jre-bin:1.8 virtual/jdk:1.8 )',
70 + },
71 + 'virtual/jdk-1.8': {
72 + 'EAPI': '6',
73 + 'SLOT' : '1.8',
74 + 'RDEPEND' : '|| ( dev-java/icedtea:8 dev-java/oracle-jdk-bin:1.8 )',
75 + },
76 + 'dev-java/icedtea-3.6': {
77 + 'SLOT' : '8',
78 + },
79 + 'dev-java/oracle-jdk-bin-1.8': {
80 + 'SLOT' : '1.8',
81 + },
82 + 'dev-java/oracle-jre-bin-1.8': {
83 + 'SLOT' : '1.8',
84 + },
85 + 'dev-db/hsqldb-1.8' : {
86 + 'DEPEND' : 'virtual/jdk',
87 + 'RDEPEND' : 'virtual/jre',
88 + },
89 + }
90 +
91 + binpkgs = {
92 + 'dev-db/hsqldb-1.8' : {
93 + 'DEPEND' : 'virtual/jdk',
94 + 'RDEPEND' : 'virtual/jre',
95 + },
96 + }
97 +
98 + test_cases = (
99 + # Test bug 639346, where a redundant jre implementation
100 + # was pulled in because DEPEND was evaluated after
101 + # RDEPEND.
102 + ResolverPlaygroundTestCase(
103 + ['dev-db/hsqldb'],
104 + success=True,
105 + mergelist=[
106 + 'dev-java/icedtea-3.6',
107 + 'virtual/jdk-1.8',
108 + 'virtual/jre-1.8',
109 + 'dev-db/hsqldb-1.8',
110 + ],
111 + ),
112 +
113 + # The jdk is not needed with --usepkg, so the jre should
114 + # be preferred in this case.
115 + ResolverPlaygroundTestCase(
116 + ['dev-db/hsqldb'],
117 + options = {
118 + '--usepkg': True
119 + },
120 + success=True,
121 + mergelist=[
122 + 'dev-java/oracle-jre-bin-1.8',
123 + 'virtual/jre-1.8',
124 + '[binary]dev-db/hsqldb-1.8',
125 + ],
126 + ),
127 + )
128 +
129 + playground = ResolverPlayground(debug=False,
130 + binpkgs=binpkgs, ebuilds=ebuilds)
131 +
132 + try:
133 + for test_case in test_cases:
134 + playground.run_TestCase(test_case)
135 + self.assertEqual(test_case.test_success, True,
136 + test_case.fail_msg)
137 + finally:
138 + playground.debug = False
139 + playground.cleanup()
140 diff --git a/pym/portage/tests/resolver/test_onlydeps_minimal.py b/pym/portage/tests/resolver/test_onlydeps_minimal.py
141 index 13c79ed55..efda02c59 100644
142 --- a/pym/portage/tests/resolver/test_onlydeps_minimal.py
143 +++ b/pym/portage/tests/resolver/test_onlydeps_minimal.py
144 @@ -25,9 +25,10 @@ class OnlydepsMinimalTestCase(TestCase):
145 success = True,
146 options = { "--onlydeps": True,
147 "--onlydeps-with-rdeps": "y" },
148 - mergelist = ["dev-libs/B-1",
149 + ambiguous_merge_order = True,
150 + mergelist = [("dev-libs/B-1",
151 "dev-libs/C-1",
152 - "dev-libs/D-1"]),
153 + "dev-libs/D-1")]),
154 ResolverPlaygroundTestCase(
155 ["dev-libs/A"],
156 all_permutations = True,
157 --
158 2.13.6

Replies