public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-commits] portage r9992 - in main/trunk/pym: _emerge portage
@ 2008-04-27  6:31 Zac Medico (zmedico)
  0 siblings, 0 replies; only message in thread
From: Zac Medico (zmedico) @ 2008-04-27  6:31 UTC (permalink / raw
  To: gentoo-commits

Author: zmedico
Date: 2008-04-27 06:31:11 +0000 (Sun, 27 Apr 2008)
New Revision: 9992

Modified:
   main/trunk/pym/_emerge/__init__.py
   main/trunk/pym/portage/__init__.py
Log:
Create a digraph.difference_update() method and use it to amortize the
cost of removing nodes from the digraph.order list.


Modified: main/trunk/pym/_emerge/__init__.py
===================================================================
--- main/trunk/pym/_emerge/__init__.py	2008-04-27 00:44:34 UTC (rev 9991)
+++ main/trunk/pym/_emerge/__init__.py	2008-04-27 06:31:11 UTC (rev 9992)
@@ -3312,16 +3312,18 @@
 		# otherwise they slow down merge order calculation. Don't remove
 		# non-root nodes since they help optimize merge order in some cases
 		# such as revdep-rebuild.
+		removed_nodes = set()
 		while True:
-			removed_something = False
 			for node in mygraph.root_nodes():
 				if not isinstance(node, Package) or \
 					node.installed or node.onlydeps:
-					self.spinner.update()
-					mygraph.remove(node)
-					removed_something = True
-			if not removed_something:
+					removed_nodes.add(node)
+			if removed_nodes:
+				self.spinner.update()
+				mygraph.difference_update(removed_nodes)
+			if not removed_nodes:
 				break
+			removed_nodes.clear()
 		self._merge_order_bias(mygraph)
 		def cmp_circular_bias(n1, n2):
 			"""
@@ -3671,6 +3673,8 @@
 			prefer_asap = True
 			accept_root_node = False
 
+			mygraph.difference_update(selected_nodes)
+
 			for node in selected_nodes:
 
 				# Handle interactions between blockers
@@ -3706,7 +3710,7 @@
 
 				if node[-1] != "nomerge":
 					retlist.append(node)
-				mygraph.remove(node)
+
 				if isinstance(node, Uninstall):
 					# Include satisfied blockers in the merge list so
 					# that the user can see why the package had to be

Modified: main/trunk/pym/portage/__init__.py
===================================================================
--- main/trunk/pym/portage/__init__.py	2008-04-27 00:44:34 UTC (rev 9991)
+++ main/trunk/pym/portage/__init__.py	2008-04-27 06:31:11 UTC (rev 9992)
@@ -389,6 +389,26 @@
 		del self.nodes[node]
 		self.order.remove(node)
 
+	def difference_update(self, t):
+		"""
+		Remove all given nodes from node_set. This is more efficient
+		than multiple calls to the remove() method.
+		"""
+		if isinstance(t, (list, tuple)) or \
+			not hasattr(t, "__contains__"):
+			t = frozenset(t)
+		order = []
+		for node in self.order:
+			if node not in t:
+				order.append(node)
+				continue
+			for parent in self.nodes[node][1]:
+				del self.nodes[parent][0][node]
+			for child in self.nodes[node][0]:
+				del self.nodes[child][1][node]
+			del self.nodes[node]
+		self.order = order
+
 	def remove_edge(self, child, parent):
 		"""
 		Remove edge in the direction from child to parent. Note that it is

-- 
gentoo-commits@lists.gentoo.org mailing list



^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-04-27  6:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-27  6:31 [gentoo-commits] portage r9992 - in main/trunk/pym: _emerge portage Zac Medico (zmedico)

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