[entropy.db] move client-related package name/slot updates to entropy.client
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user