1 |
Author: zmedico |
2 |
Date: 2008-06-27 07:49:57 +0000 (Fri, 27 Jun 2008) |
3 |
New Revision: 10811 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Bug #12768 - Add a --keep-going option. This uses the same resume_depgraph() |
9 |
function that's called for emerge --resume operations. Given the remaining |
10 |
tasks, depedencies are recalculated and any tasks with unsatisfied |
11 |
dependencies are automatically dropped. |
12 |
|
13 |
|
14 |
Modified: main/trunk/pym/_emerge/__init__.py |
15 |
=================================================================== |
16 |
--- main/trunk/pym/_emerge/__init__.py 2008-06-27 06:44:29 UTC (rev 10810) |
17 |
+++ main/trunk/pym/_emerge/__init__.py 2008-06-27 07:49:57 UTC (rev 10811) |
18 |
@@ -197,6 +197,7 @@ |
19 |
"--fetchonly", "--fetch-all-uri", |
20 |
"--getbinpkg", "--getbinpkgonly", |
21 |
"--help", "--ignore-default-opts", |
22 |
+"--keep-going", |
23 |
"--noconfmem", |
24 |
"--newuse", "--nocolor", |
25 |
"--nodeps", "--noreplace", |
26 |
@@ -5871,11 +5872,16 @@ |
27 |
"--fetchonly", "--fetch-all-uri", |
28 |
"--nodeps", "--pretend"]) |
29 |
|
30 |
- def __init__(self, settings, trees, myopts): |
31 |
+ def __init__(self, settings, trees, mtimedb, myopts, |
32 |
+ spinner, mergelist, favorites): |
33 |
self.settings = settings |
34 |
self.target_root = settings["ROOT"] |
35 |
self.trees = trees |
36 |
self.myopts = myopts |
37 |
+ self._spinner = spinner |
38 |
+ self._mtimedb = mtimedb |
39 |
+ self._mergelist = mergelist |
40 |
+ self._favorites = favorites |
41 |
self.edebug = 0 |
42 |
if settings.get("PORTAGE_DEBUG", "") == "1": |
43 |
self.edebug = 1 |
44 |
@@ -5924,15 +5930,86 @@ |
45 |
|
46 |
return blocker_dblinks |
47 |
|
48 |
- def merge(self, mylist, favorites, mtimedb): |
49 |
- try: |
50 |
- return self._merge(mylist, favorites, mtimedb) |
51 |
- finally: |
52 |
- if self._spawned_pids: |
53 |
- from portage import process |
54 |
- process.spawned_pids.extend(self._spawned_pids) |
55 |
- self._spawned_pids = [] |
56 |
+ def merge(self): |
57 |
|
58 |
+ keep_going = "--keep-going" in self.myopts |
59 |
+ |
60 |
+ while True: |
61 |
+ try: |
62 |
+ rval = self._merge() |
63 |
+ finally: |
64 |
+ spawned_pids = self._spawned_pids |
65 |
+ while spawned_pids: |
66 |
+ pid = spawned_pids.pop() |
67 |
+ try: |
68 |
+ if os.waitpid(pid, os.WNOHANG) == (0, 0): |
69 |
+ os.kill(pid, signal.SIGTERM) |
70 |
+ os.waitpid(pid, 0) |
71 |
+ except OSError: |
72 |
+ pass # cleaned up elsewhere. |
73 |
+ |
74 |
+ if rval == os.EX_OK or not keep_going: |
75 |
+ break |
76 |
+ mtimedb = self._mtimedb |
77 |
+ if "resume" not in mtimedb: |
78 |
+ break |
79 |
+ mergelist = self._mtimedb["resume"].get("mergelist") |
80 |
+ if not mergelist: |
81 |
+ break |
82 |
+ if mergelist[0][-1] != "merge": |
83 |
+ break |
84 |
+ # Skip the first one because it failed to build or install. |
85 |
+ del mergelist[0] |
86 |
+ if not mergelist: |
87 |
+ break |
88 |
+ mylist = self._calc_resume_list() |
89 |
+ if not mylist: |
90 |
+ break |
91 |
+ self.curval += 1 |
92 |
+ self._mergelist = mylist |
93 |
+ |
94 |
+ return rval |
95 |
+ |
96 |
+ def _calc_resume_list(self): |
97 |
+ """ |
98 |
+ Use the current resume list to calculate a new one, |
99 |
+ dropping any packages with unsatisfied deps. |
100 |
+ """ |
101 |
+ print colorize("GOOD", "*** Resuming merge...") |
102 |
+ |
103 |
+ show_spinner = "--quiet" not in self.myopts and \ |
104 |
+ "--nodeps" not in self.myopts |
105 |
+ |
106 |
+ if show_spinner: |
107 |
+ print "Calculating dependencies ", |
108 |
+ |
109 |
+ myparams = create_depgraph_params(self.myopts, None) |
110 |
+ success, mydepgraph, dropped_tasks = resume_depgraph( |
111 |
+ self.settings, self.trees, self._mtimedb, self.myopts, |
112 |
+ myparams, self._spinner, skip_unsatisfied=True) |
113 |
+ |
114 |
+ if show_spinner: |
115 |
+ print "\b\b... done!" |
116 |
+ |
117 |
+ if not success: |
118 |
+ mydepgraph.display_problems() |
119 |
+ return None |
120 |
+ |
121 |
+ if dropped_tasks: |
122 |
+ portage.writemsg("!!! One or more packages have been " + \ |
123 |
+ "dropped due to\n" + \ |
124 |
+ "!!! masking or unsatisfied dependencies:\n\n", |
125 |
+ noiselevel=-1) |
126 |
+ for task in dropped_tasks: |
127 |
+ portage.writemsg(" " + str(task) + "\n", noiselevel=-1) |
128 |
+ portage.writemsg("\n", noiselevel=-1) |
129 |
+ |
130 |
+ mylist = mydepgraph.altlist() |
131 |
+ mydepgraph.break_refs(mylist) |
132 |
+ del mydepgraph |
133 |
+ clear_caches(self.trees) |
134 |
+ return mylist |
135 |
+ |
136 |
def _poll_child_processes(self): |
137 |
""" |
138 |
After each merge, collect status from child processes |
139 |
@@ -5952,7 +6029,10 @@ |
140 |
pass |
141 |
spawned_pids.remove(pid) |
142 |
|
143 |
- def _merge(self, mylist, favorites, mtimedb): |
144 |
+ def _merge(self): |
145 |
+ mylist = self._mergelist |
146 |
+ favorites = self._favorites |
147 |
+ mtimedb = self._mtimedb |
148 |
from portage.elog import elog_process |
149 |
from portage.elog.filtering import filter_mergephases |
150 |
buildpkgonly = "--buildpkgonly" in self.myopts |
151 |
@@ -8805,7 +8885,6 @@ |
152 |
|
153 |
if ("--resume" in myopts): |
154 |
favorites=mtimedb["resume"]["favorites"] |
155 |
- mergetask = MergeTask(settings, trees, myopts) |
156 |
if "PORTAGE_PARALLEL_FETCHONLY" in settings: |
157 |
""" parallel-fetch uses --resume --fetchonly and we don't want |
158 |
it to write the mtimedb""" |
159 |
@@ -8816,7 +8895,9 @@ |
160 |
del mydepgraph |
161 |
clear_caches(trees) |
162 |
|
163 |
- retval = mergetask.merge(mymergelist, favorites, mtimedb) |
164 |
+ mergetask = MergeTask(settings, trees, mtimedb, myopts, |
165 |
+ spinner, mymergelist, favorites) |
166 |
+ retval = mergetask.merge() |
167 |
merge_count = mergetask.curval |
168 |
else: |
169 |
if "resume" in mtimedb and \ |
170 |
@@ -8860,8 +8941,9 @@ |
171 |
del mydepgraph |
172 |
clear_caches(trees) |
173 |
|
174 |
- mergetask = MergeTask(settings, trees, myopts) |
175 |
- retval = mergetask.merge(pkglist, favorites, mtimedb) |
176 |
+ mergetask = MergeTask(settings, trees, mtimedb, myopts, |
177 |
+ spinner, pkglist, favorites) |
178 |
+ retval = mergetask.merge() |
179 |
merge_count = mergetask.curval |
180 |
|
181 |
if retval == os.EX_OK and not (buildpkgonly or fetchonly or pretend): |
182 |
|
183 |
-- |
184 |
gentoo-commits@l.g.o mailing list |