Gentoo Archives: gentoo-portage-dev

From: Brian Dolbec <dolsen@g.o>
To: gentoo-portage-dev@l.g.o
Subject: Re: [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532)
Date: Sat, 09 May 2015 07:22:19
Message-Id: 20150509002212.575ebd57.dolsen@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532) by Zac Medico
1 On Fri, 8 May 2015 22:57:36 -0700
2 Zac Medico <zmedico@g.o> wrote:
3
4 > Since commit d800d224ab38c0f524d3fe858ebe201cbfa903c1, emerge --search
5 > could report removed packages as installed, since applyDelta failed to
6 > apply "remove" events unless the cpv exactly matched. Fix it to apply
7 > the "remove" event to each affected package slot, using the same code
8 > which is used to handle replaced packages for "add" events.
9 >
10 > Fixes: d800d224ab38 ("Log changes between vdb_metadata.pickle
11 > updates") X-Gentoo-Bug: 547532
12 > X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=547532
13 > ---
14 > pym/portage/dbapi/_VdbMetadataDelta.py | 39
15 > ++++++++++++++++++---------------- 1 file changed, 21 insertions(+),
16 > 18 deletions(-)
17 >
18 > diff --git a/pym/portage/dbapi/_VdbMetadataDelta.py
19 > b/pym/portage/dbapi/_VdbMetadataDelta.py index 2dbb07a..7461f87 100644
20 > --- a/pym/portage/dbapi/_VdbMetadataDelta.py
21 > +++ b/pym/portage/dbapi/_VdbMetadataDelta.py
22 > @@ -139,12 +139,12 @@ class VdbMetadataDelta(object):
23 >
24 > def applyDelta(self, data):
25 > packages = self._vardb._aux_cache["packages"]
26 > - added_slots = {}
27 > + deltas = {}
28 > for delta in data["deltas"]:
29 > cpv = delta["package"] + "-" +
30 > delta["version"]
31 > + deltas[cpv] = delta
32 > event = delta["event"]
33 > if event == "add":
34 > - added_slots[cpv] = delta
35 > # Use aux_get to populate the cache
36 > # for this cpv.
37 > if cpv not in packages:
38 > @@ -155,19 +155,22 @@ class VdbMetadataDelta(object):
39 > elif event == "remove":
40 > packages.pop(cpv, None)
41 >
42 > - # Remove replaced versions from updated slots
43 > - for cached_cpv, (mtime, metadata) in
44 > list(packages.items()):
45 > - if cached_cpv in added_slots:
46 > - continue
47 > - replaced = False
48 > - for cpv, delta in added_slots.items():
49 > - if
50 > (cached_cpv.startswith(delta["package"]) and
51 > - metadata.get("SLOT") ==
52 > delta["slot"] and
53 > - cpv_getkey(cached_cpv) ==
54 > delta["package"]):
55 > - replaced = True
56 > - break
57 > - if replaced:
58 > - del packages[cached_cpv]
59 > - del added_slots[cpv]
60 > - if not added_slots:
61 > - break
62 > + if deltas:
63 > + # Delete removed or replaced versions from
64 > affected slots
65 > + for cached_cpv, (mtime, metadata) in
66 > list(packages.items()):
67 > + if cached_cpv in deltas:
68 > + continue
69 > +
70 > + removed = False
71 > + for cpv, delta in deltas.items():
72 > + if
73 > (cached_cpv.startswith(delta["package"]) and
74 > + metadata.get("SLOT")
75 > == delta["slot"] and
76 > +
77 > cpv_getkey(cached_cpv) == delta["package"]):
78 > + removed = True
79 > + break
80 > +
81 > + if removed:
82 > + del packages[cached_cpv]
83 > + del deltas[cpv]
84 > + if not deltas:
85 > + break
86
87 looks good
88
89
90 --
91 Brian Dolbec <dolsen>