diff options
author | Zac Medico <zmedico@gentoo.org> | 2009-06-22 16:43:52 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2009-06-22 16:43:52 +0000 |
commit | d057d91f391981fb0564873c471d550f2f62edf5 (patch) | |
tree | d6cd416fc5e9389806ec98a02ae236c99e876e4b /pym/_emerge/EbuildBuildDir.py | |
parent | 28184c982a0688ed9bc4d82df407d4e400f6318c (diff) | |
download | portage-d057d91f391981fb0564873c471d550f2f62edf5.tar.gz portage-d057d91f391981fb0564873c471d550f2f62edf5.tar.bz2 portage-d057d91f391981fb0564873c471d550f2f62edf5.zip |
Bug #275047 - Split _emerge/__init__.py into smaller pieces. Thanks to
Sebastian Mingramm (few) <s.mingramm@gmx.de> for this patch.
svn path=/main/trunk/; revision=13663
Diffstat (limited to 'pym/_emerge/EbuildBuildDir.py')
-rw-r--r-- | pym/_emerge/EbuildBuildDir.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/pym/_emerge/EbuildBuildDir.py b/pym/_emerge/EbuildBuildDir.py new file mode 100644 index 000000000..05fba4e4d --- /dev/null +++ b/pym/_emerge/EbuildBuildDir.py @@ -0,0 +1,96 @@ +from _emerge.SlotObject import SlotObject +try: + import portage +except ImportError: + from os import path as osp + import sys + sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym")) + import portage +import os +import errno +class EbuildBuildDir(SlotObject): + + __slots__ = ("dir_path", "pkg", "settings", + "locked", "_catdir", "_lock_obj") + + def __init__(self, **kwargs): + SlotObject.__init__(self, **kwargs) + self.locked = False + + def lock(self): + """ + This raises an AlreadyLocked exception if lock() is called + while a lock is already held. In order to avoid this, call + unlock() or check whether the "locked" attribute is True + or False before calling lock(). + """ + if self._lock_obj is not None: + raise self.AlreadyLocked((self._lock_obj,)) + + dir_path = self.dir_path + if dir_path is None: + root_config = self.pkg.root_config + portdb = root_config.trees["porttree"].dbapi + ebuild_path = portdb.findname(self.pkg.cpv) + settings = self.settings + settings.setcpv(self.pkg) + debug = settings.get("PORTAGE_DEBUG") == "1" + use_cache = 1 # always true + portage.doebuild_environment(ebuild_path, "setup", root_config.root, + self.settings, debug, use_cache, portdb) + dir_path = self.settings["PORTAGE_BUILDDIR"] + + catdir = os.path.dirname(dir_path) + self._catdir = catdir + + portage.util.ensure_dirs(os.path.dirname(catdir), + gid=portage.portage_gid, + mode=070, mask=0) + catdir_lock = None + try: + catdir_lock = portage.locks.lockdir(catdir) + portage.util.ensure_dirs(catdir, + gid=portage.portage_gid, + mode=070, mask=0) + self._lock_obj = portage.locks.lockdir(dir_path) + finally: + self.locked = self._lock_obj is not None + if catdir_lock is not None: + portage.locks.unlockdir(catdir_lock) + + def clean_log(self): + """Discard existing log.""" + settings = self.settings + + for x in ('.logid', 'temp/build.log'): + try: + os.unlink(os.path.join(settings["PORTAGE_BUILDDIR"], x)) + except OSError: + pass + + def unlock(self): + if self._lock_obj is None: + return + + portage.locks.unlockdir(self._lock_obj) + self._lock_obj = None + self.locked = False + + catdir = self._catdir + catdir_lock = None + try: + catdir_lock = portage.locks.lockdir(catdir) + finally: + if catdir_lock: + try: + os.rmdir(catdir) + except OSError, e: + if e.errno not in (errno.ENOENT, + errno.ENOTEMPTY, errno.EEXIST): + raise + del e + portage.locks.unlockdir(catdir_lock) + + class AlreadyLocked(portage.exception.PortageException): + pass + |