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

Replies