diff options
Diffstat (limited to 'pym/_emerge/EbuildFetchonly.py')
-rw-r--r-- | pym/_emerge/EbuildFetchonly.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/pym/_emerge/EbuildFetchonly.py b/pym/_emerge/EbuildFetchonly.py new file mode 100644 index 000000000..c1f361a4d --- /dev/null +++ b/pym/_emerge/EbuildFetchonly.py @@ -0,0 +1,81 @@ +from _emerge.SlotObject import SlotObject +import shutil +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 +from portage.elog.messages import eerror +class EbuildFetchonly(SlotObject): + + __slots__ = ("fetch_all", "pkg", "pretend", "settings") + + def execute(self): + settings = self.settings + pkg = self.pkg + portdb = pkg.root_config.trees["porttree"].dbapi + ebuild_path = portdb.findname(pkg.cpv) + settings.setcpv(pkg) + debug = settings.get("PORTAGE_DEBUG") == "1" + restrict_fetch = 'fetch' in settings['PORTAGE_RESTRICT'].split() + + if restrict_fetch: + rval = self._execute_with_builddir() + else: + rval = portage.doebuild(ebuild_path, "fetch", + settings["ROOT"], settings, debug=debug, + listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all, + mydbapi=portdb, tree="porttree") + + if rval != os.EX_OK: + msg = "Fetch failed for '%s'" % (pkg.cpv,) + eerror(msg, phase="unpack", key=pkg.cpv) + + return rval + + def _execute_with_builddir(self): + # To spawn pkg_nofetch requires PORTAGE_BUILDDIR for + # ensuring sane $PWD (bug #239560) and storing elog + # messages. Use a private temp directory, in order + # to avoid locking the main one. + settings = self.settings + global_tmpdir = settings["PORTAGE_TMPDIR"] + from tempfile import mkdtemp + try: + private_tmpdir = mkdtemp("", "._portage_fetch_.", global_tmpdir) + except OSError, e: + if e.errno != portage.exception.PermissionDenied.errno: + raise + raise portage.exception.PermissionDenied(global_tmpdir) + settings["PORTAGE_TMPDIR"] = private_tmpdir + settings.backup_changes("PORTAGE_TMPDIR") + try: + retval = self._execute() + finally: + settings["PORTAGE_TMPDIR"] = global_tmpdir + settings.backup_changes("PORTAGE_TMPDIR") + shutil.rmtree(private_tmpdir) + return retval + + def _execute(self): + settings = self.settings + pkg = self.pkg + root_config = pkg.root_config + portdb = root_config.trees["porttree"].dbapi + ebuild_path = portdb.findname(pkg.cpv) + debug = settings.get("PORTAGE_DEBUG") == "1" + retval = portage.doebuild(ebuild_path, "fetch", + self.settings["ROOT"], self.settings, debug=debug, + listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all, + mydbapi=portdb, tree="porttree") + + if retval != os.EX_OK: + msg = "Fetch failed for '%s'" % (pkg.cpv,) + eerror(msg, phase="unpack", key=pkg.cpv) + + portage.elog.elog_process(self.pkg.cpv, self.settings) + return retval + |