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)
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
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