1 |
Author: grobian |
2 |
Date: 2008-07-01 16:59:40 +0000 (Tue, 01 Jul 2008) |
3 |
New Revision: 10878 |
4 |
|
5 |
Modified: |
6 |
main/branches/prefix/bin/ebuild.sh |
7 |
main/branches/prefix/bin/portageq |
8 |
main/branches/prefix/pym/_emerge/__init__.py |
9 |
main/branches/prefix/pym/portage/__init__.py |
10 |
Log: |
11 |
Merged from trunk 10833:10843 |
12 |
|
13 |
| 10834 | Use the EbuildMerge class instead of portage.merge(). | |
14 |
| zmedico | | |
15 |
|
16 |
| 10835 | Bug #229859 - Make portageq check atom validity when | |
17 |
| zmedico | has_version() and best_version() are called from inside the | |
18 |
| | ebuild environment. | |
19 |
|
20 |
| 10836 | Copy portageq exit code validation from has_version() to | |
21 |
| zmedico | best_version(). | |
22 |
|
23 |
| 10837 | Bug #229859 - Also add atom validation to match(). | |
24 |
| zmedico | | |
25 |
|
26 |
| 10838 | * Remove unused EbuildBuild.pretend attribute. * Add TODO | |
27 |
| zmedico | not about asynchronous execution. | |
28 |
|
29 |
| 10839 | Make EbuildBinpkg delegate everything up to src_install() to | |
30 |
| zmedico | the EbuildBuild class. | |
31 |
|
32 |
| 10840 | Handle re.error exceptions raised from re.compile() when | |
33 |
| zmedico | ACCEPT_CHOSTS is invalid. Thanks to solar for reporting. | |
34 |
|
35 |
| 10841 | Split out an EbuildBuildDir class to handle locking of the | |
36 |
| zmedico | build dir. | |
37 |
|
38 |
| 10842 | Instead of calling the ebuild "clean" phase in | |
39 |
| zmedico | MergeTask.merge(), move it inside doebuild() where it can be | |
40 |
| | tied into the actionmap_deps framework. | |
41 |
|
42 |
| 10843 | Move clean code, from the previous commit, from doebuild() | |
43 |
| zmedico | to EbuildBuild.execute() where it fits better. | |
44 |
|
45 |
|
46 |
Modified: main/branches/prefix/bin/ebuild.sh |
47 |
=================================================================== |
48 |
--- main/branches/prefix/bin/ebuild.sh 2008-07-01 16:55:38 UTC (rev 10877) |
49 |
+++ main/branches/prefix/bin/ebuild.sh 2008-07-01 16:59:40 UTC (rev 10878) |
50 |
@@ -204,6 +204,18 @@ |
51 |
# Takes single depend-type atoms. |
52 |
PYTHONPATH="${PORTAGE_PYM_PATH}:${PYTHONPATH}" \ |
53 |
"${PORTAGE_BIN_PATH}/portageq" 'best_version' "${ROOT}" "$1" |
54 |
+ local retval=$? |
55 |
+ case "${retval}" in |
56 |
+ 0) |
57 |
+ return 0 |
58 |
+ ;; |
59 |
+ 1) |
60 |
+ return 1 |
61 |
+ ;; |
62 |
+ *) |
63 |
+ die "unexpected portageq exit code: ${retval}" |
64 |
+ ;; |
65 |
+ esac |
66 |
} |
67 |
|
68 |
use_with() { |
69 |
|
70 |
Modified: main/branches/prefix/bin/portageq |
71 |
=================================================================== |
72 |
--- main/branches/prefix/bin/portageq 2008-07-01 16:55:38 UTC (rev 10877) |
73 |
+++ main/branches/prefix/bin/portageq 2008-07-01 16:59:40 UTC (rev 10878) |
74 |
@@ -51,6 +51,10 @@ |
75 |
if (len(argv) < 2): |
76 |
print "ERROR: insufficient parameters!" |
77 |
sys.exit(2) |
78 |
+ if atom_validate_strict and not portage.isvalidatom(argv[1]): |
79 |
+ portage.writemsg("ERROR: Invalid atom: '%s'\n" % argv[1], |
80 |
+ noiselevel=-1) |
81 |
+ return 2 |
82 |
try: |
83 |
mylist=portage.db[argv[0]]["vartree"].dbapi.match(argv[1]) |
84 |
if mylist: |
85 |
@@ -69,6 +73,10 @@ |
86 |
if (len(argv) < 2): |
87 |
print "ERROR: insufficient parameters!" |
88 |
sys.exit(2) |
89 |
+ if atom_validate_strict and not portage.isvalidatom(argv[1]): |
90 |
+ portage.writemsg("ERROR: Invalid atom: '%s'\n" % argv[1], |
91 |
+ noiselevel=-1) |
92 |
+ return 2 |
93 |
try: |
94 |
mylist=portage.db[argv[0]]["vartree"].dbapi.match(argv[1]) |
95 |
print portage.best(mylist) |
96 |
@@ -268,6 +276,10 @@ |
97 |
sys.exit(2) |
98 |
root, atom = argv |
99 |
if atom: |
100 |
+ if atom_validate_strict and not portage.isvalidatom(atom): |
101 |
+ portage.writemsg("ERROR: Invalid atom: '%s'\n" % atom, |
102 |
+ noiselevel=-1) |
103 |
+ return 2 |
104 |
results = portage.db[root]["vartree"].dbapi.match(atom) |
105 |
else: |
106 |
results = portage.db[root]["vartree"].dbapi.cpv_all() |
107 |
@@ -437,6 +449,8 @@ |
108 |
if (len(sys.argv) == 1): |
109 |
print "\nRun portageq with --help for info" |
110 |
|
111 |
+atom_validate_strict = "EBUILD_PHASE" in os.environ |
112 |
+ |
113 |
def main(): |
114 |
if "-h" in sys.argv or "--help" in sys.argv: |
115 |
usage(sys.argv) |
116 |
|
117 |
Modified: main/branches/prefix/pym/_emerge/__init__.py |
118 |
=================================================================== |
119 |
--- main/branches/prefix/pym/_emerge/__init__.py 2008-07-01 16:55:38 UTC (rev 10877) |
120 |
+++ main/branches/prefix/pym/_emerge/__init__.py 2008-07-01 16:59:40 UTC (rev 10878) |
121 |
@@ -1478,10 +1478,84 @@ |
122 |
mydbapi=portdb, tree="porttree") |
123 |
return retval |
124 |
|
125 |
+class EbuildBuildDir(SlotObject): |
126 |
+ |
127 |
+ __slots__ = ("pkg", "settings", |
128 |
+ "locked", "_catdir", "_lock_obj") |
129 |
+ |
130 |
+ def __init__(self, **kwargs): |
131 |
+ SlotObject.__init__(self, **kwargs) |
132 |
+ self.locked = False |
133 |
+ |
134 |
+ def lock(self): |
135 |
+ """ |
136 |
+ This raises an AlreadyLocked exception if lock() is called |
137 |
+ while a lock is already held. In order to avoid this, call |
138 |
+ unlock() or check whether the "locked" attribute is True |
139 |
+ or False before calling lock(). |
140 |
+ """ |
141 |
+ if self._lock_obj is not None: |
142 |
+ raise self.AlreadyLocked((self._lock_obj,)) |
143 |
+ |
144 |
+ root_config = self.pkg.root_config |
145 |
+ portdb = root_config.trees["porttree"].dbapi |
146 |
+ ebuild_path = portdb.findname(self.pkg.cpv) |
147 |
+ settings = self.settings |
148 |
+ debug = settings.get("PORTAGE_DEBUG") == "1" |
149 |
+ use_cache = 1 # always true |
150 |
+ |
151 |
+ portage.doebuild_environment(ebuild_path, "setup", root_config.root, |
152 |
+ self.settings, debug, use_cache, portdb) |
153 |
+ catdir = os.path.dirname(settings["PORTAGE_BUILDDIR"]) |
154 |
+ self._catdir = catdir |
155 |
+ portage.util.ensure_dirs(os.path.dirname(catdir), |
156 |
+ uid=portage.portage_uid, gid=portage.portage_gid, |
157 |
+ mode=070, mask=0) |
158 |
+ catdir_lock = None |
159 |
+ try: |
160 |
+ catdir_lock = portage.locks.lockdir(catdir) |
161 |
+ portage.util.ensure_dirs(catdir, |
162 |
+ gid=portage.portage_gid, |
163 |
+ mode=070, mask=0) |
164 |
+ self._lock_obj = portage.locks.lockdir( |
165 |
+ self.settings["PORTAGE_BUILDDIR"]) |
166 |
+ finally: |
167 |
+ self.locked = self._lock_obj is not None |
168 |
+ if catdir_lock is not None: |
169 |
+ portage.locks.unlockdir(catdir_lock) |
170 |
+ |
171 |
+ def unlock(self): |
172 |
+ if self._lock_obj is None: |
173 |
+ return |
174 |
+ |
175 |
+ portage.locks.unlockdir(self._lock_obj) |
176 |
+ self._lock_obj = None |
177 |
+ self.locked = False |
178 |
+ |
179 |
+ catdir = self._catdir |
180 |
+ catdir_lock = None |
181 |
+ try: |
182 |
+ catdir_lock = portage.locks.lockdir(catdir) |
183 |
+ finally: |
184 |
+ if catdir_lock: |
185 |
+ try: |
186 |
+ os.rmdir(catdir) |
187 |
+ except OSError, e: |
188 |
+ if e.errno not in (errno.ENOENT, |
189 |
+ errno.ENOTEMPTY, errno.EEXIST): |
190 |
+ raise |
191 |
+ del e |
192 |
+ portage.locks.unlockdir(catdir_lock) |
193 |
+ |
194 |
+ class AlreadyLocked(portage.exception.PortageException): |
195 |
+ pass |
196 |
+ |
197 |
class EbuildBuild(Task): |
198 |
+ """ |
199 |
+ TODO: Support asynchronous execution, to implement parallel builds. |
200 |
+ """ |
201 |
+ __slots__ = ("pkg", "settings") |
202 |
|
203 |
- __slots__ = ("pkg", "pretend", "settings") |
204 |
- |
205 |
def _get_hash_key(self): |
206 |
hash_key = getattr(self, "_hash_key", None) |
207 |
if hash_key is None: |
208 |
@@ -1491,19 +1565,26 @@ |
209 |
def execute(self): |
210 |
root_config = self.pkg.root_config |
211 |
portdb = root_config.trees["porttree"].dbapi |
212 |
- vartree = root_config.trees["vartree"] |
213 |
ebuild_path = portdb.findname(self.pkg.cpv) |
214 |
debug = self.settings.get("PORTAGE_DEBUG") == "1" |
215 |
|
216 |
+ retval = portage.doebuild(ebuild_path, "clean", |
217 |
+ root_config.root, self.settings, debug, cleanup=1, |
218 |
+ mydbapi=portdb, tree="porttree") |
219 |
+ if retval != os.EX_OK: |
220 |
+ return retval |
221 |
+ |
222 |
retval = portage.doebuild(ebuild_path, "install", |
223 |
- root_config.root, self.settings, debug, vartree=vartree, |
224 |
+ root_config.root, self.settings, debug, |
225 |
mydbapi=portdb, tree="porttree") |
226 |
return retval |
227 |
|
228 |
class EbuildBinpkg(Task): |
229 |
+ """ |
230 |
+ This assumes that src_install() has successfully completed. |
231 |
+ """ |
232 |
+ __slots__ = ("pkg", "settings") |
233 |
|
234 |
- __slots__ = ("pkg", "pretend", "settings") |
235 |
- |
236 |
def _get_hash_key(self): |
237 |
hash_key = getattr(self, "_hash_key", None) |
238 |
if hash_key is None: |
239 |
@@ -1525,13 +1606,21 @@ |
240 |
settings["PORTAGE_BINPKG_TMPFILE"] = binpkg_tmpfile |
241 |
settings.backup_changes("PORTAGE_BINPKG_TMPFILE") |
242 |
|
243 |
+ # Earlier phases should already be done, so |
244 |
+ # use "noauto" to quietly skip them. |
245 |
+ settings.features.append("noauto") |
246 |
+ |
247 |
try: |
248 |
retval = portage.doebuild(ebuild_path, |
249 |
"package", root_config.root, |
250 |
settings, debug, mydbapi=portdb, |
251 |
tree="porttree") |
252 |
finally: |
253 |
- self.settings.pop("PORTAGE_BINPKG_TMPFILE", None) |
254 |
+ settings.pop("PORTAGE_BINPKG_TMPFILE", None) |
255 |
+ try: |
256 |
+ settings.features.remove("noauto") |
257 |
+ except ValueError: |
258 |
+ pass |
259 |
|
260 |
if retval == os.EX_OK: |
261 |
bintree.inject(pkg.cpv, filename=binpkg_tmpfile) |
262 |
@@ -6516,35 +6605,16 @@ |
263 |
self.curval += 1 |
264 |
return |
265 |
|
266 |
- portage.doebuild_environment(y, "setup", myroot, |
267 |
- pkgsettings, self.edebug, 1, portdb) |
268 |
- catdir = os.path.dirname(pkgsettings["PORTAGE_BUILDDIR"]) |
269 |
- portage.util.ensure_dirs(os.path.dirname(catdir), |
270 |
- uid=portage.portage_uid, gid=portage.portage_gid, |
271 |
- mode=070, mask=0) |
272 |
- builddir_lock = None |
273 |
- catdir_lock = None |
274 |
+ build_dir = EbuildBuildDir(pkg=pkg, settings=pkgsettings) |
275 |
try: |
276 |
- catdir_lock = portage.locks.lockdir(catdir) |
277 |
- portage.util.ensure_dirs(catdir, |
278 |
- gid=portage.portage_gid, |
279 |
- mode=070, mask=0) |
280 |
- builddir_lock = portage.locks.lockdir( |
281 |
- pkgsettings["PORTAGE_BUILDDIR"]) |
282 |
- try: |
283 |
- portage.locks.unlockdir(catdir_lock) |
284 |
- finally: |
285 |
- catdir_lock = None |
286 |
+ build_dir.lock() |
287 |
+ # Cleaning is triggered before the setup |
288 |
+ # phase, in portage.doebuild(). |
289 |
msg = " === (%s of %s) Cleaning (%s::%s)" % \ |
290 |
(mergecount, len(mymergelist), pkg_key, y) |
291 |
short_msg = "emerge: (%s of %s) %s Clean" % \ |
292 |
(mergecount, len(mymergelist), pkg_key) |
293 |
emergelog(xterm_titles, msg, short_msg=short_msg) |
294 |
- retval = portage.doebuild(y, "clean", myroot, |
295 |
- pkgsettings, self.edebug, cleanup=1, |
296 |
- mydbapi=portdb, tree="porttree") |
297 |
- if retval != os.EX_OK: |
298 |
- raise self._pkg_failure(retval) |
299 |
|
300 |
if "--buildpkg" in self.myopts or issyspkg: |
301 |
if issyspkg: |
302 |
@@ -6556,12 +6626,16 @@ |
303 |
(mergecount, len(mymergelist), pkg_key) |
304 |
emergelog(xterm_titles, msg, short_msg=short_msg) |
305 |
|
306 |
- build = EbuildBinpkg(pkg=pkg, pretend=pretend, |
307 |
- settings=pkgsettings) |
308 |
+ build = EbuildBuild(pkg=pkg, settings=pkgsettings) |
309 |
retval = build.execute() |
310 |
if retval != os.EX_OK: |
311 |
raise self._pkg_failure(retval) |
312 |
|
313 |
+ build = EbuildBinpkg(pkg=pkg, settings=pkgsettings) |
314 |
+ retval = build.execute() |
315 |
+ if retval != os.EX_OK: |
316 |
+ raise self._pkg_failure(retval) |
317 |
+ |
318 |
if "--buildpkgonly" not in self.myopts: |
319 |
msg = " === (%s of %s) Merging (%s::%s)" % \ |
320 |
(mergecount, len(mymergelist), pkg_key, y) |
321 |
@@ -6569,14 +6643,11 @@ |
322 |
(mergecount, len(mymergelist), pkg_key) |
323 |
emergelog(xterm_titles, msg, short_msg=short_msg) |
324 |
|
325 |
- retval = portage.merge(pkgsettings["CATEGORY"], |
326 |
- pkgsettings["PF"], pkgsettings["D"], |
327 |
- os.path.join(pkgsettings["PORTAGE_BUILDDIR"], |
328 |
- "build-info"), myroot, pkgsettings, |
329 |
- myebuild=pkgsettings["EBUILD"], |
330 |
- mytree="porttree", mydbapi=portdb, |
331 |
- vartree=vartree, prev_mtimes=ldpath_mtimes, |
332 |
- blockers=self._find_blockers(pkg)) |
333 |
+ merge = EbuildMerge( |
334 |
+ find_blockers=self._find_blockers(pkg), |
335 |
+ ldpath_mtimes=ldpath_mtimes, |
336 |
+ pkg=pkg, pretend=pretend, settings=pkgsettings) |
337 |
+ retval = merge.execute() |
338 |
if retval != os.EX_OK: |
339 |
raise self._pkg_failure(retval) |
340 |
elif "noclean" not in pkgsettings.features: |
341 |
@@ -6590,8 +6661,7 @@ |
342 |
(mergecount, len(mymergelist), pkg_key) |
343 |
emergelog(xterm_titles, msg, short_msg=short_msg) |
344 |
|
345 |
- build = EbuildBuild(ldpath_mtimes=ldpath_mtimes, |
346 |
- pkg=pkg, pretend=pretend, settings=pkgsettings) |
347 |
+ build = EbuildBuild(pkg=pkg, settings=pkgsettings) |
348 |
retval = build.execute() |
349 |
if retval != os.EX_OK: |
350 |
raise self._pkg_failure(retval) |
351 |
@@ -6605,24 +6675,10 @@ |
352 |
if retval != os.EX_OK: |
353 |
raise self._pkg_failure(retval) |
354 |
finally: |
355 |
- if builddir_lock: |
356 |
+ if build_dir.locked: |
357 |
elog_process(pkg.cpv, pkgsettings, |
358 |
phasefilter=filter_mergephases) |
359 |
- portage.locks.unlockdir(builddir_lock) |
360 |
- try: |
361 |
- if not catdir_lock: |
362 |
- # Lock catdir for removal if empty. |
363 |
- catdir_lock = portage.locks.lockdir(catdir) |
364 |
- finally: |
365 |
- if catdir_lock: |
366 |
- try: |
367 |
- os.rmdir(catdir) |
368 |
- except OSError, e: |
369 |
- if e.errno not in (errno.ENOENT, |
370 |
- errno.ENOTEMPTY, errno.EEXIST): |
371 |
- raise |
372 |
- del e |
373 |
- portage.locks.unlockdir(catdir_lock) |
374 |
+ build_dir.unlock() |
375 |
|
376 |
elif x[0]=="binary": |
377 |
#merge the tbz2 |
378 |
|
379 |
Modified: main/branches/prefix/pym/portage/__init__.py |
380 |
=================================================================== |
381 |
--- main/branches/prefix/pym/portage/__init__.py 2008-07-01 16:55:38 UTC (rev 10877) |
382 |
+++ main/branches/prefix/pym/portage/__init__.py 2008-07-01 16:59:40 UTC (rev 10878) |
383 |
@@ -2415,10 +2415,21 @@ |
384 |
if not accept_chost: |
385 |
self._accept_chost_re = re.compile(".*") |
386 |
elif len(accept_chost) == 1: |
387 |
- self._accept_chost_re = re.compile(r'^%s$' % accept_chost[0]) |
388 |
+ try: |
389 |
+ self._accept_chost_re = re.compile(r'^%s$' % accept_chost[0]) |
390 |
+ except re.error, e: |
391 |
+ writemsg("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n" % \ |
392 |
+ (accept_chost[0], e), noiselevel=-1) |
393 |
+ self._accept_chost_re = re.compile("^$") |
394 |
else: |
395 |
- self._accept_chost_re = re.compile( |
396 |
- r'^(%s)$' % "|".join(accept_chost)) |
397 |
+ try: |
398 |
+ self._accept_chost_re = re.compile( |
399 |
+ r'^(%s)$' % "|".join(accept_chost)) |
400 |
+ except re.error, e: |
401 |
+ writemsg("!!! Invalid ACCEPT_CHOSTS value: '%s': %s\n" % \ |
402 |
+ (" ".join(accept_chost), e), noiselevel=-1) |
403 |
+ self._accept_chost_re = re.compile("^$") |
404 |
+ |
405 |
return self._accept_chost_re.match( |
406 |
pkg.metadata.get("CHOST", "")) is not None |
407 |
|
408 |
@@ -4855,6 +4866,7 @@ |
409 |
vartree = db[myroot]["vartree"] |
410 |
|
411 |
features = mysettings.features |
412 |
+ noauto = "noauto" in features |
413 |
from portage.data import secpass |
414 |
|
415 |
validcommands = ["help","clean","prerm","postrm","cleanrm","preinst","postinst", |
416 |
@@ -4970,6 +4982,12 @@ |
417 |
doebuild_environment(myebuild, mydo, myroot, mysettings, debug, |
418 |
use_cache, mydbapi) |
419 |
|
420 |
+ clean_phases = ("clean", "cleanrm") |
421 |
+ if mydo in clean_phases: |
422 |
+ retval = spawn(_shell_quote(ebuild_sh_binary) + " clean", |
423 |
+ mysettings, debug=debug, free=1, logfile=None) |
424 |
+ return retval |
425 |
+ |
426 |
# get possible slot information from the deps file |
427 |
if mydo == "depend": |
428 |
writemsg("!!! DEBUG: dbkey: %s\n" % str(dbkey), 2) |
429 |
@@ -5182,10 +5200,7 @@ |
430 |
|
431 |
# if any of these are being called, handle them -- running them out of |
432 |
# the sandbox -- and stop now. |
433 |
- if mydo in ["clean","cleanrm"]: |
434 |
- return spawn(_shell_quote(ebuild_sh_binary) + " clean", mysettings, |
435 |
- debug=debug, free=1, logfile=None) |
436 |
- elif mydo == "help": |
437 |
+ if mydo == "help": |
438 |
return spawn(_shell_quote(ebuild_sh_binary) + " " + mydo, |
439 |
mysettings, debug=debug, free=1, logfile=logfile) |
440 |
elif mydo == "setup": |
441 |
|
442 |
-- |
443 |
gentoo-commits@l.g.o mailing list |