entropy.client.interfaces.cache.Cache: move clear_dump_cache and

repository_move_clear_cache to entropy.core.SystemSettings

entropy.client.interfaces.Client: create SystemSettings plugin to
push Entropy Client-only metadata into SystemSettings and keep it
agnostic

entropy.core.SystemSettings: now Entropy-free, it's agnostic!

other minor fixes
This commit is contained in:
Fabio Erculiani
2009-04-06 21:33:50 +02:00
parent f158ee795a
commit 2e715f41a5
3 changed files with 97 additions and 99 deletions

View File

@@ -125,28 +125,7 @@ class Cache:
def clear_dump_cache(self, dump_name, skip = []):
self.Cacher.sync(wait = True)
dump_path = os.path.join(etpConst['dumpstoragedir'],dump_name)
dump_dir = os.path.dirname(dump_path)
#dump_file = os.path.basename(dump_path)
for currentdir, subdirs, files in os.walk(dump_dir):
path = os.path.join(dump_dir,currentdir)
if skip:
found = False
for myskip in skip:
if path.find(myskip) != -1:
found = True
break
if found: continue
for item in files:
if item.endswith(etpConst['cachedumpext']):
item = os.path.join(path,item)
try: os.remove(item)
except OSError: pass
try:
if not os.listdir(path):
os.rmdir(path)
except OSError:
pass
self.SystemSettings._clear_dump_cache(dump_name, skip = skip)
def update_ugc_cache(self, repository):
if not self.UGC.is_repository_eapi3_aware(repository):
@@ -167,15 +146,7 @@ class Cache:
return status
def repository_move_clear_cache(self, repoid = None):
self.clear_dump_cache(etpCache['world_available'])
self.clear_dump_cache(etpCache['world_update'])
self.clear_dump_cache(etpCache['check_package_update'])
self.clear_dump_cache(etpCache['filter_satisfied_deps'])
self.clear_dump_cache(self.atomMatchCacheKey)
self.clear_dump_cache(etpCache['dep_tree'])
if repoid != None:
self.clear_dump_cache("%s/%s%s/" % (etpCache['dbMatch'],etpConst['dbnamerepoprefix'],repoid,))
self.clear_dump_cache("%s/%s%s/" % (etpCache['dbSearch'],etpConst['dbnamerepoprefix'],repoid,))
return self.SystemSettings._clear_repository_cache(repoid = repoid)
def get_available_packages_chash(self, branch):
# client digest not needed, cache is kept updated

View File

