Re: [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle remove events properly (bug 547532)

2015-05-09 Thread Brian Dolbec
On Fri,  8 May 2015 22:57:36 -0700
Zac Medico zmed...@gentoo.org wrote:

 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
 ---
  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

looks good


-- 
Brian Dolbec dolsen




[gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle remove events properly (bug 547532)

2015-05-08 Thread Zac Medico
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
---
 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
-- 
2.3.5