Merged from trunk -r14127:14130
authorFabian Groffen <grobian@gentoo.org>
Mon, 24 Aug 2009 09:42:25 +0000 (09:42 -0000)
committerFabian Groffen <grobian@gentoo.org>
Mon, 24 Aug 2009 09:42:25 +0000 (09:42 -0000)
   | 14128   | Make Scheduler._choose_pkg() prefer uninstall operations     |
   | zmedico | when available.                                              |

   | 14129   | In Scheduler._schedule_tasks_imp(), add uninstall operations |
   | zmedico | to the front of the merge queue.                             |

   | 14130   | Bug #282306 - Inside dblink._find_libs_to_preserve(), fall   |
   | zmedico | back to utf_8 encoding if a path cannot be encoded under the |
   |         | user's chosen encoding. This fixes the traceback shown in    |
   |         | bug 282115, comment #6.                                      |

svn path=/main/branches/prefix/; revision=14145

pym/_emerge/Scheduler.py
pym/portage/dbapi/vartree.py

index cbb52448a6d4c3be430a1ba863044e94249ba66e..bb2ed19d2c0f42da0e4a9c50ddae5cc1547646c7 100644 (file)
@@ -1164,13 +1164,23 @@ class Scheduler(PollScheduler):
                self._prune_digraph()
 
                chosen_pkg = None
-               later = set(self._pkg_queue)
+
+               # Prefer uninstall operations when available.
+               graph = self._digraph
                for pkg in self._pkg_queue:
-                       later.remove(pkg)
-                       if not self._dependent_on_scheduled_merges(pkg, later):
+                       if pkg.operation == 'uninstall' and \
+                               not graph.child_nodes(pkg):
                                chosen_pkg = pkg
                                break
 
+               if chosen_pkg is None:
+                       later = set(self._pkg_queue)
+                       for pkg in self._pkg_queue:
+                               later.remove(pkg)
+                               if not self._dependent_on_scheduled_merges(pkg, later):
+                                       chosen_pkg = pkg
+                                       break
+
                if chosen_pkg is not None:
                        self._pkg_queue.remove(chosen_pkg)
 
@@ -1350,7 +1360,7 @@ class Scheduler(PollScheduler):
                        if pkg.installed:
                                merge = PackageMerge(merge=task)
                                merge.addExitListener(self._merge_exit)
-                               self._task_queues.merge.add(merge)
+                               self._task_queues.merge.addFront(merge)
 
                        elif pkg.built:
                                self._jobs += 1
index 31f42b857da0a233d26c099989d625c87c693d01..a11cb39d2810942bb636d7d56852b0ed81bee92f 100644 (file)
@@ -3424,6 +3424,23 @@ class dblink(object):
                provider_nodes = set()
                # Create provider nodes and add them to the graph.
                for f_abs in old_contents:
+
+                       if os is _os_merge:
+                               try:
+                                       _unicode_encode(f_abs,
+                                               encoding=_encodings['merge'], errors='strict')
+                               except UnicodeEncodeError:
+                                       # The package appears to have been merged with a 
+                                       # different value of sys.getfilesystemencoding(),
+                                       # so fall back to utf_8 if appropriate.
+                                       try:
+                                               _unicode_encode(f_abs,
+                                                       encoding=_encodings['fs'], errors='strict')
+                                       except UnicodeEncodeError:
+                                               pass
+                                       else:
+                                               os = portage.os
+
                        f = f_abs[root_len:]
                        if self.isowner(f, root):
                                continue