Bug #286522 - Check all portdbapi.findname return values in case it
[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                 if ebuild_path is None:
21                         raise AssertionError("ebuild not found for '%s'" % pkg.cpv)
22                 settings.setcpv(pkg)
23                 debug = settings.get("PORTAGE_DEBUG") == "1"
24
25                 if 'fetch' in pkg.metadata.restrict:
26                         rval = self._execute_with_builddir()
27                 else:
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")
32
33                         if rval != os.EX_OK:
34                                 msg = "Fetch failed for '%s'" % (pkg.cpv,)
35                                 eerror(msg, phase="unpack", key=pkg.cpv)
36
37                 return rval
38
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
47                 try:
48                         private_tmpdir = mkdtemp("", "._portage_fetch_.", global_tmpdir)
49                 except OSError as e:
50                         if e.errno != portage.exception.PermissionDenied.errno:
51                                 raise
52                         raise portage.exception.PermissionDenied(global_tmpdir)
53                 settings["PORTAGE_TMPDIR"] = private_tmpdir
54                 settings.backup_changes("PORTAGE_TMPDIR")
55                 try:
56                         retval = self._execute()
57                 finally:
58                         settings["PORTAGE_TMPDIR"] = global_tmpdir
59                         settings.backup_changes("PORTAGE_TMPDIR")
60                         shutil.rmtree(private_tmpdir)
61                 return retval
62
63         def _execute(self):
64                 settings = self.settings
65                 pkg = self.pkg
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")
76
77                 if retval != os.EX_OK:
78                         msg = "Fetch failed for '%s'" % (pkg.cpv,)
79                         eerror(msg, phase="unpack", key=pkg.cpv)
80
81                 portage.elog.elog_process(self.pkg.cpv, self.settings)
82                 return retval
83