Lines 9642-9649
Link Here
|
9642 |
self._prune_digraph() |
9642 |
self._prune_digraph() |
9643 |
|
9643 |
|
9644 |
chosen_pkg = None |
9644 |
chosen_pkg = None |
|
|
9645 |
later = set(self._pkg_queue) |
9645 |
for pkg in self._pkg_queue: |
9646 |
for pkg in self._pkg_queue: |
9646 |
if not self._dependent_on_scheduled_merges(pkg): |
9647 |
later.remove(pkg) |
|
|
9648 |
if not self._dependent_on_scheduled_merges(pkg, later): |
9647 |
chosen_pkg = pkg |
9649 |
chosen_pkg = pkg |
9648 |
break |
9650 |
break |
9649 |
|
9651 |
|
Lines 9658-9667
Link Here
|
9658 |
|
9660 |
|
9659 |
return chosen_pkg |
9661 |
return chosen_pkg |
9660 |
|
9662 |
|
9661 |
def _dependent_on_scheduled_merges(self, pkg): |
9663 |
def _dependent_on_scheduled_merges(self, pkg, later): |
9662 |
""" |
9664 |
""" |
9663 |
Traverse the subgraph of the given packages deep dependencies |
9665 |
Traverse the subgraph of the given packages deep dependencies |
9664 |
to see if it contains any scheduled merges. |
9666 |
to see if it contains any scheduled merges. |
|
|
9667 |
@param pkg: a package to check dependencies for |
9668 |
@type pkg: Package |
9669 |
@param later: packages for which dependence should be ignored |
9670 |
since they will be merged later than pkg anyway and therefore |
9671 |
delaying the merge of pkg will not result in a more optimal |
9672 |
merge order |
9673 |
@type later: set |
9665 |
@rtype: bool |
9674 |
@rtype: bool |
9666 |
@returns: True if the package is dependent, False otherwise. |
9675 |
@returns: True if the package is dependent, False otherwise. |
9667 |
""" |
9676 |
""" |
Lines 9671-9684
Link Here
|
9671 |
|
9680 |
|
9672 |
dependent = False |
9681 |
dependent = False |
9673 |
traversed_nodes = set([pkg]) |
9682 |
traversed_nodes = set([pkg]) |
9674 |
node_stack = graph.child_nodes(pkg) |
9683 |
direct_deps = graph.child_nodes(pkg) |
|
|
9684 |
node_stack = direct_deps |
9685 |
direct_deps = frozenset(direct_deps) |
9675 |
while node_stack: |
9686 |
while node_stack: |
9676 |
node = node_stack.pop() |
9687 |
node = node_stack.pop() |
9677 |
if node in traversed_nodes: |
9688 |
if node in traversed_nodes: |
9678 |
continue |
9689 |
continue |
9679 |
traversed_nodes.add(node) |
9690 |
traversed_nodes.add(node) |
9680 |
if not (node.installed and node.operation == "nomerge") and \ |
9691 |
if not ((node.installed and node.operation == "nomerge") or \ |
9681 |
node not in completed_tasks: |
9692 |
(node.operation == "uninstall" and \ |
|
|
9693 |
node not in direct_deps) or \ |
9694 |
node in completed_tasks or \ |
9695 |
node in later): |
9682 |
dependent = True |
9696 |
dependent = True |
9683 |
break |
9697 |
break |
9684 |
node_stack.extend(graph.child_nodes(node)) |
9698 |
node_stack.extend(graph.child_nodes(node)) |