1 |
Author: zmedico |
2 |
Date: 2009-02-03 22:58:16 +0000 (Tue, 03 Feb 2009) |
3 |
New Revision: 12578 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Bug #256616 - Also consider deep runtime dependencies of system packages when |
9 |
adding packages to merge_wait_queue. |
10 |
|
11 |
|
12 |
Modified: main/trunk/pym/_emerge/__init__.py |
13 |
=================================================================== |
14 |
--- main/trunk/pym/_emerge/__init__.py 2009-02-03 21:46:23 UTC (rev 12577) |
15 |
+++ main/trunk/pym/_emerge/__init__.py 2009-02-03 22:58:16 UTC (rev 12578) |
16 |
@@ -9790,6 +9790,11 @@ |
17 |
# empty. |
18 |
self._merge_wait_scheduled = [] |
19 |
|
20 |
+ # Holds system packages and their deep runtime dependencies. Before |
21 |
+ # being merged, these packages go to merge_wait_queue, to be merged |
22 |
+ # when no other packages are building. |
23 |
+ self._deep_system_deps = set() |
24 |
+ |
25 |
self._status_display = JobStatusDisplay() |
26 |
self._max_load = myopts.get("--load-average") |
27 |
max_jobs = myopts.get("--jobs") |
28 |
@@ -9964,9 +9969,44 @@ |
29 |
return |
30 |
|
31 |
self._digraph = digraph |
32 |
+ self._find_system_deps() |
33 |
self._prune_digraph() |
34 |
self._prevent_builddir_collisions() |
35 |
|
36 |
+ def _find_system_deps(self): |
37 |
+ """ |
38 |
+ Find system packages and their deep runtime dependencies. Before being |
39 |
+ merged, these packages go to merge_wait_queue, to be merged when no |
40 |
+ other packages are building. |
41 |
+ """ |
42 |
+ graph = self._digraph |
43 |
+ deep_system_deps = self._deep_system_deps |
44 |
+ deep_system_deps.clear() |
45 |
+ node_stack = [] |
46 |
+ for node in graph.order: |
47 |
+ if not isinstance(node, Package) or \ |
48 |
+ node.operation == "uninstall": |
49 |
+ continue |
50 |
+ system_set = node.root_config.sets["system"] |
51 |
+ if system_set.findAtomForPackage(node): |
52 |
+ node_stack.append(node) |
53 |
+ |
54 |
+ while node_stack: |
55 |
+ node = node_stack.pop() |
56 |
+ if node in deep_system_deps: |
57 |
+ continue |
58 |
+ deep_system_deps.add(node) |
59 |
+ # TODO: Only traverse runtime deps since we aren't concerned about |
60 |
+ # buildtime deps here. |
61 |
+ for child in graph.child_nodes(node): |
62 |
+ if not isinstance(child, Package) or \ |
63 |
+ child.operation == "uninstall": |
64 |
+ continue |
65 |
+ node_stack.append(child) |
66 |
+ |
67 |
+ deep_system_deps.difference_update([pkg for pkg in \ |
68 |
+ deep_system_deps if pkg.operation != "merge"]) |
69 |
+ |
70 |
def _prune_digraph(self): |
71 |
""" |
72 |
Prune any root nodes that are irrelevant. |
73 |
@@ -10572,8 +10612,8 @@ |
74 |
if build.returncode == os.EX_OK: |
75 |
self.curval += 1 |
76 |
merge = PackageMerge(merge=build) |
77 |
- system_set = build.pkg.root_config.sets["system"] |
78 |
- if system_set.findAtomForPackage(build.pkg): |
79 |
+ if not build.build_opts.buildpkgonly and \ |
80 |
+ build.pkg in self._deep_system_deps: |
81 |
# Since dependencies on system packages are frequently |
82 |
# unspecified, merge them only when no builds are executing. |
83 |
self._merge_wait_queue.append(merge) |
84 |
@@ -10629,6 +10669,7 @@ |
85 |
def _main_loop_cleanup(self): |
86 |
del self._pkg_queue[:] |
87 |
self._completed_tasks.clear() |
88 |
+ self._deep_system_deps.clear() |
89 |
self._choose_pkg_return_early = False |
90 |
self._status_display.reset() |
91 |
self._digraph = None |