In depgraph._serialize_tasks(), when appropriate, execute uninstall tasks
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 05:12:20 +0000 (05:12 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 05:12:20 +0000 (05:12 -0000)
sooner. This solves some cases of bug #256870 since there is a smaller window
of time for some other failure to cause the uninstall to get discarded.
(trunk r12611)

svn path=/main/branches/2.1.6/; revision=12889

pym/_emerge/__init__.py

index 0d94025bd07deb7b8533a147c6257dfb5793d6a2..9ff89d5238b1e82941280a415e81e3c298b019ad 100644 (file)
@@ -6925,10 +6925,21 @@ class depgraph(object):
                                                # and we want to avoid executing a separate uninstall
                                                # task in that case.
                                                if len(nodes) > 1:
-                                                       non_uninstalls = [node for node in nodes \
-                                                               if node.operation != "uninstall"]
-                                                       if non_uninstalls:
-                                                               nodes = non_uninstalls
+                                                       good_uninstalls = []
+                                                       with_some_uninstalls_excluded = []
+                                                       for node in nodes:
+                                                               if node.operation == "uninstall":
+                                                                       slot_node = self.mydbapi[node.root
+                                                                               ].match_pkgs(node.slot_atom)
+                                                                       if slot_node and \
+                                                                               slot_node[0].operation == "merge":
+                                                                               continue
+                                                                       good_uninstalls.append(node)
+                                                               with_some_uninstalls_excluded.append(node)
+                                                       if good_uninstalls:
+                                                               nodes = good_uninstalls
+                                                       elif with_some_uninstalls_excluded:
+                                                               nodes = with_some_uninstalls_excluded
                                                        else:
                                                                nodes = nodes