1 |
commit: b03ed0de134456870c0361dd573e18830c45fa49 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Jun 1 22:12:02 2012 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Jun 1 22:12:02 2012 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b03ed0de |
7 |
|
8 |
config: lazy KeywordsManager instantiation |
9 |
|
10 |
This allows a config instance to be instantiated by portageq, while |
11 |
accessing /etc/portage/package.keywords only on demand, solving |
12 |
bug #418475 by avoiding PermissionDenied exceptions when possible. |
13 |
|
14 |
--- |
15 |
pym/portage/package/ebuild/config.py | 23 ++++++++++++++++++----- |
16 |
1 files changed, 18 insertions(+), 5 deletions(-) |
17 |
|
18 |
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py |
19 |
index 97cbd99..6f5680b 100644 |
20 |
--- a/pym/portage/package/ebuild/config.py |
21 |
+++ b/pym/portage/package/ebuild/config.py |
22 |
@@ -227,9 +227,12 @@ class config(object): |
23 |
self._setcpv_args_hash = clone._setcpv_args_hash |
24 |
|
25 |
# immutable attributes (internal policy ensures lack of mutation) |
26 |
- self._keywords_manager = clone._keywords_manager |
27 |
+ self._locations_manager = clone._locations_manager |
28 |
self._use_manager = clone._use_manager |
29 |
self._mask_manager = clone._mask_manager |
30 |
+ # force instantiation of lazy immutable objects when cloning, so |
31 |
+ # that they're not instantiated more than once |
32 |
+ self._keywords_manager_obj = clone._keywords_manager |
33 |
|
34 |
# shared mutable attributes |
35 |
self._unknown_features = clone._unknown_features |
36 |
@@ -274,9 +277,13 @@ class config(object): |
37 |
self._expand_map = copy.deepcopy(clone._expand_map) |
38 |
|
39 |
else: |
40 |
+ # lazily instantiated objects |
41 |
+ self._keywords_manager_obj = None |
42 |
+ |
43 |
locations_manager = LocationsManager(config_root=config_root, |
44 |
config_profile_path=config_profile_path, eprefix=eprefix, |
45 |
local_config=local_config, target_root=target_root) |
46 |
+ self._locations_manager = locations_manager |
47 |
|
48 |
eprefix = locations_manager.eprefix |
49 |
config_root = locations_manager.config_root |
50 |
@@ -574,10 +581,6 @@ class config(object): |
51 |
d.pop(k, None) |
52 |
self._repo_make_defaults[repo.name] = d |
53 |
|
54 |
- #Read package.keywords and package.accept_keywords. |
55 |
- self._keywords_manager = KeywordsManager(profiles_complex, abs_user_config, \ |
56 |
- local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", "")) |
57 |
- |
58 |
#Read all USE related files from profiles and optionally from user config. |
59 |
self._use_manager = UseManager(self.repositories, profiles_complex, abs_user_config, user_config=local_config) |
60 |
#Initialize all USE related variables we track ourselves. |
61 |
@@ -882,6 +885,16 @@ class config(object): |
62 |
noiselevel=-1) |
63 |
|
64 |
@property |
65 |
+ def _keywords_manager(self): |
66 |
+ if self._keywords_manager_obj is None: |
67 |
+ self._keywords_manager_obj = KeywordsManager( |
68 |
+ self._locations_manager.profiles_complex, |
69 |
+ self._locations_manager.abs_user_config, |
70 |
+ self.local_config, |
71 |
+ global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", "")) |
72 |
+ return self._keywords_manager_obj |
73 |
+ |
74 |
+ @property |
75 |
def pkeywordsdict(self): |
76 |
result = self._keywords_manager.pkeywordsdict.copy() |
77 |
for k, v in result.items(): |