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

Replies