1 |
Author: zmedico |
2 |
Date: 2008-07-04 10:45:41 +0000 (Fri, 04 Jul 2008) |
3 |
New Revision: 10924 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
* Split out a MergeListItem class from Scheduler._execute_task(). |
9 |
* Remove Scheduler._execute_task() and migrate some of it's code |
10 |
to Scheduler._merge(). |
11 |
* Fix _world_atom() so that it doesn't add an atom in --oneshot |
12 |
mode or similar. |
13 |
|
14 |
|
15 |
Modified: main/trunk/pym/_emerge/__init__.py |
16 |
=================================================================== |
17 |
--- main/trunk/pym/_emerge/__init__.py 2008-07-04 10:15:37 UTC (rev 10923) |
18 |
+++ main/trunk/pym/_emerge/__init__.py 2008-07-04 10:45:41 UTC (rev 10924) |
19 |
@@ -2501,6 +2501,83 @@ |
20 |
self.env = self.pkg.root_config.settings.environ() |
21 |
SpawnProcess.start(self) |
22 |
|
23 |
+class MergeListItem(SlotObject): |
24 |
+ |
25 |
+ __slots__ = ("args_set", "binpkg_opts", "build_opts", "emerge_opts", |
26 |
+ "failed_fetches", "find_blockers", "logger", "mtimedb", "pkg", |
27 |
+ "pkg_count", "prefetcher", "scheduler", "settings", "world_atom") |
28 |
+ |
29 |
+ def execute(self): |
30 |
+ |
31 |
+ args_set = self.args_set |
32 |
+ binpkg_opts = self.binpkg_opts |
33 |
+ build_opts = self.build_opts |
34 |
+ emerge_opts = self.emerge_opts |
35 |
+ failed_fetches = self.failed_fetches |
36 |
+ find_blockers = self.find_blockers |
37 |
+ logger = self.logger |
38 |
+ mtimedb = self.mtimedb |
39 |
+ pkg = self.pkg |
40 |
+ pkg_count = self.pkg_count |
41 |
+ prefetcher = self.prefetcher |
42 |
+ scheduler = self.scheduler |
43 |
+ settings = self.settings |
44 |
+ world_atom = self.world_atom |
45 |
+ ldpath_mtimes = mtimedb["ldpath"] |
46 |
+ |
47 |
+ if pkg.installed: |
48 |
+ if not (build_opts.buildpkgonly or \ |
49 |
+ build_opts.fetchonly or build_opts.pretend): |
50 |
+ |
51 |
+ uninstall = PackageUninstall(ldpath_mtimes=ldpath_mtimes, |
52 |
+ opts=emerge_opts, pkg=pkg, settings=settings) |
53 |
+ |
54 |
+ retval = uninstall.execute() |
55 |
+ if retval != os.EX_OK: |
56 |
+ return retval |
57 |
+ |
58 |
+ return os.EX_OK |
59 |
+ |
60 |
+ if not build_opts.pretend: |
61 |
+ portage.writemsg_stdout( |
62 |
+ "\n>>> Emerging (%s of %s) %s to %s\n" % \ |
63 |
+ (colorize("MERGE_LIST_PROGRESS", str(pkg_count.curval)), |
64 |
+ colorize("MERGE_LIST_PROGRESS", str(pkg_count.maxval)), |
65 |
+ colorize("GOOD", pkg.cpv), pkg.root), noiselevel=-1) |
66 |
+ logger.log(" >>> emerge (%s of %s) %s to %s" % \ |
67 |
+ (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg.root)) |
68 |
+ |
69 |
+ if pkg.type_name == "ebuild": |
70 |
+ |
71 |
+ build = EbuildBuild(args_set=args_set, |
72 |
+ find_blockers=find_blockers, |
73 |
+ ldpath_mtimes=ldpath_mtimes, logger=logger, |
74 |
+ opts=build_opts, pkg=pkg, pkg_count=pkg_count, |
75 |
+ settings=settings, scheduler=scheduler, |
76 |
+ world_atom=world_atom) |
77 |
+ |
78 |
+ retval = build.execute() |
79 |
+ |
80 |
+ if retval != os.EX_OK: |
81 |
+ if build_opts.fetchonly: |
82 |
+ failed_fetches.append(pkg.cpv) |
83 |
+ return retval |
84 |
+ |
85 |
+ elif pkg.type_name == "binary": |
86 |
+ |
87 |
+ binpkg = Binpkg(find_blockers=find_blockers, |
88 |
+ ldpath_mtimes=ldpath_mtimes, logger=logger, |
89 |
+ opts=binpkg_opts, pkg=pkg, pkg_count=pkg_count, |
90 |
+ prefetcher=prefetcher, settings=settings, |
91 |
+ scheduler=scheduler, world_atom=world_atom) |
92 |
+ |
93 |
+ retval = binpkg.execute() |
94 |
+ |
95 |
+ if retval != os.EX_OK: |
96 |
+ return retval |
97 |
+ |
98 |
+ return os.EX_OK |
99 |
+ |
100 |
class DependencyArg(object): |
101 |
def __init__(self, arg=None, root_config=None): |
102 |
self.arg = arg |
103 |
@@ -7122,8 +7199,10 @@ |
104 |
self._prefetchers = weakref.WeakValueDictionary() |
105 |
self._failed_fetches = [] |
106 |
self._parallel_fetch = False |
107 |
+ merge_count = len([x for x in mergelist \ |
108 |
+ if isinstance(x, Package) and x.operation == "merge"]) |
109 |
self._pkg_count = self._pkg_count_class( |
110 |
- curval=0, maxval=len(mergelist)) |
111 |
+ curval=0, maxval=merge_count) |
112 |
|
113 |
features = self.settings.features |
114 |
if "parallel-fetch" in features and \ |
115 |
@@ -7214,7 +7293,8 @@ |
116 |
del quiet_config |
117 |
|
118 |
for x in self._mergelist: |
119 |
- if x.type_name != "ebuild": |
120 |
+ if not isinstance(x, Package) or \ |
121 |
+ x.type_name != "ebuild": |
122 |
continue |
123 |
|
124 |
if not shown_verifying_msg: |
125 |
@@ -7406,7 +7486,8 @@ |
126 |
self._mergelist = mylist |
127 |
self._save_resume_list() |
128 |
self._pkg_count.curval = 0 |
129 |
- self._pkg_count.maxval = len(mylist) |
130 |
+ self._pkg_count.maxval = len([x for x in mylist \ |
131 |
+ if isinstance(x, Package) and x.operation == "merge"]) |
132 |
|
133 |
self._logger.log(" *** Finished. Cleaning up...") |
134 |
|
135 |
@@ -7417,11 +7498,50 @@ |
136 |
self._add_prefetchers() |
137 |
|
138 |
try: |
139 |
- for task in self._mergelist: |
140 |
- try: |
141 |
- self._execute_task(task) |
142 |
- except self._pkg_failure, e: |
143 |
- return e.status |
144 |
+ for pkg in self._mergelist: |
145 |
+ |
146 |
+ if not isinstance(pkg, Package): |
147 |
+ # blockers |
148 |
+ continue |
149 |
+ |
150 |
+ if not pkg.installed: |
151 |
+ self._pkg_count.curval += 1 |
152 |
+ |
153 |
+ merge = MergeListItem(args_set=self._args_set, |
154 |
+ binpkg_opts=self._binpkg_opts, |
155 |
+ build_opts=self._build_opts, |
156 |
+ emerge_opts=self.myopts, |
157 |
+ failed_fetches=self._failed_fetches, |
158 |
+ find_blockers=self._find_blockers(pkg), logger=self._logger, |
159 |
+ mtimedb=self._mtimedb, pkg=pkg, pkg_count=self._pkg_count, |
160 |
+ prefetcher=self._prefetchers.get(pkg), |
161 |
+ scheduler=self._sched_iface, |
162 |
+ settings=self.pkgsettings[pkg.root], |
163 |
+ world_atom=self._world_atom) |
164 |
+ |
165 |
+ retval = merge.execute() |
166 |
+ |
167 |
+ if retval != os.EX_OK: |
168 |
+ if not self._build_opts.fetchonly: |
169 |
+ return retval |
170 |
+ |
171 |
+ self.curval += 1 |
172 |
+ |
173 |
+ if pkg.installed: |
174 |
+ # There's nothing left to do for uninstall. |
175 |
+ continue |
176 |
+ |
177 |
+ self._restart_if_necessary(pkg) |
178 |
+ |
179 |
+ # Call mtimedb.commit() after each merge so that |
180 |
+ # --resume still works after being interrupted |
181 |
+ # by reboot, sigkill or similar. |
182 |
+ mtimedb = self._mtimedb |
183 |
+ del mtimedb["resume"]["mergelist"][0] |
184 |
+ if not mtimedb["resume"]["mergelist"]: |
185 |
+ del mtimedb["resume"] |
186 |
+ mtimedb.commit() |
187 |
+ |
188 |
finally: |
189 |
# clean up child process if necessary |
190 |
self._task_queues.prefetch.clear() |
191 |
@@ -7514,6 +7634,13 @@ |
192 |
Add the package to the world file, but only if |
193 |
it's supposed to be added. Otherwise, do nothing. |
194 |
""" |
195 |
+ |
196 |
+ if set(("--buildpkgonly", "--fetchonly", |
197 |
+ "--fetch-all-uri", |
198 |
+ "--oneshot", "--onlydeps", |
199 |
+ "--pretend")).intersection(self.myopts): |
200 |
+ return |
201 |
+ |
202 |
if pkg.root != self.target_root: |
203 |
return |
204 |
|
205 |
@@ -7538,78 +7665,6 @@ |
206 |
finally: |
207 |
world_set.unlock() |
208 |
|
209 |
- def _execute_task(self, pkg): |
210 |
- |
211 |
- buildpkgonly = "--buildpkgonly" in self.myopts |
212 |
- fetch_all = "--fetch-all-uri" in self.myopts |
213 |
- fetchonly = fetch_all or "--fetchonly" in self.myopts |
214 |
- pretend = "--pretend" in self.myopts |
215 |
- |
216 |
- pkgsettings = self.pkgsettings[pkg.root] |
217 |
- mtimedb = self._mtimedb |
218 |
- ldpath_mtimes = mtimedb["ldpath"] |
219 |
- failed_fetches = self._failed_fetches |
220 |
- pkg_count = self._pkg_count |
221 |
- prefetchers = self._prefetchers |
222 |
- |
223 |
- if not pkg.installed: |
224 |
- pkg_count.curval += 1 |
225 |
- mergecount = pkg_count.curval |
226 |
- else: |
227 |
- if not (buildpkgonly or fetchonly or pretend): |
228 |
- uninstall = PackageUninstall(ldpath_mtimes=ldpath_mtimes, |
229 |
- opts=self.myopts, pkg=pkg, settings=pkgsettings) |
230 |
- retval = uninstall.execute() |
231 |
- if retval != os.EX_OK: |
232 |
- raise self._pkg_failure(retval) |
233 |
- return |
234 |
- |
235 |
- if not pretend: |
236 |
- portage.writemsg_stdout( |
237 |
- "\n>>> Emerging (%s of %s) %s to %s\n" % \ |
238 |
- (colorize("MERGE_LIST_PROGRESS", str(pkg_count.curval)), |
239 |
- colorize("MERGE_LIST_PROGRESS", str(pkg_count.maxval)), |
240 |
- colorize("GOOD", pkg.cpv), pkg.root), noiselevel=-1) |
241 |
- self._logger.log(" >>> emerge (%s of %s) %s to %s" % \ |
242 |
- (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg.root)) |
243 |
- |
244 |
- if pkg.type_name == "ebuild": |
245 |
- build = EbuildBuild(args_set=self._args_set, |
246 |
- find_blockers=self._find_blockers(pkg), |
247 |
- ldpath_mtimes=ldpath_mtimes, logger=self._logger, |
248 |
- opts=self._build_opts, pkg=pkg, pkg_count=pkg_count, |
249 |
- settings=pkgsettings, scheduler=self._sched_iface, |
250 |
- world_atom=self._world_atom) |
251 |
- retval = build.execute() |
252 |
- if retval != os.EX_OK: |
253 |
- if fetchonly: |
254 |
- failed_fetches.append(pkg.cpv) |
255 |
- else: |
256 |
- raise self._pkg_failure(retval) |
257 |
- |
258 |
- elif pkg.type_name == "binary": |
259 |
- binpkg = Binpkg(find_blockers=self._find_blockers(pkg), |
260 |
- ldpath_mtimes=ldpath_mtimes, logger=self._logger, |
261 |
- opts=self._binpkg_opts, pkg=pkg, pkg_count=pkg_count, |
262 |
- prefetcher=prefetchers.get(pkg), settings=pkgsettings, |
263 |
- scheduler=self._sched_iface, world_atom=self._world_atom) |
264 |
- retval = binpkg.execute() |
265 |
- if retval != os.EX_OK: |
266 |
- if fetchonly: |
267 |
- failed_fetches.append(pkg.cpv) |
268 |
- else: |
269 |
- raise self._pkg_failure(retval) |
270 |
- |
271 |
- self._restart_if_necessary(pkg) |
272 |
- del mtimedb["resume"]["mergelist"][0] |
273 |
- if not mtimedb["resume"]["mergelist"]: |
274 |
- del mtimedb["resume"] |
275 |
- # Commit after each merge so that --resume may still work in |
276 |
- # in the event that portage is not allowed to exit normally |
277 |
- # due to power failure, SIGKILL, etc... |
278 |
- mtimedb.commit() |
279 |
- self.curval += 1 |
280 |
- |
281 |
class UninstallFailure(portage.exception.PortageException): |
282 |
""" |
283 |
An instance of this class is raised by unmerge() when |
284 |
|
285 |
-- |
286 |
gentoo-commits@l.g.o mailing list |