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

Replies