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 |