summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2006-10-11 05:54:12 +0000
committerZac Medico <zmedico@gentoo.org>2006-10-11 05:54:12 +0000
commit521dacce2bc7037371e4a8958dc3a7ab3983a9bf (patch)
tree095df22b79f6eaa19a938ff9c9652f06e41215e8 /bin
parent92e8479365b7c38dedbdd96e1b8e3eb2645506d4 (diff)
downloadportage-521dacce2bc7037371e4a8958dc3a7ab3983a9bf.tar.gz
portage-521dacce2bc7037371e4a8958dc3a7ab3983a9bf.tar.bz2
portage-521dacce2bc7037371e4a8958dc3a7ab3983a9bf.zip
Move PORTAGE_BUILDDIR in to a category subdirectory and clean up the category directory if empty (while holding lock). This this will help avoid PORTAGE_BUILDDIR collisions for parallel builds and will also hack around bug #150454.
svn path=/main/trunk/; revision=4654
Diffstat (limited to 'bin')
-rwxr-xr-xbin/emerge26
1 files changed, 24 insertions, 2 deletions
diff --git a/bin/emerge b/bin/emerge
index f82448a4a..ee53b647e 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -2118,14 +2118,23 @@ class MergeTask(object):
portage.doebuild_environment(y, "setup", myroot,
pkgsettings, self.edebug, 1, portdb)
- portage_util.ensure_dirs(
- os.path.dirname(pkgsettings["PORTAGE_BUILDDIR"]),
+ catdir = os.path.dirname(pkgsettings["PORTAGE_BUILDDIR"])
+ portage_util.ensure_dirs(os.path.dirname(catdir),
uid=portage.portage_uid, gid=portage.portage_gid,
mode=070, mask=0)
builddir_lock = None
+ catdir_lock = None
try:
+ catdir_lock = portage_locks.lockdir(catdir)
+ portage_util.ensure_dirs(catdir,
+ uid=portage.portage_uid, gid=portage.portage_gid,
+ mode=070, mask=0)
builddir_lock = portage_locks.lockdir(
pkgsettings["PORTAGE_BUILDDIR"])
+ try:
+ portage_locks.unlockdir(catdir_lock)
+ finally:
+ catdir_lock = None
msg = " === (%s of %s) Cleaning (%s::%s)" % \
(mergecount, len(mymergelist), pkg_key, y)
short_msg = "emerge: (%s of %s) %s Clean" % \
@@ -2187,6 +2196,19 @@ class MergeTask(object):
finally:
if builddir_lock:
portage_locks.unlockdir(builddir_lock)
+ try:
+ if not catdir_lock:
+ # Lock catdir for removal if empty.
+ catdir_lock = portage_locks.lockdir(catdir)
+ finally:
+ if catdir_lock:
+ try:
+ os.rmdir(catdir)
+ except OSError, e:
+ if e.errno != errno.ENOTEMPTY:
+ raise
+ del e
+ portage_locks.unlockdir(catdir_lock)
elif x[0]=="binary":
#merge the tbz2