Gentoo Archives: gentoo-portage-dev

From: Brian Dolbec <dolsen@g.o>
To: gentoo-portage-dev@l.g.o
Subject: Re: [gentoo-portage-dev] [PATCH] want_restart_for_use_change: backtrack only if needed (bug 632598)
Date: Mon, 02 Oct 2017 16:52:05
Message-Id: 20171002095200.0d9c65fe@professor-x
In Reply to: [gentoo-portage-dev] [PATCH] want_restart_for_use_change: backtrack only if needed (bug 632598) by Zac Medico
1 On Sat, 30 Sep 2017 19:48:21 -0700
2 Zac Medico <zmedico@g.o> wrote:
3
4 > Only backtrack if changes break a USE dependency. Prior
5 > to this fix, the included test case succeeded only with
6 > a --backtrack setting of 3 or more, but now it succeeds
7 > with a --backtrack setting of 2.
8 >
9 > X-Gentoo-bug: 632598
10 > X-Gentoo-bug-url: https://bugs.gentoo.org/632598
11 > ---
12 > pym/_emerge/depgraph.py | 13 +++-
13 > .../resolver/test_autounmask_use_backtrack.py | 86
14 > ++++++++++++++++++++++ 2 files changed, 95 insertions(+), 4
15 > deletions(-) create mode 100644
16 > pym/portage/tests/resolver/test_autounmask_use_backtrack.py
17 >
18 > diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
19 > index b0149c4dc..0b9b98dbb 100644
20 > --- a/pym/_emerge/depgraph.py
21 > +++ b/pym/_emerge/depgraph.py
22 > @@ -5972,11 +5972,16 @@ class depgraph(object):
23 >
24 > new_use, changes =
25 > self._dynamic_config._needed_use_config_changes.get(pkg) for ppkg,
26 > atom in parent_atoms:
27 > - if not atom.use or \
28 > - not any(x in
29 > atom.use.required for x in changes):
30 > + if not atom.use:
31 > continue
32 > - else:
33 > - return True
34 > +
35 > + # Backtrack only if changes break a
36 > USE dependency.
37 > + enabled = atom.use.enabled
38 > + disabled = atom.use.disabled
39 > + for k, v in changes.items():
40 > + want_enabled = k in enabled
41 > + if (want_enabled or k in
42 > disabled) and want_enabled != v:
43 > + return True
44 >
45 > return False
46 >
47 > diff --git
48 > a/pym/portage/tests/resolver/test_autounmask_use_backtrack.py
49 > b/pym/portage/tests/resolver/test_autounmask_use_backtrack.py new
50 > file mode 100644 index 000000000..83edeafa4 --- /dev/null
51 > +++ b/pym/portage/tests/resolver/test_autounmask_use_backtrack.py
52 > @@ -0,0 +1,86 @@
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 AutounmaskUseBacktrackTestCase(TestCase):
63 > +
64 > + def testAutounmaskUseBacktrack(self):
65 > + ebuilds = {
66 > + 'dev-libs/A-1': {
67 > + 'EAPI': '6',
68 > + 'RDEPEND': 'dev-libs/C',
69 > + },
70 > + 'dev-libs/A-2': {
71 > + 'EAPI': '6',
72 > + 'RDEPEND': 'dev-libs/C[y]',
73 > + },
74 > + 'dev-libs/A-3': {
75 > + 'EAPI': '6',
76 > + 'RDEPEND': 'dev-libs/C',
77 > + },
78 > + 'dev-libs/B-1': {
79 > + 'EAPI': '6',
80 > + 'RDEPEND': '<dev-libs/A-3',
81 > + },
82 > + 'dev-libs/C-1': {
83 > + 'EAPI': '6',
84 > + 'IUSE': 'x y z',
85 > + },
86 > + 'dev-libs/D-1': {
87 > + 'EAPI': '6',
88 > + 'RDEPEND': '>=dev-libs/A-2
89 > dev-libs/C[x]',
90 > + },
91 > + }
92 > +
93 > + installed = {
94 > + 'dev-libs/A-1': {
95 > + 'EAPI': '6',
96 > + 'RDEPEND': 'dev-libs/C',
97 > + },
98 > + 'dev-libs/B-1': {
99 > + 'EAPI': '6',
100 > + 'RDEPEND': '<dev-libs/A-3',
101 > + },
102 > + 'dev-libs/C-1': {
103 > + 'EAPI': '6',
104 > + 'IUSE': 'x y z',
105 > + },
106 > + }
107 > +
108 > + world = ['dev-libs/B']
109 > +
110 > + test_cases = (
111 > + # Test bug 632598, where autounmask USE
112 > changes triggered
113 > + # unnecessary backtracking. The following
114 > case should
115 > + # require a --backtrack setting no larger
116 > than 2.
117 > + ResolverPlaygroundTestCase(
118 > + ['dev-libs/D'],
119 > + options={
120 > + '--autounmask-backtrack':
121 > 'y',
122 > + '--backtrack': 2,
123 > + },
124 > + success=False,
125 > + ambiguous_merge_order=True,
126 > + mergelist=[
127 > + ('dev-libs/C-1',
128 > 'dev-libs/A-2'),
129 > + 'dev-libs/D-1',
130 > + ],
131 > + use_changes={'dev-libs/C-1': {'y':
132 > True, 'x': True}},
133 > + ),
134 > + )
135 > +
136 > + playground = ResolverPlayground(
137 > + ebuilds=ebuilds, installed=installed,
138 > world=world) +
139 > + try:
140 > + for test_case in test_cases:
141 > + playground.run_TestCase(test_case)
142 > +
143 > self.assertEqual(test_case.test_success, True,
144 > + test_case.fail_msg)
145 > + finally:
146 > + playground.cleanup()
147
148
149 Looks fine
150
151 --
152 Brian Dolbec <dolsen>

Replies