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