commit:     8207c1ea97456f71fc32e2c264be27b348677853
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat May  9 05:46:04 2015 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat May  9 07:31:56 2015 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=8207c1ea

VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532)

Since commit d800d224ab38c0f524d3fe858ebe201cbfa903c1, emerge --search
could report removed packages as installed, since applyDelta failed to
apply "remove" events unless the cpv exactly matched. Fix it to apply
the "remove" event to each affected package slot, using the same code
which is used to handle replaced packages for "add" events.

Fixes: d800d224ab38 ("Log changes between vdb_metadata.pickle updates")
X-Gentoo-Bug: 547532
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=547532
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>

 pym/portage/dbapi/_VdbMetadataDelta.py | 39 ++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git a/pym/portage/dbapi/_VdbMetadataDelta.py 
b/pym/portage/dbapi/_VdbMetadataDelta.py
index 2dbb07a..7461f87 100644
--- a/pym/portage/dbapi/_VdbMetadataDelta.py
+++ b/pym/portage/dbapi/_VdbMetadataDelta.py
@@ -139,12 +139,12 @@ class VdbMetadataDelta(object):
 
        def applyDelta(self, data):
                packages = self._vardb._aux_cache["packages"]
-               added_slots = {}
+               deltas = {}
                for delta in data["deltas"]:
                        cpv = delta["package"] + "-" + delta["version"]
+                       deltas[cpv] = delta
                        event = delta["event"]
                        if event == "add":
-                               added_slots[cpv] = delta
                                # Use aux_get to populate the cache
                                # for this cpv.
                                if cpv not in packages:
@@ -155,19 +155,22 @@ class VdbMetadataDelta(object):
                        elif event == "remove":
                                packages.pop(cpv, None)
 
-               # Remove replaced versions from updated slots
-               for cached_cpv, (mtime, metadata) in list(packages.items()):
-                       if cached_cpv in added_slots:
-                               continue
-                       replaced = False
-                       for cpv, delta in added_slots.items():
-                               if (cached_cpv.startswith(delta["package"]) and
-                                       metadata.get("SLOT") == delta["slot"] 
and
-                                       cpv_getkey(cached_cpv) == 
delta["package"]):
-                                       replaced = True
-                                       break
-                       if replaced:
-                               del packages[cached_cpv]
-                               del added_slots[cpv]
-                               if not added_slots:
-                                       break
+               if deltas:
+                       # Delete removed or replaced versions from affected 
slots
+                       for cached_cpv, (mtime, metadata) in 
list(packages.items()):
+                               if cached_cpv in deltas:
+                                       continue
+
+                               removed = False
+                               for cpv, delta in deltas.items():
+                                       if 
(cached_cpv.startswith(delta["package"]) and
+                                               metadata.get("SLOT") == 
delta["slot"] and
+                                               cpv_getkey(cached_cpv) == 
delta["package"]):
+                                               removed = True
+                                               break
+
+                               if removed:
+                                       del packages[cached_cpv]
+                                       del deltas[cpv]
+                                       if not deltas:
+                                               break

Reply via email to