1 |
Author: zmedico |
2 |
Date: 2008-05-03 08:25:40 +0000 (Sat, 03 May 2008) |
3 |
New Revision: 10133 |
4 |
|
5 |
Modified: |
6 |
main/branches/2.1.2/bin/emerge |
7 |
Log: |
8 |
* Move circular deps and blocker displays to depgraph.display_problems(). |
9 |
* Always call display_problems() since calling it from inside display() |
10 |
can lead to unwanted recursion. |
11 |
(trunk r10132) |
12 |
|
13 |
|
14 |
Modified: main/branches/2.1.2/bin/emerge |
15 |
=================================================================== |
16 |
--- main/branches/2.1.2/bin/emerge 2008-05-03 08:21:02 UTC (rev 10132) |
17 |
+++ main/branches/2.1.2/bin/emerge 2008-05-03 08:25:40 UTC (rev 10133) |
18 |
@@ -1898,6 +1898,8 @@ |
19 |
self._missing_args = [] |
20 |
self._masked_installed = [] |
21 |
self._unsatisfied_deps_for_display = [] |
22 |
+ self._unsatisfied_blockers_for_display = None |
23 |
+ self._circular_deps_for_display = None |
24 |
self._dep_stack = [] |
25 |
self._unsatisfied_deps = [] |
26 |
self._ignored_deps = [] |
27 |
@@ -1916,6 +1918,8 @@ |
28 |
if not self._slot_collision_info: |
29 |
return |
30 |
|
31 |
+ self._show_merge_list() |
32 |
+ |
33 |
msg = [] |
34 |
msg.append("\n!!! Multiple versions within a single " + \ |
35 |
"package slot have been pulled\n") |
36 |
@@ -3868,43 +3872,7 @@ |
37 |
continue |
38 |
|
39 |
if not selected_nodes: |
40 |
- # No leaf nodes are available, so we have a circular |
41 |
- # dependency panic situation. Reduce the noise level to a |
42 |
- # minimum via repeated elimination of root nodes since they |
43 |
- # have no parents and thus can not be part of a cycle. |
44 |
- while True: |
45 |
- root_nodes = mygraph.root_nodes( |
46 |
- ignore_priority=DepPriority.MEDIUM_SOFT) |
47 |
- if not root_nodes: |
48 |
- break |
49 |
- for node in root_nodes: |
50 |
- mygraph.remove(node) |
51 |
- # Display the USE flags that are enabled on nodes that are part |
52 |
- # of dependency cycles in case that helps the user decide to |
53 |
- # disable some of them. |
54 |
- display_order = [] |
55 |
- tempgraph = mygraph.copy() |
56 |
- while not tempgraph.empty(): |
57 |
- nodes = tempgraph.leaf_nodes() |
58 |
- if not nodes: |
59 |
- node = tempgraph.order[0] |
60 |
- else: |
61 |
- node = nodes[0] |
62 |
- display_order.append(node) |
63 |
- tempgraph.remove(node) |
64 |
- display_order.reverse() |
65 |
- self.myopts.pop("--quiet", None) |
66 |
- self.myopts.pop("--verbose", None) |
67 |
- self.myopts["--tree"] = True |
68 |
- print |
69 |
- print |
70 |
- self.display(display_order) |
71 |
- print "!!! Error: circular dependencies:" |
72 |
- print |
73 |
- mygraph.debug_print() |
74 |
- print |
75 |
- print "!!! Note that circular dependencies can often be avoided by temporarily" |
76 |
- print "!!! disabling USE flags that trigger optional dependencies." |
77 |
+ self._circular_deps_for_display = mygraph |
78 |
raise self._unknown_internal_error() |
79 |
|
80 |
# At this point, we've succeeded in selecting one or more nodes, so |
81 |
@@ -3984,26 +3952,79 @@ |
82 |
|
83 |
if unsolvable_blockers and \ |
84 |
not self._accept_blocker_conflicts(): |
85 |
- quiet = "--quiet" in self.myopts |
86 |
- display_list = retlist[:] |
87 |
- if tree_mode: |
88 |
- display_list.reverse() |
89 |
- portage.writemsg("\n", noiselevel=-1) |
90 |
- self.display(display_list) |
91 |
- msg = "Error: The above package list contains " + \ |
92 |
- "packages which cannot be installed " + \ |
93 |
- "at the same time on the same system." |
94 |
- prefix = bad(" * ") |
95 |
- from textwrap import wrap |
96 |
- portage.writemsg("\n", noiselevel=-1) |
97 |
- for line in wrap(msg, 70): |
98 |
- portage.writemsg(prefix + line + "\n", noiselevel=-1) |
99 |
- if not quiet: |
100 |
- show_blocker_docs_link() |
101 |
+ self._unsatisfied_blockers_for_display = unsolvable_blockers |
102 |
+ self._serialized_tasks_cache = retlist[:] |
103 |
raise self._unknown_internal_error() |
104 |
|
105 |
+ if self._slot_collision_info and \ |
106 |
+ not self._accept_blocker_conflicts(): |
107 |
+ self._serialized_tasks_cache = retlist[:] |
108 |
+ raise self._unknown_internal_error() |
109 |
+ |
110 |
return retlist |
111 |
|
112 |
+ def _show_circular_deps(self, mygraph): |
113 |
+ # No leaf nodes are available, so we have a circular |
114 |
+ # dependency panic situation. Reduce the noise level to a |
115 |
+ # minimum via repeated elimination of root nodes since they |
116 |
+ # have no parents and thus can not be part of a cycle. |
117 |
+ while True: |
118 |
+ root_nodes = mygraph.root_nodes( |
119 |
+ ignore_priority=DepPriority.MEDIUM_SOFT) |
120 |
+ if not root_nodes: |
121 |
+ break |
122 |
+ mygraph.difference_update(root_nodes) |
123 |
+ # Display the USE flags that are enabled on nodes that are part |
124 |
+ # of dependency cycles in case that helps the user decide to |
125 |
+ # disable some of them. |
126 |
+ display_order = [] |
127 |
+ tempgraph = mygraph.copy() |
128 |
+ while not tempgraph.empty(): |
129 |
+ nodes = tempgraph.leaf_nodes() |
130 |
+ if not nodes: |
131 |
+ node = tempgraph.order[0] |
132 |
+ else: |
133 |
+ node = nodes[0] |
134 |
+ display_order.append(node) |
135 |
+ tempgraph.remove(node) |
136 |
+ display_order.reverse() |
137 |
+ self.myopts.pop("--quiet", None) |
138 |
+ self.myopts.pop("--verbose", None) |
139 |
+ self.myopts["--tree"] = True |
140 |
+ portage.writemsg("\n\n", noiselevel=-1) |
141 |
+ self.display(display_order) |
142 |
+ prefix = colorize("BAD", " * ") |
143 |
+ portage.writemsg("\n", noiselevel=-1) |
144 |
+ portage.writemsg(prefix + "Error: circular dependencies:\n", |
145 |
+ noiselevel=-1) |
146 |
+ portage.writemsg("\n", noiselevel=-1) |
147 |
+ mygraph.debug_print() |
148 |
+ portage.writemsg("\n", noiselevel=-1) |
149 |
+ portage.writemsg(prefix + "Note that circular dependencies " + \ |
150 |
+ "can often be avoided by temporarily\n", noiselevel=-1) |
151 |
+ portage.writemsg(prefix + "disabling USE flags that trigger " + \ |
152 |
+ "optional dependencies.\n", noiselevel=-1) |
153 |
+ |
154 |
+ def _show_merge_list(self): |
155 |
+ if self._serialized_tasks_cache is not None: |
156 |
+ display_list = self._serialized_tasks_cache[:] |
157 |
+ if "--tree" in self.myopts: |
158 |
+ display_list.reverse() |
159 |
+ self.display(display_list) |
160 |
+ |
161 |
+ def _show_unsatisied_blockers(self, blockers): |
162 |
+ self._show_merge_list() |
163 |
+ msg = "Error: The above package list contains " + \ |
164 |
+ "packages which cannot be installed " + \ |
165 |
+ "at the same time on the same system." |
166 |
+ prefix = colorize("BAD", " * ") |
167 |
+ from textwrap import wrap |
168 |
+ portage.writemsg("\n", noiselevel=-1) |
169 |
+ for line in wrap(msg, 70): |
170 |
+ portage.writemsg(prefix + line + "\n", noiselevel=-1) |
171 |
+ if "--quiet" not in self.myopts: |
172 |
+ show_blocker_docs_link() |
173 |
+ |
174 |
def display(self, mylist, favorites=[], verbosity=None): |
175 |
if verbosity is None: |
176 |
verbosity = ("--quiet" in self.myopts and 1 or \ |
177 |
@@ -4682,7 +4703,6 @@ |
178 |
sys.stdout.write(text) |
179 |
|
180 |
sys.stdout.flush() |
181 |
- self.display_problems() |
182 |
return os.EX_OK |
183 |
|
184 |
def display_problems(self): |
185 |
@@ -4694,17 +4714,16 @@ |
186 |
to ensure that the user is notified of problems with the graph. |
187 |
""" |
188 |
|
189 |
- task_list = self._serialized_tasks_cache |
190 |
+ if self._circular_deps_for_display is not None: |
191 |
+ self._show_circular_deps( |
192 |
+ self._circular_deps_for_display) |
193 |
|
194 |
- # Any blockers must be appended to the tail of the list, |
195 |
- # so we only need to check the last item. |
196 |
- have_blocker_conflict = bool(task_list and \ |
197 |
- (isinstance(task_list[-1], Blocker) and \ |
198 |
- not task_list[-1].satisfied)) |
199 |
- |
200 |
# The user is only notified of a slot conflict if |
201 |
# there are no unresolvable blocker conflicts. |
202 |
- if not have_blocker_conflict: |
203 |
+ if self._unsatisfied_blockers_for_display is not None: |
204 |
+ self._show_unsatisied_blockers( |
205 |
+ self._unsatisfied_blockers_for_display) |
206 |
+ else: |
207 |
self._show_slot_collision_notice() |
208 |
|
209 |
# TODO: Add generic support for "set problem" handlers so that |
210 |
@@ -7745,11 +7764,11 @@ |
211 |
except portage_exception.PackageNotFound, e: |
212 |
portage.writemsg("\n!!! %s\n" % str(e), noiselevel=-1) |
213 |
return 1 |
214 |
+ if show_spinner: |
215 |
+ print "\b\b... done!" |
216 |
if not retval: |
217 |
mydepgraph.display_problems() |
218 |
return 1 |
219 |
- if "--quiet" not in myopts and "--nodeps" not in myopts: |
220 |
- print "\b\b... done!" |
221 |
display = pretend or \ |
222 |
((ask or tree or verbose) and not (quiet and not ask)) |
223 |
if not display: |
224 |
@@ -7768,6 +7787,7 @@ |
225 |
retval = mydepgraph.display( |
226 |
mydepgraph.altlist(reversed=tree), |
227 |
favorites=favorites) |
228 |
+ mydepgraph.display_problems() |
229 |
if retval != os.EX_OK: |
230 |
return retval |
231 |
prompt="Would you like to resume merging these packages?" |
232 |
@@ -7775,6 +7795,7 @@ |
233 |
retval = mydepgraph.display( |
234 |
mydepgraph.altlist(reversed=("--tree" in myopts)), |
235 |
favorites=favorites) |
236 |
+ mydepgraph.display_problems() |
237 |
if retval != os.EX_OK: |
238 |
return retval |
239 |
mergecount=0 |
240 |
@@ -7818,12 +7839,14 @@ |
241 |
retval = mydepgraph.display( |
242 |
mydepgraph.altlist(reversed=tree), |
243 |
favorites=favorites) |
244 |
+ mydepgraph.display_problems() |
245 |
if retval != os.EX_OK: |
246 |
return retval |
247 |
else: |
248 |
retval = mydepgraph.display( |
249 |
mydepgraph.altlist(reversed=("--tree" in myopts)), |
250 |
favorites=favorites) |
251 |
+ mydepgraph.display_problems() |
252 |
if retval != os.EX_OK: |
253 |
return retval |
254 |
if "--buildpkgonly" in myopts: |
255 |
|
256 |
-- |
257 |
gentoo-commits@l.g.o mailing list |