From 10b89e9d5bedfb646f31e09b95f109f7a60ab149 Mon Sep 17 00:00:00 2001 From: Fabio Erculiani Date: Sun, 2 Aug 2009 18:49:37 +0200 Subject: [PATCH] [entropy.db] move client-related package name/slot updates to entropy.client --- libraries/entropy/client/interfaces/client.py | 91 +++++++++++++++++++ .../entropy/client/interfaces/methods.py | 5 +- .../entropy/client/interfaces/repository.py | 2 +- libraries/entropy/db.py | 69 -------------- 4 files changed, 94 insertions(+), 73 deletions(-) diff --git a/libraries/entropy/client/interfaces/client.py b/libraries/entropy/client/interfaces/client.py index 698ac0f75..6312bdf58 100644 --- a/libraries/entropy/client/interfaces/client.py +++ b/libraries/entropy/client/interfaces/client.py @@ -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 diff --git a/libraries/entropy/client/interfaces/methods.py b/libraries/entropy/client/interfaces/methods.py index 55884c388..985879ecf 100644 --- a/libraries/entropy/client/interfaces/methods.py +++ b/libraries/entropy/client/interfaces/methods.py @@ -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']) diff --git a/libraries/entropy/client/interfaces/repository.py b/libraries/entropy/client/interfaces/repository.py index 6f2e8faaa..65ddad45b 100644 --- a/libraries/entropy/client/interfaces/repository.py +++ b/libraries/entropy/client/interfaces/repository.py @@ -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: diff --git a/libraries/entropy/db.py b/libraries/entropy/db.py index 9fb0171c4..f1ebd28d7 100644 --- a/libraries/entropy/db.py +++ b/libraries/entropy/db.py @@ -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):