diff --git a/libraries/entropy/client/services/ugc/commands.py b/libraries/entropy/client/services/ugc/commands.py index 91909090d..9aabfacdb 100644 --- a/libraries/entropy/client/services/ugc/commands.py +++ b/libraries/entropy/client/services/ugc/commands.py @@ -343,6 +343,18 @@ class Client(Base): ) return self.do_generic_handler(cmd, session_id, tries = 5) + def get_repository_metadata(self, session_id, repository, arch, product): + + cmd = "%s %s %s %s %s %s" % ( + session_id, + 'repository_server:get_repository_metadata', + repository, + arch, + product, + self.SystemSettings['repositories']['branch'], + ) + return self.do_generic_handler(cmd, session_id, tries = 5) + def get_package_information(self, session_id, idpackages, repository, arch, product): cmd = "%s %s %s %s %s %s %s %s" % ( diff --git a/libraries/entropy/services/repository/commands.py b/libraries/entropy/services/repository/commands.py index d19d5cf35..cf63bbefa 100644 --- a/libraries/entropy/services/repository/commands.py +++ b/libraries/entropy/services/repository/commands.py @@ -74,6 +74,16 @@ class Repository(SocketCommands): 'desc': "returns repository package sets metadata", 'syntax': " repository_server:get_package_sets ", 'from': unicode(self), # from what class + }, + 'repository_server:get_repository_metadata': { + 'auth': False, + 'built_in': False, + 'cb': self.docmd_repository_metadata, + 'args': ["myargs"], + 'as_user': False, + 'desc': "returns repository metadata (package sets, treeupdates, libraries <=> idpackages map)", + 'syntax': " repository_server:get_repository_metadata ", + 'from': unicode(self), # from what class } } @@ -114,6 +124,43 @@ class Repository(SocketCommands): return {'removed': removed_ids, 'added': added_ids, 'checksum': mychecksum} + def docmd_repository_metadata(self, myargs): + + self.trash_old_databases() + + if len(myargs) < 4: + return None + repository = myargs[0] + arch = myargs[1] + product = myargs[2] + try: + branch = str(myargs[3]) + except (UnicodeEncodeError,UnicodeDecodeError,): + return None + + x = (repository,arch,product,branch,) + valid = self.HostInterface.is_repository_available(x) + if not valid: + return valid + + cached = self.HostInterface.get_dcache((repository, arch, product, branch, 'docmd_repository_metadata'), repository) + if cached != None: + return cached + + metadata = {} + dbpath = self.get_database_path(repository, arch, product, branch) + dbconn = self.HostInterface.open_db(dbpath, docache = False) + metadata['sets'] = dbconn.retrievePackageSets() + metadata['treeupdates_actions'] = dbconn.listAllTreeUpdatesActions() + metadata['treeupdates_digest'] = dbconn.retrieveRepositoryUpdatesDigest(repository) + metadata['library_idpackages'] = dbconn.retrieveNeededLibraryIdpackages() + + self.HostInterface.set_dcache((repository, arch, product, branch, 'docmd_repository_metadata'), data, repository) + dbconn.closeDB() + + return metadata + + def docmd_package_sets(self, myargs): self.trash_old_databases()