1 |
This fixes a case inside _slot_operator_update_probe where it would |
2 |
select an inappropriate replacement_parent of a lower version than |
3 |
desired. The problem is solved by rejecting replacement_parent if its |
4 |
version is lower than the existing parent, and a downgrade is not |
5 |
desired. |
6 |
|
7 |
X-Gentoo-Bug: 528610 |
8 |
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=528610 |
9 |
--- |
10 |
pym/_emerge/depgraph.py | 8 +++ |
11 |
..._slot_operator_update_probe_parent_downgrade.py | 68 ++++++++++++++++++++++ |
12 |
2 files changed, 76 insertions(+) |
13 |
create mode 100644 pym/portage/tests/resolver/test_slot_operator_update_probe_parent_downgrade.py |
14 |
|
15 |
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py |
16 |
index 94eaed8..2a839d0 100644 |
17 |
--- a/pym/_emerge/depgraph.py |
18 |
+++ b/pym/_emerge/depgraph.py |
19 |
@@ -1659,6 +1659,7 @@ class depgraph(object): |
20 |
debug = "--debug" in self._frozen_config.myopts |
21 |
selective = "selective" in self._dynamic_config.myparams |
22 |
want_downgrade = None |
23 |
+ want_downgrade_parent = None |
24 |
|
25 |
def check_reverse_dependencies(existing_pkg, candidate_pkg, |
26 |
replacement_parent=None): |
27 |
@@ -1706,6 +1707,13 @@ class depgraph(object): |
28 |
for replacement_parent in self._iter_similar_available(dep.parent, |
29 |
dep.parent.slot_atom, autounmask_level=autounmask_level): |
30 |
|
31 |
+ if replacement_parent < dep.parent: |
32 |
+ if want_downgrade_parent is None: |
33 |
+ want_downgrade_parent = self._downgrade_probe( |
34 |
+ dep.parent) |
35 |
+ if not want_downgrade_parent: |
36 |
+ continue |
37 |
+ |
38 |
if not check_reverse_dependencies(dep.parent, replacement_parent): |
39 |
continue |
40 |
|
41 |
diff --git a/pym/portage/tests/resolver/test_slot_operator_update_probe_parent_downgrade.py b/pym/portage/tests/resolver/test_slot_operator_update_probe_parent_downgrade.py |
42 |
new file mode 100644 |
43 |
index 0000000..2ec15b6 |
44 |
--- /dev/null |
45 |
+++ b/pym/portage/tests/resolver/test_slot_operator_update_probe_parent_downgrade.py |
46 |
@@ -0,0 +1,68 @@ |
47 |
+# Copyright 2014 Gentoo Foundation |
48 |
+# Distributed under the terms of the GNU General Public License v2 |
49 |
+ |
50 |
+from portage.tests import TestCase |
51 |
+from portage.tests.resolver.ResolverPlayground import \ |
52 |
+ ResolverPlayground, ResolverPlaygroundTestCase |
53 |
+ |
54 |
+class SlotOperatorUpdateProbeParentDowngradeTestCase(TestCase): |
55 |
+ |
56 |
+ def testSlotOperatorUpdateProbeParentDowngrade(self): |
57 |
+ |
58 |
+ ebuilds = { |
59 |
+ "net-nds/openldap-2.4.40-r3": { |
60 |
+ "EAPI": "5", |
61 |
+ "RDEPEND": "<sys-libs/db-6.0:= " + \ |
62 |
+ "|| ( sys-libs/db:5.3 sys-libs/db:5.1 )" |
63 |
+ }, |
64 |
+ "net-nds/openldap-2.4.40": { |
65 |
+ "EAPI": "5", |
66 |
+ "RDEPEND": "sys-libs/db" |
67 |
+ }, |
68 |
+ "sys-libs/db-6.0": { |
69 |
+ "SLOT": "6.0", |
70 |
+ }, |
71 |
+ "sys-libs/db-5.3": { |
72 |
+ "SLOT": "5.3", |
73 |
+ }, |
74 |
+ } |
75 |
+ |
76 |
+ installed = { |
77 |
+ "net-nds/openldap-2.4.40-r3": { |
78 |
+ "EAPI": "5", |
79 |
+ "RDEPEND": "<sys-libs/db-6.0:5.3/5.3= " + \ |
80 |
+ "|| ( sys-libs/db:5.3 sys-libs/db:5.1 )" |
81 |
+ }, |
82 |
+ "sys-libs/db-6.0": { |
83 |
+ "SLOT": "6.0", |
84 |
+ }, |
85 |
+ "sys-libs/db-5.3": { |
86 |
+ "SLOT": "5.3", |
87 |
+ }, |
88 |
+ } |
89 |
+ |
90 |
+ world = ( |
91 |
+ "net-nds/openldap", |
92 |
+ ) |
93 |
+ |
94 |
+ test_cases = ( |
95 |
+ # bug 528610 - openldap rebuild was triggered |
96 |
+ # inappropriately, due to slot_operator_update_probe |
97 |
+ # selecting an inappropriate replacement parent of |
98 |
+ # a lower version than desired. |
99 |
+ ResolverPlaygroundTestCase( |
100 |
+ ["@world"], |
101 |
+ success = True, |
102 |
+ options = { "--update": True, "--deep": True }, |
103 |
+ mergelist = []), |
104 |
+ ) |
105 |
+ |
106 |
+ playground = ResolverPlayground(ebuilds=ebuilds, |
107 |
+ installed=installed, world=world, debug=False) |
108 |
+ try: |
109 |
+ for test_case in test_cases: |
110 |
+ playground.run_TestCase(test_case) |
111 |
+ self.assertEqual(test_case.test_success, |
112 |
+ True, test_case.fail_msg) |
113 |
+ finally: |
114 |
+ playground.cleanup() |
115 |
-- |
116 |
2.0.4 |