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)
20 if ebuild_path is None:
21 raise AssertionError("ebuild not found for '%s'" % pkg.cpv)
23 debug = settings.get("PORTAGE_DEBUG") == "1"
25 if 'fetch' in pkg.metadata.restrict:
26 rval = self._execute_with_builddir()
28 rval = portage.doebuild(ebuild_path, "fetch",
29 settings["ROOT"], settings, debug=debug,
30 listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all,
31 mydbapi=portdb, tree="porttree")
34 msg = "Fetch failed for '%s'" % (pkg.cpv,)
35 eerror(msg, phase="unpack", key=pkg.cpv)
39 def _execute_with_builddir(self):
40 # To spawn pkg_nofetch requires PORTAGE_BUILDDIR for
41 # ensuring sane $PWD (bug #239560) and storing elog
42 # messages. Use a private temp directory, in order
43 # to avoid locking the main one.
44 settings = self.settings
45 global_tmpdir = settings["PORTAGE_TMPDIR"]
46 from tempfile import mkdtemp
48 private_tmpdir = mkdtemp("", "._portage_fetch_.", global_tmpdir)
50 if e.errno != portage.exception.PermissionDenied.errno:
52 raise portage.exception.PermissionDenied(global_tmpdir)
53 settings["PORTAGE_TMPDIR"] = private_tmpdir
54 settings.backup_changes("PORTAGE_TMPDIR")
56 retval = self._execute()
58 settings["PORTAGE_TMPDIR"] = global_tmpdir
59 settings.backup_changes("PORTAGE_TMPDIR")
60 shutil.rmtree(private_tmpdir)
64 settings = self.settings
66 root_config = pkg.root_config
67 portdb = root_config.trees["porttree"].dbapi
68 ebuild_path = portdb.findname(pkg.cpv)
69 if ebuild_path is None:
70 raise AssertionError("ebuild not found for '%s'" % pkg.cpv)
71 debug = settings.get("PORTAGE_DEBUG") == "1"
72 retval = portage.doebuild(ebuild_path, "fetch",
73 self.settings["ROOT"], self.settings, debug=debug,
74 listonly=self.pretend, fetchonly=1, fetchall=self.fetch_all,
75 mydbapi=portdb, tree="porttree")
77 if retval != os.EX_OK:
78 msg = "Fetch failed for '%s'" % (pkg.cpv,)
79 eerror(msg, phase="unpack", key=pkg.cpv)
81 portage.elog.elog_process(self.pkg.cpv, self.settings)