diff --git a/lib/entropy/client/interfaces/client.py b/lib/entropy/client/interfaces/client.py index f0494cd89..8ca3b81d4 100644 --- a/lib/entropy/client/interfaces/client.py +++ b/lib/entropy/client/interfaces/client.py @@ -753,7 +753,6 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, self._can_run_sys_set_hooks = False const_debug_write(__name__, "debug enabled") - self._enabled_repos = [] self.safe_mode = 0 self._indexing = indexing self._repo_validation = repo_validation @@ -771,6 +770,9 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, self._real_logger = None self._real_logger_lock = threading.Lock() + self._real_enabled_repos = None + self._real_enabled_repos_lock = threading.RLock() + # class init LoadersMixin.__init__(self) @@ -803,11 +805,6 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, elif (not entropy.tools.is_user_in_entropy_group()) and not user_xcache: self.xcache = False - if self._repo_validation: - self._validate_repositories() - else: - self._enabled_repos.extend(self._settings['repositories']['order']) - # Add Entropy Resources Lock post-acquire hook that cleans # repository caches. hook_ref = EntropyResourcesLock.add_post_acquire_hook( @@ -895,6 +892,23 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, return self._real_logger + @property + def _enabled_repos(self): + if self._real_enabled_repos is None: + with self._real_enabled_repos_lock: + + if self._real_enabled_repos is None: + self._real_enabled_repos = [] + + if self._repo_validation: + self._validate_repositories( + enabled_repos = self._real_enabled_repos) + else: + self._real_enabled_repos.extend( + self._settings['repositories']['order']) + + return self._real_enabled_repos + def _resources_post_hook(self): """ Hook running after Entropy Resources Lock acquisition. diff --git a/lib/entropy/client/interfaces/methods.py b/lib/entropy/client/interfaces/methods.py index 2a76a90b3..84e53514f 100644 --- a/lib/entropy/client/interfaces/methods.py +++ b/lib/entropy/client/interfaces/methods.py @@ -58,7 +58,10 @@ class RepositoryMixin: def __get_repository_cache_key(self, repository_id): return (repository_id, etpConst['systemroot'],) - def _validate_repositories(self, quiet = False): + def _validate_repositories(self, quiet = False, enabled_repos = None): + + if enabled_repos is None: + enabled_repos = self._enabled_repos StatusInterface().clear() self._repo_error_messages_cache.clear() @@ -86,7 +89,7 @@ class RepositoryMixin: t2 = _("Please update your repositories now in order to remove this message!") - del self._enabled_repos[:] + del enabled_repos[:] _enabled_repos = [] all_repos = self._settings['repositories']['order'][:] for repoid in self._settings['repositories']['order']: @@ -143,7 +146,7 @@ class RepositoryMixin: continue # write back correct _enabled_repos - self._enabled_repos.extend(_enabled_repos) + enabled_repos.extend(_enabled_repos) def _init_generic_temp_repository(self, repoid, description, package_mirrors = None, temp_file = None): diff --git a/lib/tests/db.py b/lib/tests/db.py index 2db9e2fa8..054c8697e 100644 --- a/lib/tests/db.py +++ b/lib/tests/db.py @@ -27,8 +27,6 @@ class EntropyRepositoryTest(unittest.TestCase): xcache = False, repo_validation = False) self.Spm = self.Client.Spm() self.test_db_name = "test_suite" - self.client_sysset_plugin_id = \ - etpConst['system_settings_plugins_ids']['client_plugin'] self.test_db = self.__open_test_db(":memory:") # GenericRepository supports package masking if this property is set self.test_db.enable_mask_filter = True @@ -400,9 +398,8 @@ class EntropyRepositoryTest(unittest.TestCase): self.test_db.atomMatch(pkg_atom)) # test package masking - plug_id = self.client_sysset_plugin_id masking_validation = \ - self._settings[plug_id]['masking_validation']['cache'] + self.Client.ClientSettings()['masking_validation']['cache'] f_match_mask = (1, self.test_db_name,) self._settings['live_packagemasking']['mask_matches'].add( @@ -465,9 +462,8 @@ class EntropyRepositoryTest(unittest.TestCase): self.test_db.atomMatch(pkg_atom)) # test package masking - plug_id = self.client_sysset_plugin_id - masking_validation = \ - self._settings[plug_id]['masking_validation']['cache'] + masking_validation = self.Client.ClientSettings( + )['masking_validation']['cache'] f_match_mask = (1, self.test_db_name,) self._settings['live_packagemasking']['mask_matches'].add( @@ -504,9 +500,8 @@ class EntropyRepositoryTest(unittest.TestCase): self.test_db.atomMatch(pkg_atom)) # test package masking - plug_id = self.client_sysset_plugin_id - masking_validation = \ - self._settings[plug_id]['masking_validation']['cache'] + masking_validation = self.Client.ClientSettings( + )['masking_validation']['cache'] f_match_mask = (1, self.test_db_name,) self._settings['live_packagemasking']['mask_matches'].add( @@ -552,9 +547,8 @@ class EntropyRepositoryTest(unittest.TestCase): self.test_db.atomMatch(pkg_atom)) # test package masking - plug_id = self.client_sysset_plugin_id - masking_validation = \ - self._settings[plug_id]['masking_validation']['cache'] + masking_validation = self.Client.ClientSettings( + )['masking_validation']['cache'] f_match_mask = (1, self.test_db_name,) self._settings['live_packagemasking']['mask_matches'].add(