summaryrefslogtreecommitdiffstats
path: root/pym/portage/package/ebuild/config.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2012-06-01 15:12:02 -0700
committerZac Medico <zmedico@gentoo.org>2012-06-01 15:12:02 -0700
commitb03ed0de134456870c0361dd573e18830c45fa49 (patch)
treef602af7a7d47171d171c9c93d47ba92b46319535 /pym/portage/package/ebuild/config.py
parent9f782a2c115acbeac863eb1c0ac8ef5e84874d73 (diff)
downloadportage-b03ed0de134456870c0361dd573e18830c45fa49.tar.gz
portage-b03ed0de134456870c0361dd573e18830c45fa49.tar.bz2
portage-b03ed0de134456870c0361dd573e18830c45fa49.zip
config: lazy KeywordsManager instantiation
This allows a config instance to be instantiated by portageq, while accessing /etc/portage/package.keywords only on demand, solving bug #418475 by avoiding PermissionDenied exceptions when possible.
Diffstat (limited to 'pym/portage/package/ebuild/config.py')
-rw-r--r--pym/portage/package/ebuild/config.py23
1 files changed, 18 insertions, 5 deletions
diff --git a/pym/portage/package/ebuild/config.py b/pym/portage/package/ebuild/config.py
index 97cbd9960..6f5680bdc 100644
--- a/pym/portage/package/ebuild/config.py
+++ b/pym/portage/package/ebuild/config.py
@@ -227,9 +227,12 @@ class config(object):
self._setcpv_args_hash = clone._setcpv_args_hash
# immutable attributes (internal policy ensures lack of mutation)
- self._keywords_manager = clone._keywords_manager
+ self._locations_manager = clone._locations_manager
self._use_manager = clone._use_manager
self._mask_manager = clone._mask_manager
+ # force instantiation of lazy immutable objects when cloning, so
+ # that they're not instantiated more than once
+ self._keywords_manager_obj = clone._keywords_manager
# shared mutable attributes
self._unknown_features = clone._unknown_features
@@ -274,9 +277,13 @@ class config(object):
self._expand_map = copy.deepcopy(clone._expand_map)
else:
+ # lazily instantiated objects
+ self._keywords_manager_obj = None
+
locations_manager = LocationsManager(config_root=config_root,
config_profile_path=config_profile_path, eprefix=eprefix,
local_config=local_config, target_root=target_root)
+ self._locations_manager = locations_manager
eprefix = locations_manager.eprefix
config_root = locations_manager.config_root
@@ -574,10 +581,6 @@ class config(object):
d.pop(k, None)
self._repo_make_defaults[repo.name] = d
- #Read package.keywords and package.accept_keywords.
- self._keywords_manager = KeywordsManager(profiles_complex, abs_user_config, \
- local_config, global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
-
#Read all USE related files from profiles and optionally from user config.
self._use_manager = UseManager(self.repositories, profiles_complex, abs_user_config, user_config=local_config)
#Initialize all USE related variables we track ourselves.
@@ -882,6 +885,16 @@ class config(object):
noiselevel=-1)
@property
+ def _keywords_manager(self):
+ if self._keywords_manager_obj is None:
+ self._keywords_manager_obj = KeywordsManager(
+ self._locations_manager.profiles_complex,
+ self._locations_manager.abs_user_config,
+ self.local_config,
+ global_accept_keywords=self.configdict["defaults"].get("ACCEPT_KEYWORDS", ""))
+ return self._keywords_manager_obj
+
+ @property
def pkeywordsdict(self):
result = self._keywords_manager.pkeywordsdict.copy()
for k, v in result.items():