Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r12578 - main/trunk/pym/_emerge
Date: Tue, 03 Feb 2009 22:58:19
Message-Id: E1LUUDh-0002eE-95@stork.gentoo.org
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