Gentoo Archives: gentoo-portage-dev

From: Alexander Berntsen <bernalex@g.o>
To: gentoo-portage-dev@l.g.o
Subject: [gentoo-portage-dev] [PATCH 2/2] Turn a traceback into a graceful error
Date: Fri, 16 May 2014 15:05:54
Message-Id: 1400252732-5850-2-git-send-email-bernalex@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH 1/2] Revert 'packages' profile as directory patches by Alexander Berntsen
1 Prior to this patch, the following would traceback:
2
3 mkdir -p /etc/portage/make.profile/packages
4 emerge foo
5
6 This patch turns such a traceback into an error by implementing
7 IsADirectory error handling.
8 ---
9 bin/emerge | 9 ++++++++-
10 pym/portage/exception.py | 4 ++++
11 pym/portage/package/ebuild/config.py | 13 ++++++++++---
12 pym/portage/util/__init__.py | 3 ++-
13 4 files changed, 24 insertions(+), 5 deletions(-)
14
15 diff --git a/bin/emerge b/bin/emerge
16 index bb93d83..7773f7f 100755
17 --- a/bin/emerge
18 +++ b/bin/emerge
19 @@ -45,12 +45,19 @@ try:
20 from _emerge.main import emerge_main
21
22 if __name__ == "__main__":
23 - from portage.exception import ParseError, PermissionDenied
24 + from portage.exception import IsADirectory, ParseError, \
25 + PermissionDenied
26 try:
27 retval = emerge_main()
28 except PermissionDenied as e:
29 sys.stderr.write("Permission denied: '%s'\n" % str(e))
30 sys.exit(e.errno)
31 + except IsADirectory as e:
32 + sys.stderr.write("'%s' is a directory, but should be a file!\n"
33 + "See portage man page for information on "
34 + "which files may be directories.\n" %
35 + str(e))
36 + sys.exit(e.errno)
37 except ParseError as e:
38 sys.stderr.write("%s\n" % str(e))
39 sys.exit(1)
40 diff --git a/pym/portage/exception.py b/pym/portage/exception.py
41 index 6fa5447..ef62e7a 100644
42 --- a/pym/portage/exception.py
43 +++ b/pym/portage/exception.py
44 @@ -84,6 +84,10 @@ class FileNotFound(InvalidLocation):
45 class DirectoryNotFound(InvalidLocation):
46 """A directory was not found when it was expected to exist"""
47
48 +class IsADirectory(PortageException):
49 + """A directory was found when it was expected to be a file"""
50 + from errno import EISDIR as errno
51 +
52 class OperationNotPermitted(PortageException):
53 """An operation was not permitted operating system"""
54 from errno import EPERM as errno
55 diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
56 index e104501..f639e14 100644
57 --- a/pym/portage/package/ebuild/config.py
58 +++ b/pym/portage/package/ebuild/config.py
59 @@ -37,7 +37,8 @@ from portage.dep import Atom, isvalidatom, match_from_list, use_reduce, _repo_se
60 from portage.eapi import eapi_exports_AA, eapi_exports_merge_type, \
61 eapi_supports_prefix, eapi_exports_replace_vars, _get_eapi_attrs
62 from portage.env.loaders import KeyValuePairFileLoader
63 -from portage.exception import InvalidDependString, PortageException
64 +from portage.exception import InvalidDependString, IsADirectory, \
65 + PortageException
66 from portage.localization import _
67 from portage.output import colorize
68 from portage.process import fakeroot_capable, sandbox_capable
69 @@ -556,8 +557,14 @@ class config(object):
70 self.profile_path = locations_manager.profile_path
71 self.user_profile_dir = locations_manager.user_profile_dir
72
73 - packages_list = [grabfile_package(os.path.join(x, "packages"),
74 - verify_eapi=True) for x in self.profiles]
75 + try:
76 + packages_list = [grabfile_package(os.path.join(x, "packages"),
77 + verify_eapi=True) for x in self.profiles]
78 + except IOError as e:
79 + if e.errno == IsADirectory.errno:
80 + raise IsADirectory(os.path.join(self.profile_path,
81 + "packages"))
82 +
83 self.packages = tuple(stack_lists(packages_list, incremental=1))
84
85 # revmaskdict
86 diff --git a/pym/portage/util/__init__.py b/pym/portage/util/__init__.py
87 index 614b2b3..4105c19 100644
88 --- a/pym/portage/util/__init__.py
89 +++ b/pym/portage/util/__init__.py
90 @@ -43,7 +43,8 @@ from portage import _unicode_encode
91 from portage import _unicode_decode
92 from portage.const import VCS_DIRS
93 from portage.exception import InvalidAtom, PortageException, FileNotFound, \
94 - OperationNotPermitted, ParseError, PermissionDenied, ReadOnlyFileSystem
95 + IsADirectory, OperationNotPermitted, ParseError, PermissionDenied, \
96 + ReadOnlyFileSystem
97 from portage.localization import _
98 from portage.proxy.objectproxy import ObjectProxy
99 from portage.cache.mappings import UserDict
100 --
101 1.8.3.2