@@ -32,6 +32,43 @@ from entropy.client.interfaces.methods import Repository as CRepository, Misc, M
from entropy.client.interfaces.fetch import Fetchers
from entropy.client.interfaces.metadata import Extractors
from entropy.const import etpConst, etpCache
from entropy.core import SystemSettings, SystemSettingsPlugin
class ClientSystemSettingsPlugin(SystemSettingsPlugin):
import entropy.tools as entropyTools
def system_mask_parser(self, system_settings_instance):
# match installed packages of system_mask
mask_installed = []
mask_installed_keys = {}
while (self._helper.clientDbconn != None):
try:
self._helper.clientDbconn.validateDatabase()
except SystemDatabaseError:
break
mc_cache = set()
m_list = system_settings_instance['repos_system_mask'] + \
system_settings_instance['system_mask']
for atom in m_list:
m_ids, m_r = self._helper.clientDbconn.atomMatch(atom,
multiMatch = True)
if m_r != 0:
continue
mykey = self.entropyTools.dep_getkey(atom)
if mykey not in mask_installed_keys:
mask_installed_keys[mykey] = set()
for m_id in m_ids:
if m_id in mc_cache:
continue
mc_cache.add(m_id)
mask_installed.append(m_id)
mask_installed_keys[mykey].add(m_id)
break
system_settings_instance['repos_system_mask_installed'] = mask_installed
system_settings_instance['repos_system_mask_installed_keys'] = mask_installed_keys
class Client(Singleton, TextInterface, Loaders, Cache, Calculators, \
CRepository, Misc, Match, Fetchers, Extractors):
@@ -58,7 +95,6 @@ class Client(Singleton, TextInterface, Loaders, Cache, Calculators, \
self.noclientdb = False
self.openclientdb = True
from entropy.core import SystemSettings
# setup package settings (masking and other stuff)
self.SystemSettings = SystemSettings()
@@ -130,8 +166,14 @@ class Client(Singleton, TextInterface, Loaders, Cache, Calculators, \
if self.openclientdb:
self.open_client_repository()
# Make sure we connect Entropy AFTER client db init
self.SystemSettings.connect_entropy(self)
# create our SystemSettings plugin
self.sys_settings_mask_plugin = ClientSystemSettingsPlugin(self)
self.sys_settings_mask_plugin_id = str(self)
self.sys_settings_mask_plugin.add_parser(
self.sys_settings_mask_plugin.system_mask_parser)
# Make sure we connect Entropy Client plugin AFTER client db init
self.SystemSettings.add_plugin(
self.sys_settings_mask_plugin_id, self.sys_settings_mask_plugin)
# needs to be started here otherwise repository cache will be
# always dropped

View File

@@ -26,7 +26,7 @@ from entropy.exceptions import IncorrectParameter, SystemDatabaseError
from entropy.const import etpConst, etpSys, const_setup_perms, etpRepositories,\
etpRepositoriesOrder, const_secure_config_file, const_set_nice_level, \
const_extract_srv_repo_params, etpRepositories, etpRepositoriesExcluded, \
const_extract_cli_repo_params
const_extract_cli_repo_params, etpCache
from entropy.i18n import _
class Singleton(object):
@@ -79,12 +79,12 @@ class SystemSettingsPlugin:
"""
SystemSettingsPlugin constructor.
@param handler_interface -- any Python instance that could
@param helper_interface -- any Python instance that could
be of help to your parsers
@type handler_instance instance
"""
self.__parsers = []
self.__plugin_interface = helper_interface
self._helper = helper_interface
def add_parser(self, callable_function):
"""
@@ -132,7 +132,6 @@ class SystemSettings(Singleton):
self.__data = {}
self.__is_destroyed = False
self.Entropy = None
self.__plugins = {}
self.__setting_files_order = []
@@ -219,33 +218,6 @@ class SystemSettings(Singleton):
del self.__plugins[plugin_id]
self.clear()
def connect_entropy(self, entropy_instance):
"""
Connect an Entropy (client/server) instance to
this Singleton. Be warned, it could be very dangerous
if you don't know what you are doing.
Valid instances are:
entropy.client.interfaces.Client
entropy.server.interfaces.Server
"""
from entropy.client.interfaces import Client
from entropy.server.interfaces import Server
if not isinstance(entropy_instance,(Client,Server,)):
mytxt = _("A valid Client/Server interface instance is needed")
raise IncorrectParameter("IncorrectParameter: %s" % (mytxt,))
self.Entropy = entropy_instance
self.__scan() # do this again to re-fill settings
def disconnect_entropy(self):
"""
Remove an Entropy (client/server) instance to
this Singleton.
"""
self.Entropy = None
self.__scan()
def __setup_const(self):
"""
@@ -341,35 +313,7 @@ class SystemSettings(Singleton):
for plugin_id in sorted(self.__plugins):
self.__plugins[plugin_id].parse(self)
# match installed packages of system_mask
mask_installed = []
mask_installed_keys = {}
if self.Entropy != None:
while (self.Entropy.clientDbconn != None):
try:
self.Entropy.clientDbconn.validateDatabase()
except SystemDatabaseError:
break
mc_cache = set()
m_list = self.__data['repos_system_mask'] + \
self.__data['system_mask']
for atom in m_list:
m_ids, m_r = self.Entropy.clientDbconn.atomMatch(atom,
multiMatch = True)
if m_r != 0:
continue
mykey = self.entropyTools.dep_getkey(atom)
if mykey not in mask_installed_keys:
mask_installed_keys[mykey] = set()
for m_id in m_ids:
if m_id in mc_cache:
continue
mc_cache.add(m_id)
mask_installed.append(m_id)
mask_installed_keys[mykey].add(m_id)
break
self.__data['repos_system_mask_installed'] = mask_installed
self.__data['repos_system_mask_installed_keys'] = mask_installed_keys
print self.__data.get('repos_system_mask_installed_keys')
# merge persistent settings back
self.__data.update(self.__persistent_settings)
@@ -1498,6 +1442,48 @@ class SystemSettings(Singleton):
return data
def _clear_repository_cache(self, repoid = None):
"""
Internal method, go away!
"""
self._clear_dump_cache(etpCache['world_available'])
self._clear_dump_cache(etpCache['world_update'])
self._clear_dump_cache(etpCache['check_package_update'])
self._clear_dump_cache(etpCache['filter_satisfied_deps'])
self._clear_dump_cache(etpCache['atomMatch'])
self._clear_dump_cache(etpCache['dep_tree'])
if repoid != None:
self._clear_dump_cache("%s/%s%s/" % (
etpCache['dbMatch'],etpConst['dbnamerepoprefix'],repoid,))
self._clear_dump_cache("%s/%s%s/" % (
etpCache['dbSearch'],etpConst['dbnamerepoprefix'],repoid,))
def _clear_dump_cache(self, dump_name, skip = []):
"""
Internal method, go away!
"""
dump_path = os.path.join(etpConst['dumpstoragedir'],dump_name)
dump_dir = os.path.dirname(dump_path)
#dump_file = os.path.basename(dump_path)
for currentdir, subdirs, files in os.walk(dump_dir):
path = os.path.join(dump_dir,currentdir)
if skip:
found = False
for myskip in skip:
if path.find(myskip) != -1:
found = True
break
if found: continue
for item in files:
if item.endswith(etpConst['cachedumpext']):
item = os.path.join(path,item)
try: os.remove(item)
except OSError: pass
try:
if not os.listdir(path):
os.rmdir(path)
except OSError:
pass
def __generic_parser(self, filepath):
"""
@@ -1530,12 +1516,11 @@ class SystemSettings(Singleton):
@return None
"""
if os.path.isdir(etpConst['dumpstoragedir']):
if repoid and (self.Entropy != None):
self.Entropy.repository_move_clear_cache(repoid)
if repoid:
self._clear_repository_cache(repoid = repoid)
return
if self.Entropy != None:
for repoid in self['repositories']['order']:
self.Entropy.repository_move_clear_cache(repoid)
for repoid in self['repositories']['order']:
self._clear_repository_cache(repoid = repoid)
else:
os.makedirs(etpConst['dumpstoragedir'])