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 |