Re: [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle remove events properly (bug 547532)
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)
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