Gentoo Archives: gentoo-portage-dev

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