Gentoo Archives: gentoo-portage-dev

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

Replies