1 |
Author: zmedico |
2 |
Date: 2009-07-28 23:27:52 +0000 (Tue, 28 Jul 2009) |
3 |
New Revision: 13852 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/depgraph.py |
7 |
Log: |
8 |
When backtracking due to an unsatisfied dependency, show a normal unsatisfied |
9 |
dependency message for the given atom. Thanks to Thomas Sachau |
10 |
<tommy@g.o> for reporting. |
11 |
|
12 |
|
13 |
Modified: main/trunk/pym/_emerge/depgraph.py |
14 |
=================================================================== |
15 |
--- main/trunk/pym/_emerge/depgraph.py 2009-07-25 09:33:18 UTC (rev 13851) |
16 |
+++ main/trunk/pym/_emerge/depgraph.py 2009-07-28 23:27:52 UTC (rev 13852) |
17 |
@@ -276,6 +276,8 @@ |
18 |
'--debug' not in self._frozen_config.myopts: |
19 |
return |
20 |
|
21 |
+ # In order to minimize noise, show only the highest |
22 |
+ # missed update from each SLOT. |
23 |
missed_updates = {} |
24 |
for pkg, mask_reasons in \ |
25 |
self._dynamic_config._runtime_pkg_mask.iteritems(): |
26 |
@@ -284,24 +286,63 @@ |
27 |
# want to show available updates. |
28 |
continue |
29 |
if pkg.slot_atom in missed_updates: |
30 |
- other_pkg, parent_atoms = missed_updates[pkg.slot_atom] |
31 |
+ other_pkg, mask_type, parent_atoms = \ |
32 |
+ missed_updates[pkg.slot_atom] |
33 |
if other_pkg > pkg: |
34 |
continue |
35 |
for mask_type, parent_atoms in mask_reasons.iteritems(): |
36 |
if not parent_atoms: |
37 |
continue |
38 |
- missed_updates[pkg.slot_atom] = (pkg, parent_atoms) |
39 |
+ missed_updates[pkg.slot_atom] = (pkg, mask_type, parent_atoms) |
40 |
break |
41 |
|
42 |
if not missed_updates: |
43 |
return |
44 |
|
45 |
+ missed_update_types = {} |
46 |
+ for pkg, mask_type, parent_atoms in missed_updates.itervalues(): |
47 |
+ missed_update_types.setdefault(mask_type, |
48 |
+ []).append((pkg, parent_atoms)) |
49 |
+ |
50 |
+ self._show_missed_update_slot_conflicts( |
51 |
+ missed_update_types.get("slot conflict")) |
52 |
+ |
53 |
+ self._show_missed_update_unsatisfied_dep( |
54 |
+ missed_update_types.get("missing dependency")) |
55 |
+ |
56 |
+ def _show_missed_update_unsatisfied_dep(self, missed_updates): |
57 |
+ |
58 |
+ if not missed_updates: |
59 |
+ return |
60 |
+ |
61 |
+ write = sys.stderr.write |
62 |
+ |
63 |
+ for pkg, parent_atoms in missed_updates: |
64 |
+ |
65 |
+ write("\n!!! The following update has been skipped " + \ |
66 |
+ "due to unsatisfied dependencies:\n\n") |
67 |
+ |
68 |
+ write(str(pkg.slot_atom)) |
69 |
+ write("\n") |
70 |
+ |
71 |
+ for parent, atom in parent_atoms: |
72 |
+ # TODO: Account for which $ROOT the atom applies to. |
73 |
+ self._show_unsatisfied_dep(parent.root, atom, myparent=parent) |
74 |
+ write("\n") |
75 |
+ |
76 |
+ sys.stderr.flush() |
77 |
+ |
78 |
+ def _show_missed_update_slot_conflicts(self, missed_updates): |
79 |
+ |
80 |
+ if not missed_updates: |
81 |
+ return |
82 |
+ |
83 |
msg = [] |
84 |
msg.append("\n!!! One or more updates have been skipped due to " + \ |
85 |
"a dependency conflict:\n\n") |
86 |
|
87 |
indent = " " |
88 |
- for pkg, parent_atoms in missed_updates.itervalues(): |
89 |
+ for pkg, parent_atoms in missed_updates: |
90 |
msg.append(str(pkg.slot_atom)) |
91 |
msg.append("\n\n") |
92 |
|
93 |
@@ -1932,6 +1973,11 @@ |
94 |
traversed_nodes.add(node) |
95 |
msg.append('(dependency required by "%s" [%s])' % \ |
96 |
(colorize('INFORM', str(node.cpv)), node.type_name)) |
97 |
+ |
98 |
+ if node not in self._dynamic_config.digraph: |
99 |
+ # The parent is not in the graph due to backtracking. |
100 |
+ break |
101 |
+ |
102 |
# When traversing to parents, prefer arguments over packages |
103 |
# since arguments are root nodes. Never traverse the same |
104 |
# package twice, in order to prevent an infinite loop. |