1 |
Author: zmedico |
2 |
Date: 2008-10-14 21:05:54 +0000 (Tue, 14 Oct 2008) |
3 |
New Revision: 11690 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
main/trunk/pym/portage/elog/__init__.py |
8 |
Log: |
9 |
When emerge --keep-going bails due to missing dependencies, show the error |
10 |
message after the mod_echo output since otherwise the mod_echo output can |
11 |
sweep the error message out of view. Thanks to Donnie Berkholz <dberkholz@g.o> |
12 |
for reporting. |
13 |
|
14 |
|
15 |
Modified: main/trunk/pym/_emerge/__init__.py |
16 |
=================================================================== |
17 |
--- main/trunk/pym/_emerge/__init__.py 2008-10-13 20:52:07 UTC (rev 11689) |
18 |
+++ main/trunk/pym/_emerge/__init__.py 2008-10-14 21:05:54 UTC (rev 11690) |
19 |
@@ -9103,6 +9103,7 @@ |
20 |
self._failed_pkgs = [] |
21 |
self._failed_pkgs_all = [] |
22 |
self._failed_pkgs_die_msgs = [] |
23 |
+ self._post_mod_echo_msgs = [] |
24 |
self._parallel_fetch = False |
25 |
merge_count = len([x for x in mergelist \ |
26 |
if isinstance(x, Package) and x.operation == "merge"]) |
27 |
@@ -9585,29 +9586,13 @@ |
28 |
if not mergelist: |
29 |
break |
30 |
|
31 |
- dropped_tasks = self._calc_resume_list() |
32 |
- if dropped_tasks is None: |
33 |
+ if not self._calc_resume_list(): |
34 |
break |
35 |
|
36 |
clear_caches(self.trees) |
37 |
if not self._mergelist: |
38 |
break |
39 |
|
40 |
- if dropped_tasks: |
41 |
- |
42 |
- def _eerror(lines): |
43 |
- for l in lines: |
44 |
- eerror(l, phase="other", key=failed_pkg.pkg.cpv) |
45 |
- |
46 |
- msg = [] |
47 |
- msg.append("One or more packages have been " + \ |
48 |
- "dropped due to unsatisfied dependencies:") |
49 |
- msg.append("") |
50 |
- msg.extend(" " + str(task) for task in dropped_tasks) |
51 |
- msg.append("") |
52 |
- _eerror(msg) |
53 |
- del _eerror, msg |
54 |
- del dropped_tasks |
55 |
self._save_resume_list() |
56 |
self._pkg_count.curval = 0 |
57 |
self._pkg_count.maxval = len([x for x in self._mergelist \ |
58 |
@@ -9646,10 +9631,15 @@ |
59 |
log_file.close() |
60 |
failure_log_shown = True |
61 |
|
62 |
+ # Dump mod_echo output now since it tends to flood the terminal. |
63 |
+ # This allows us to avoid having more important output, generated |
64 |
+ # later, from being swept away by the mod_echo output. |
65 |
+ mod_echo_output = _flush_elog_mod_echo() |
66 |
+ |
67 |
if background and not failure_log_shown and \ |
68 |
self._failed_pkgs_all and \ |
69 |
self._failed_pkgs_die_msgs and \ |
70 |
- not _flush_elog_mod_echo(): |
71 |
+ not mod_echo_output: |
72 |
|
73 |
printer = portage.output.EOutput() |
74 |
for mysettings, key, logentries in self._failed_pkgs_die_msgs: |
75 |
@@ -9669,8 +9659,11 @@ |
76 |
for line in msgcontent: |
77 |
printer.eerror(line.strip("\n")) |
78 |
|
79 |
+ if self._post_mod_echo_msgs: |
80 |
+ for msg in self._post_mod_echo_msgs: |
81 |
+ msg() |
82 |
+ |
83 |
if len(self._failed_pkgs_all) > 1: |
84 |
- _flush_elog_mod_echo() |
85 |
msg = "The following packages have " + \ |
86 |
"failed to build or install:" |
87 |
prefix = bad(" * ") |
88 |
@@ -10118,9 +10111,8 @@ |
89 |
""" |
90 |
Use the current resume list to calculate a new one, |
91 |
dropping any packages with unsatisfied deps. |
92 |
- @rtype: set |
93 |
- @returns: a possibly empty set of dropped tasks, or |
94 |
- None if an error occurs. |
95 |
+ @rtype: bool |
96 |
+ @returns: True if successful, False otherwise. |
97 |
""" |
98 |
print colorize("GOOD", "*** Resuming merge...") |
99 |
|
100 |
@@ -10156,42 +10148,50 @@ |
101 |
print "\b\b... done!" |
102 |
|
103 |
if e is not None: |
104 |
- mydepgraph.display_problems() |
105 |
- out = portage.output.EOutput() |
106 |
- out.eerror("One or more packages are either masked or " + \ |
107 |
- "have missing dependencies:") |
108 |
- out.eerror("") |
109 |
- indent = " " |
110 |
- for dep in e.value: |
111 |
- if dep.atom is None: |
112 |
- out.eerror(indent + "Masked package:") |
113 |
- out.eerror(2 * indent + str(dep.parent)) |
114 |
- out.eerror("") |
115 |
- else: |
116 |
- out.eerror(indent + str(dep.atom) + " pulled in by:") |
117 |
- out.eerror(2 * indent + str(dep.parent)) |
118 |
- out.eerror("") |
119 |
- msg = "The resume list contains packages " + \ |
120 |
- "that are either masked or have " + \ |
121 |
- "unsatisfied dependencies. " + \ |
122 |
- "Please restart/continue " + \ |
123 |
- "the operation manually, or use --skipfirst " + \ |
124 |
- "to skip the first package in the list and " + \ |
125 |
- "any other packages that may be " + \ |
126 |
- "masked or have missing dependencies." |
127 |
- for line in textwrap.wrap(msg, 72): |
128 |
- out.eerror(line) |
129 |
- return None |
130 |
+ def unsatisfied_resume_dep_msg(): |
131 |
+ mydepgraph.display_problems() |
132 |
+ out = portage.output.EOutput() |
133 |
+ out.eerror("One or more packages are either masked or " + \ |
134 |
+ "have missing dependencies:") |
135 |
+ out.eerror("") |
136 |
+ indent = " " |
137 |
+ show_parents = set() |
138 |
+ for dep in e.value: |
139 |
+ if dep.parent in show_parents: |
140 |
+ continue |
141 |
+ show_parents.add(dep.parent) |
142 |
+ if dep.atom is None: |
143 |
+ out.eerror(indent + "Masked package:") |
144 |
+ out.eerror(2 * indent + str(dep.parent)) |
145 |
+ out.eerror("") |
146 |
+ else: |
147 |
+ out.eerror(indent + str(dep.atom) + " pulled in by:") |
148 |
+ out.eerror(2 * indent + str(dep.parent)) |
149 |
+ out.eerror("") |
150 |
+ msg = "The resume list contains packages " + \ |
151 |
+ "that are either masked or have " + \ |
152 |
+ "unsatisfied dependencies. " + \ |
153 |
+ "Please restart/continue " + \ |
154 |
+ "the operation manually, or use --skipfirst " + \ |
155 |
+ "to skip the first package in the list and " + \ |
156 |
+ "any other packages that may be " + \ |
157 |
+ "masked or have missing dependencies." |
158 |
+ for line in textwrap.wrap(msg, 72): |
159 |
+ out.eerror(line) |
160 |
+ self._post_mod_echo_msgs.append(unsatisfied_resume_dep_msg) |
161 |
+ return False |
162 |
|
163 |
- if self._show_list(): |
164 |
+ if success and self._show_list(): |
165 |
mylist = mydepgraph.altlist() |
166 |
- if "--tree" in self.myopts: |
167 |
- mylist.reverse() |
168 |
- mydepgraph.display(mylist, favorites=self._favorites) |
169 |
+ if mylist: |
170 |
+ if "--tree" in self.myopts: |
171 |
+ mylist.reverse() |
172 |
+ mydepgraph.display(mylist, favorites=self._favorites) |
173 |
|
174 |
+ if not success: |
175 |
+ self._post_mod_echo_msgs.append(mydepgraph.display_problems) |
176 |
+ return False |
177 |
mydepgraph.display_problems() |
178 |
- if not success: |
179 |
- return None |
180 |
|
181 |
mylist = mydepgraph.altlist() |
182 |
mydepgraph.break_refs(mylist) |
183 |
@@ -10200,8 +10200,28 @@ |
184 |
|
185 |
self._mergelist = mylist |
186 |
self._set_digraph(mydepgraph.digraph) |
187 |
- return dropped_tasks |
188 |
|
189 |
+ msg_width = 75 |
190 |
+ for task in dropped_tasks: |
191 |
+ if not (isinstance(task, Package) and task.operation == "merge"): |
192 |
+ continue |
193 |
+ pkg = task |
194 |
+ msg = "emerge --keep-going:" + \ |
195 |
+ " %s" % (pkg.cpv,) |
196 |
+ if pkg.root != "/": |
197 |
+ msg += " for %s" % (pkg.root,) |
198 |
+ msg += " dropped due to unsatisfied dependency." |
199 |
+ for line in textwrap.wrap(msg, msg_width): |
200 |
+ eerror(line, phase="other", key=pkg.cpv) |
201 |
+ settings = mydepgraph.pkgsettings[pkg.root] |
202 |
+ # Ensure that log collection from $T is disabled inside |
203 |
+ # elog_process(), since any logs that might exist are |
204 |
+ # not valid here. |
205 |
+ settings.pop("T", None) |
206 |
+ portage.elog.elog_process(pkg.cpv, settings) |
207 |
+ |
208 |
+ return True |
209 |
+ |
210 |
def _show_list(self): |
211 |
myopts = self.myopts |
212 |
if "--quiet" not in myopts and \ |
213 |
|
214 |
Modified: main/trunk/pym/portage/elog/__init__.py |
215 |
=================================================================== |
216 |
--- main/trunk/pym/portage/elog/__init__.py 2008-10-13 20:52:07 UTC (rev 11689) |
217 |
+++ main/trunk/pym/portage/elog/__init__.py 2008-10-14 21:05:54 UTC (rev 11690) |
218 |
@@ -72,7 +72,13 @@ |
219 |
except ImportError: |
220 |
pass |
221 |
|
222 |
- ebuild_logentries = collect_ebuild_messages(os.path.join(mysettings["T"], "logging")) |
223 |
+ if "T" in mysettings: |
224 |
+ ebuild_logentries = collect_ebuild_messages( |
225 |
+ os.path.join(mysettings["T"], "logging")) |
226 |
+ else: |
227 |
+ # A build dir isn't necessarily required since the messages.e* |
228 |
+ # functions allow messages to be generated in-memory. |
229 |
+ ebuild_logentries = {} |
230 |
all_logentries = collect_messages() |
231 |
if cpv in all_logentries: |
232 |
all_logentries[cpv] = _merge_logentries(ebuild_logentries, all_logentries[cpv]) |