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 |