Gentoo Archives: gentoo-commits

From: "Fabian Groffen (grobian)" <grobian@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10878 - in main/branches/prefix: bin pym/_emerge pym/portage
Date: Tue, 01 Jul 2008 16:59:47
Message-Id: E1KDjCf-0006PX-IL@stork.gentoo.org
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