256a06c6902d43f5379719e108ad0173496612b5
[portage.git] / pym / _emerge / EbuildFetchonly.py
1 # Copyright 1999-2009 Gentoo Foundation
2 # Distributed under the terms of the GNU General Public License v2
3 # $Id$
4
5 from _emerge.SlotObject import SlotObject
6 import shutil
7 import portage
8 from portage import os
9 from portage.elog.messages import eerror
10
11 class EbuildFetchonly(SlotObject):
12
13         __slots__ = ("fetch_all", "pkg", "pretend", "settings")
14
15         def execute(self):
16                 settings = self.settings
17                 pkg = self.pkg
18                 portdb = pkg.root_config.trees["porttree"].dbapi
19                 ebuild_path = portdb.findname(pkg.cpv)
20                 settings.setcpv(pkg)
21                 debug = settings.get("PORTAGE_DEBUG") == "1"
22
23                 if 'fetch' in pkg.metadata.restrict:
24                         rval = self._execute_with_builddir()
25                 else:
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")
30
31                         if rval != os.EX_OK:
32                                 msg = "Fetch failed for '%s'" % (pkg.cpv,)
33                                 eerror(msg, phase="unpack", key=pkg.cpv)
34
35                 return rval
36
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
45                 try:
46                         private_tmpdir = mkdtemp("", "._portage_fetch_.", global_tmpdir)
47                 except OSError as e:
48                         if e.errno != portage.exception.PermissionDenied.errno:
49                                 raise
50                         raise portage.exception.PermissionDenied(global_tmpdir)
51                 settings["PORTAGE_TMPDIR"] = private_tmpdir
52                 settings.backup_changes("PORTAGE_TMPDIR")
53                 try:
54                         retval = self._execute()
55                 finally:
56                         settings["PORTAGE_TMPDIR"] = global_tmpdir
57                         settings.backup_changes("PORTAGE_TMPDIR")
58                         shutil.rmtree(private_tmpdir)
59                 return retval
60
61         def _execute(self):
62                 settings = self.settings
63                 pkg = self.pkg
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")
72
73                 if retval != os.EX_OK:
74                         msg = "Fetch failed for '%s'" % (pkg.cpv,)
75                         eerror(msg, phase="unpack", key=pkg.cpv)
76
77                 portage.elog.elog_process(self.pkg.cpv, self.settings)
78                 return retval
79