[entropy.db] move client-related package name/slot updates to entropy.client

This commit is contained in:
Fabio Erculiani
2009-08-02 18:49:37 +02:00
parent dbaf9b0b0a
commit 10b89e9d5b
4 changed files with 94 additions and 73 deletions
@@ -600,6 +600,97 @@ class Client(Singleton, TextInterface, LoadersMixin, CacheMixin, CalculatorsMixi
self.closeAllSecurity()
self.closeAllQA()
def repository_packages_spm_sync(self, repository_identifier, repo_db,
force = False):
"""
Service method used to sync package names with Source Package Manager
via metadata stored in Repository dbs collected at server-time.
Source Package Manager can change package names, categories or slot
and Entropy repositories must be kept in sync.
In other words, it checks for /usr/portage/profiles/updates changes,
of course indirectly, since there is no way entropy.client can directly
depend on Portage.
@param repository_identifier: repository identifier which repo_db
parameter is bound
@type repository_identifier: string
@param repo_db: repository database instance
@type repo_db: entropy.db.EntropyRepository
@return: bool stating if changes have been made
@rtype: bool
"""
if not self.clientDbconn:
# nothing to do if client db is not availabe
return False
etpConst['client_treeupdatescalled'].add(repository_identifier)
doRescan = False
shell_rescan = os.getenv("ETP_TREEUPDATES_RESCAN")
if shell_rescan:
doRescan = True
# check database digest
stored_digest = repo_db.retrieveRepositoryUpdatesDigest(
repository_identifier)
if stored_digest == -1:
doRescan = True
# check stored value in client database
client_digest = "0"
if not doRescan:
client_digest = self.clientDbconn.retrieveRepositoryUpdatesDigest(
repository_identifier)
if doRescan or (str(stored_digest) != str(client_digest)) or force:
# reset database tables
self.clientDbconn.clearTreeupdatesEntries(repository_identifier)
# load updates
update_actions = repo_db.retrieveTreeUpdatesActions(
repository_identifier)
# now filter the required actions
update_actions = self.clientDbconn.filterTreeUpdatesActions(
update_actions)
if update_actions:
mytxt = "%s: %s." % (
bold(_("ATTENTION")),
red(_("forcing packages metadata update")),
)
self.updateProgress(
mytxt,
importance = 1,
type = "info",
header = darkred(" * ")
)
mytxt = "%s %s." % (
red(_("Updating system database using repository")),
blue(repository_identifier),
)
self.updateProgress(
mytxt,
importance = 1,
type = "info",
header = darkred(" * ")
)
# run stuff
self.clientDbconn.runTreeUpdatesActions(update_actions)
# store new digest into database
self.clientDbconn.setRepositoryUpdatesDigest(repository_identifier,
stored_digest)
# store new actions
self.clientDbconn.addRepositoryUpdatesActions(etpConst['clientdbid'],
update_actions, self.SystemSettings['repositories']['branch'])
self.clientDbconn.commitChanges()
# clear client cache
self.clientDbconn.clearCache()
return True
def is_destroyed(self):
return self.__instance_destroyed
@@ -186,11 +186,10 @@ class RepositoryMixin:
(self.entropyTools.is_root()) and \
(not repoid.endswith(etpConst['packagesext'])):
# only as root due to Portage
updated = False
try:
updated = conn.clientUpdatePackagesData(self.clientDbconn)
updated = self.repository_packages_spm_sync(repoid, conn)
except (self.dbapi2.OperationalError, self.dbapi2.DatabaseError):
pass
updated = False
if updated:
self.clear_dump_cache(etpCache['world_update'])
self.clear_dump_cache(etpCache['critical_update'])
@@ -1152,7 +1152,7 @@ class Repository:
self.entropyTools.is_root(): # only as root due to Portage
for repo in self.reponames:
dbc = self.Entropy.open_repository(repo)
dbc.clientUpdatePackagesData(self.Entropy.clientDbconn)
self.Entropy.repository_packages_spm_sync(repo, dbc)
self.Entropy.close_all_repositories()
if self.syncErrors:
-69
View File
@@ -774,75 +774,6 @@ class EntropyRepository:
self.setDefaultCacheSize(8192)
self.commitChanges()
def clientUpdatePackagesData(self, clientDbconn, force = False):
if clientDbconn == None:
return
repository = self.dbname[len(etpConst['dbnamerepoprefix']):]
etpConst['client_treeupdatescalled'].add(repository)
doRescan = False
shell_rescan = os.getenv("ETP_TREEUPDATES_RESCAN")
if shell_rescan: doRescan = True
# check database digest
stored_digest = self.retrieveRepositoryUpdatesDigest(repository)
if stored_digest == -1:
doRescan = True
# check stored value in client database
client_digest = "0"
if not doRescan:
client_digest = clientDbconn.retrieveRepositoryUpdatesDigest(
repository)
if doRescan or (str(stored_digest) != str(client_digest)) or force:
# reset database tables
clientDbconn.clearTreeupdatesEntries(repository)
# load updates
update_actions = self.retrieveTreeUpdatesActions(repository)
# now filter the required actions
update_actions = clientDbconn.filterTreeUpdatesActions(
update_actions)
if update_actions:
mytxt = "%s: %s." % (
bold(_("ATTENTION")),
red(_("forcing packages metadata update")),
)
self.updateProgress(
mytxt,
importance = 1,
type = "info",
header = darkred(" * ")
)
mytxt = "%s %s." % (
red(_("Updating system database using repository")),
blue(repository),
)
self.updateProgress(
mytxt,
importance = 1,
type = "info",
header = darkred(" * ")
)
# run stuff
clientDbconn.runTreeUpdatesActions(update_actions)
# store new digest into database
clientDbconn.setRepositoryUpdatesDigest(repository, stored_digest)
# store new actions
clientDbconn.addRepositoryUpdatesActions(etpConst['clientdbid'],
update_actions, self.SystemSettings['repositories']['branch'])
clientDbconn.commitChanges()
# clear client cache
clientDbconn.clearCache()
return True
# this functions will filter either data from /usr/portage/profiles/updates/*
# or repository database returning only the needed actions
def filterTreeUpdatesActions(self, actions):