1 |
Author: zmedico |
2 |
Date: 2008-06-29 01:43:13 +0000 (Sun, 29 Jun 2008) |
3 |
New Revision: 10841 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Split out an EbuildBuildDir class to handle locking of the build dir. |
9 |
|
10 |
|
11 |
Modified: main/trunk/pym/_emerge/__init__.py |
12 |
=================================================================== |
13 |
--- main/trunk/pym/_emerge/__init__.py 2008-06-28 23:54:43 UTC (rev 10840) |
14 |
+++ main/trunk/pym/_emerge/__init__.py 2008-06-29 01:43:13 UTC (rev 10841) |
15 |
@@ -1451,6 +1451,78 @@ |
16 |
mydbapi=portdb, tree="porttree") |
17 |
return retval |
18 |
|
19 |
+class EbuildBuildDir(SlotObject): |
20 |
+ |
21 |
+ __slots__ = ("pkg", "settings", |
22 |
+ "locked", "_catdir", "_lock_obj") |
23 |
+ |
24 |
+ def __init__(self, **kwargs): |
25 |
+ SlotObject.__init__(self, **kwargs) |
26 |
+ self.locked = False |
27 |
+ |
28 |
+ def lock(self): |
29 |
+ """ |
30 |
+ This raises an AlreadyLocked exception if lock() is called |
31 |
+ while a lock is already held. In order to avoid this, call |
32 |
+ unlock() or check whether the "locked" attribute is True |
33 |
+ or False before calling lock(). |
34 |
+ """ |
35 |
+ if self._lock_obj is not None: |
36 |
+ raise self.AlreadyLocked((self._lock_obj,)) |
37 |
+ |
38 |
+ root_config = self.pkg.root_config |
39 |
+ portdb = root_config.trees["porttree"].dbapi |
40 |
+ ebuild_path = portdb.findname(self.pkg.cpv) |
41 |
+ settings = self.settings |
42 |
+ debug = settings.get("PORTAGE_DEBUG") == "1" |
43 |
+ use_cache = 1 # always true |
44 |
+ |
45 |
+ portage.doebuild_environment(ebuild_path, "setup", root_config.root, |
46 |
+ self.settings, debug, use_cache, portdb) |
47 |
+ catdir = os.path.dirname(settings["PORTAGE_BUILDDIR"]) |
48 |
+ self._catdir = catdir |
49 |
+ portage.util.ensure_dirs(os.path.dirname(catdir), |
50 |
+ uid=portage.portage_uid, gid=portage.portage_gid, |
51 |
+ mode=070, mask=0) |
52 |
+ catdir_lock = None |
53 |
+ try: |
54 |
+ catdir_lock = portage.locks.lockdir(catdir) |
55 |
+ portage.util.ensure_dirs(catdir, |
56 |
+ gid=portage.portage_gid, |
57 |
+ mode=070, mask=0) |
58 |
+ self._lock_obj = portage.locks.lockdir( |
59 |
+ self.settings["PORTAGE_BUILDDIR"]) |
60 |
+ finally: |
61 |
+ self.locked = self._lock_obj is not None |
62 |
+ if catdir_lock is not None: |
63 |
+ portage.locks.unlockdir(catdir_lock) |
64 |
+ |
65 |
+ def unlock(self): |
66 |
+ if self._lock_obj is None: |
67 |
+ return |
68 |
+ |
69 |
+ portage.locks.unlockdir(self._lock_obj) |
70 |
+ self._lock_obj = None |
71 |
+ self.locked = False |
72 |
+ |
73 |
+ catdir = self._catdir |
74 |
+ catdir_lock = None |
75 |
+ try: |
76 |
+ catdir_lock = portage.locks.lockdir(catdir) |
77 |
+ finally: |
78 |
+ if catdir_lock: |
79 |
+ try: |
80 |
+ os.rmdir(catdir) |
81 |
+ except OSError, e: |
82 |
+ if e.errno not in (errno.ENOENT, |
83 |
+ errno.ENOTEMPTY, errno.EEXIST): |
84 |
+ raise |
85 |
+ del e |
86 |
+ portage.locks.unlockdir(catdir_lock) |
87 |
+ |
88 |
+ class AlreadyLocked(portage.exception.PortageException): |
89 |
+ pass |
90 |
+ |
91 |
class EbuildBuild(Task): |
92 |
""" |
93 |
TODO: Support asynchronous execution, to implement parallel builds. |
94 |
@@ -6487,25 +6559,9 @@ |
95 |
self.curval += 1 |
96 |
return |
97 |
|
98 |
- portage.doebuild_environment(y, "setup", myroot, |
99 |
- pkgsettings, self.edebug, 1, portdb) |
100 |
- catdir = os.path.dirname(pkgsettings["PORTAGE_BUILDDIR"]) |
101 |
- portage.util.ensure_dirs(os.path.dirname(catdir), |
102 |
- uid=portage.portage_uid, gid=portage.portage_gid, |
103 |
- mode=070, mask=0) |
104 |
- builddir_lock = None |
105 |
- catdir_lock = None |
106 |
+ build_dir = EbuildBuildDir(pkg=pkg, settings=pkgsettings) |
107 |
try: |
108 |
- catdir_lock = portage.locks.lockdir(catdir) |
109 |
- portage.util.ensure_dirs(catdir, |
110 |
- gid=portage.portage_gid, |
111 |
- mode=070, mask=0) |
112 |
- builddir_lock = portage.locks.lockdir( |
113 |
- pkgsettings["PORTAGE_BUILDDIR"]) |
114 |
- try: |
115 |
- portage.locks.unlockdir(catdir_lock) |
116 |
- finally: |
117 |
- catdir_lock = None |
118 |
+ build_dir.lock() |
119 |
msg = " === (%s of %s) Cleaning (%s::%s)" % \ |
120 |
(mergecount, len(mymergelist), pkg_key, y) |
121 |
short_msg = "emerge: (%s of %s) %s Clean" % \ |
122 |
@@ -6576,24 +6632,10 @@ |
123 |
if retval != os.EX_OK: |
124 |
raise self._pkg_failure(retval) |
125 |
finally: |
126 |
- if builddir_lock: |
127 |
+ if build_dir.locked: |
128 |
elog_process(pkg.cpv, pkgsettings, |
129 |
phasefilter=filter_mergephases) |
130 |
- portage.locks.unlockdir(builddir_lock) |
131 |
- try: |
132 |
- if not catdir_lock: |
133 |
- # Lock catdir for removal if empty. |
134 |
- catdir_lock = portage.locks.lockdir(catdir) |
135 |
- finally: |
136 |
- if catdir_lock: |
137 |
- try: |
138 |
- os.rmdir(catdir) |
139 |
- except OSError, e: |
140 |
- if e.errno not in (errno.ENOENT, |
141 |
- errno.ENOTEMPTY, errno.EEXIST): |
142 |
- raise |
143 |
- del e |
144 |
- portage.locks.unlockdir(catdir_lock) |
145 |
+ build_dir.unlock() |
146 |
|
147 |
elif x[0]=="binary": |
148 |
#merge the tbz2 |
149 |
|
150 |
-- |
151 |
gentoo-commits@l.g.o mailing list |