Gentoo Archives: gentoo-commits

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