Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r10841 - main/trunk/pym/_emerge
Date: Sun, 29 Jun 2008 01:43:21
Message-Id: E1KClwg-0001ZN-NC@stork.gentoo.org
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