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: trigger slot operator rebuilds via _complete_graph (bug 614390)
Date: Sat, 01 Apr 2017 05:06:13
Message-Id: 20170331220606.602835fa.dolsen@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH] depgraph: trigger slot operator rebuilds via _complete_graph (bug 614390) by Zac Medico
1 On Fri, 31 Mar 2017 21:11:41 -0700
2 Zac Medico <zmedico@g.o> wrote:
3
4 > Fix _complete_graph to trigger rebuilds of parent packages when they
5 > pull in installed packages that had already been scheduled for rebuild
6 > by the previous calculation.
7 >
8 > X-Gentoo-bug: 614390
9 > X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=614390
10 > ---
11 > pym/_emerge/depgraph.py | 15 +++
12 > .../resolver/test_slot_operator_complete_graph.py | 141
13 > +++++++++++++++++++++ 2 files changed, 156 insertions(+)
14 > create mode 100644
15 > pym/portage/tests/resolver/test_slot_operator_complete_graph.py
16 >
17 > diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
18 > index 04e724d..8a614c4 100644
19 > --- a/pym/_emerge/depgraph.py
20 > +++ b/pym/_emerge/depgraph.py
21 > @@ -6649,6 +6649,21 @@ class depgraph(object):
22 > # will be appropriately reported as
23 > a slot collision # (possibly solvable via backtracking).
24 > pkg = matches[-1] # highest match
25 > +
26 > + if
27 > (self._dynamic_config._allow_backtracking and
28 > + not
29 > self._want_installed_pkg(pkg) and (dep.atom.soname or (
30 > + dep.atom.package and
31 > dep.atom.slot_operator_built))):
32 > + # If pkg was already
33 > scheduled for rebuild by the previous
34 > + # calculation, then pulling
35 > in the installed instance will
36 > + # trigger a slot conflict
37 > that may go unsolved. Therefore,
38 > + # trigger a rebuild of the
39 > parent if appropriate.
40 > + dep.child = pkg
41 > + new_dep =
42 > self._slot_operator_update_probe(dep)
43 > + if new_dep is not None:
44 > +
45 > self._slot_operator_update_backtrack(
46 > + dep,
47 > new_dep=new_dep)
48 > + continue
49 > +
50 > if not self._add_pkg(pkg, dep):
51 > return 0
52 > if not
53 > self._create_graph(allow_unsatisfied=True): diff --git
54 > a/pym/portage/tests/resolver/test_slot_operator_complete_graph.py
55 > b/pym/portage/tests/resolver/test_slot_operator_complete_graph.py new
56 > file mode 100644 index 0000000..1d59bce --- /dev/null
57 > +++ b/pym/portage/tests/resolver/test_slot_operator_complete_graph.py
58 > @@ -0,0 +1,141 @@
59 > +# Copyright 2017 Gentoo Foundation
60 > +# Distributed under the terms of the GNU General Public License v2
61 > +
62 > +from portage.tests import TestCase
63 > +from portage.tests.resolver.ResolverPlayground import (
64 > + ResolverPlayground,
65 > + ResolverPlaygroundTestCase,
66 > +)
67 > +
68 > +class SlotOperatorCompleteGraphTestCase(TestCase):
69 > +
70 > + def testSlotOperatorCompleteGraph(self):
71 > +
72 > + ebuilds = {
73 > + "app-misc/meta-pkg-2" : {
74 > + "EAPI": "6",
75 > + "DEPEND": "=app-misc/B-2
76 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-2",
77 > + "RDEPEND": "=app-misc/B-2
78 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-2",
79 > + },
80 > +
81 > + "app-misc/meta-pkg-1" : {
82 > + "EAPI": "6",
83 > + "DEPEND": "=app-misc/B-1
84 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1",
85 > + "RDEPEND": "=app-misc/B-1
86 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1",
87 > + },
88 > +
89 > + "app-misc/B-1" : {
90 > + "EAPI": "6",
91 > + "DEPEND": "dev-libs/foo:=",
92 > + "RDEPEND": "dev-libs/foo:=",
93 > + },
94 > +
95 > + "app-misc/B-2" : {
96 > + "EAPI": "6",
97 > + "DEPEND": "dev-libs/foo:=",
98 > + "RDEPEND": "dev-libs/foo:=",
99 > + },
100 > +
101 > + "app-misc/C-1" : {
102 > + "EAPI": "6",
103 > + "DEPEND": "dev-libs/foo:=
104 > app-misc/B",
105 > + "RDEPEND": "dev-libs/foo:=
106 > app-misc/B",
107 > + },
108 > +
109 > + "app-misc/C-2" : {
110 > + "EAPI": "6",
111 > + "DEPEND": "dev-libs/foo:=
112 > app-misc/B",
113 > + "RDEPEND": "dev-libs/foo:=
114 > app-misc/B",
115 > + },
116 > +
117 > + "app-misc/D-1" : {
118 > + "EAPI": "6",
119 > + "DEPEND": "dev-libs/foo:=",
120 > + "RDEPEND": "dev-libs/foo:=",
121 > + },
122 > +
123 > + "app-misc/D-2" : {
124 > + "EAPI": "6",
125 > + "DEPEND": "dev-libs/foo:=",
126 > + "RDEPEND": "dev-libs/foo:=",
127 > + },
128 > +
129 > + "dev-libs/foo-1" : {
130 > + "EAPI": "6",
131 > + "SLOT": "0/1",
132 > + },
133 > +
134 > + "dev-libs/foo-2" : {
135 > + "EAPI": "6",
136 > + "SLOT": "0/2",
137 > + },
138 > + }
139 > +
140 > + installed = {
141 > + "app-misc/meta-pkg-1" : {
142 > + "EAPI": "6",
143 > + "DEPEND": "=app-misc/B-1
144 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1",
145 > + "RDEPEND": "=app-misc/B-1
146 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1",
147 > + },
148 > +
149 > + "app-misc/B-1" : {
150 > + "EAPI": "6",
151 > + "DEPEND": "dev-libs/foo:0/1=",
152 > + "RDEPEND": "dev-libs/foo:0/1=",
153 > + },
154 > +
155 > + "app-misc/C-1" : {
156 > + "EAPI": "6",
157 > + "DEPEND": "dev-libs/foo:0/1=
158 > app-misc/B",
159 > + "RDEPEND": "dev-libs/foo:0/1=
160 > app-misc/B",
161 > + },
162 > +
163 > + "app-misc/D-1" : {
164 > + "EAPI": "6",
165 > + "DEPEND": "dev-libs/foo:0/1=",
166 > + "RDEPEND": "dev-libs/foo:0/1=",
167 > + },
168 > +
169 > + "dev-libs/foo-1" : {
170 > + "EAPI": "6",
171 > + "SLOT": "0/1",
172 > + },
173 > + }
174 > +
175 > + world = (
176 > + "app-misc/meta-pkg",
177 > + )
178 > +
179 > + test_cases = (
180 > + # Test bug 614390, where the
181 > depgraph._complete_graph
182 > + # method pulled in an installed package that
183 > had been
184 > + # scheduled for rebuild by the previous
185 > calculation,
186 > + # triggering an unsolved slot conflict and
187 > preventing
188 > + # slot operator rebuilds.
189 > + ResolverPlaygroundTestCase(
190 > + ["=app-misc/meta-pkg-2",
191 > "app-misc/C"],
192 > + options = {
193 > + "--backtrack": 5,
194 > + },
195 > + success = True,
196 > + ambiguous_merge_order = True,
197 > + mergelist = [
198 > + 'dev-libs/foo-2',
199 > + ('app-misc/D-1',
200 > 'app-misc/C-1', 'app-misc/B-2'),
201 > + 'app-misc/meta-pkg-2',
202 > + ]
203 > + ),
204 > + )
205 > +
206 > + playground = ResolverPlayground(debug=False,
207 > + ebuilds=ebuilds, installed=installed,
208 > + world=world)
209 > + try:
210 > + for test_case in test_cases:
211 > + playground.run_TestCase(test_case)
212 > +
213 > self.assertEqual(test_case.test_success, True,
214 > + test_case.fail_msg)
215 > + finally:
216 > + # Disable debug so that cleanup works.
217 > + playground.debug = False
218 > + playground.cleanup()
219
220 looks good. I look forward to getting less conflicts with this...
221
222 --
223 Brian Dolbec <dolsen>

Replies