public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532)
@ 2015-05-09  5:57 Zac Medico
  2015-05-09  7:22 ` Brian Dolbec
  0 siblings, 1 reply; 2+ messages in thread
From: Zac Medico @ 2015-05-09  5:57 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: 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



^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532)
  2015-05-09  5:57 [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532) Zac Medico
@ 2015-05-09  7:22 ` Brian Dolbec
  0 siblings, 0 replies; 2+ messages in thread
From: Brian Dolbec @ 2015-05-09  7:22 UTC (permalink / raw
  To: gentoo-portage-dev

On Fri,  8 May 2015 22:57:36 -0700
Zac Medico <zmedico@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>



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-05-09  7:22 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-05-09  5:57 [gentoo-portage-dev] [PATCH] VdbMetadataDelta.applyDelta: handle "remove" events properly (bug 547532) Zac Medico
2015-05-09  7:22 ` Brian Dolbec

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox