1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
5 from _emerge.SlotObject import SlotObject
9 from portage.elog.messages import eerror
11 class EbuildFetchonly(SlotObject):
13 __slots__ = ("fetch_all", "pkg", "pretend", "settings")
16 settings = self.settings
18 portdb = pkg.root_config.trees["porttree"].dbapi
19 ebuild_path = portdb.findname(pkg.cpv)
21 debug = settings.get("PORTAGE_DEBUG") == "1"
23 if 'fetch' in pkg.metadata.restrict:
24 rval = self._execute_with_builddir()
26 rval = portage.doebuild(ebuild_path, "fetch",
27 settings["ROOT"], settings, debug=debug,
28 listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all,
29 mydbapi=portdb, tree="porttree")
32 msg = "Fetch failed for '%s'" % (pkg.cpv,)
33 eerror(msg, phase="unpack", key=pkg.cpv)
37 def _execute_with_builddir(self):
38 # To spawn pkg_nofetch requires PORTAGE_BUILDDIR for
39 # ensuring sane $PWD (bug #239560) and storing elog
40 # messages. Use a private temp directory, in order
41 # to avoid locking the main one.
42 settings = self.settings
43 global_tmpdir = settings["PORTAGE_TMPDIR"]
44 from tempfile import mkdtemp
46 private_tmpdir = mkdtemp("", "._portage_fetch_.", global_tmpdir)
48 if e.errno != portage.exception.PermissionDenied.errno:
50 raise portage.exception.PermissionDenied(global_tmpdir)
51 settings["PORTAGE_TMPDIR"] = private_tmpdir
52 settings.backup_changes("PORTAGE_TMPDIR")
54 retval = self._execute()
56 settings["PORTAGE_TMPDIR"] = global_tmpdir
57 settings.backup_changes("PORTAGE_TMPDIR")
58 shutil.rmtree(private_tmpdir)
62 settings = self.settings
64 root_config = pkg.root_config
65 portdb = root_config.trees["porttree"].dbapi
66 ebuild_path = portdb.findname(pkg.cpv)
67 debug = settings.get("PORTAGE_DEBUG") == "1"
68 retval = portage.doebuild(ebuild_path, "fetch",
69 self.settings["ROOT"], self.settings, debug=debug,
70 listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all,
71 mydbapi=portdb, tree="porttree")
73 if retval != os.EX_OK:
74 msg = "Fetch failed for '%s'" % (pkg.cpv,)
75 eerror(msg, phase="unpack", key=pkg.cpv)
77 portage.elog.elog_process(self.pkg.cpv, self.settings)