diff --git a/client/text_ui.py b/client/text_ui.py index df2a8ec1e..51f4ce0be 100644 --- a/client/text_ui.py +++ b/client/text_ui.py @@ -835,6 +835,7 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals if not etpUi['clean'] or onlyfetch: ### Before starting the real install, fetch packages and verify checksum. fetchqueue = 0 + mykeys = {} for packageInfo in runQueue: fetchqueue += 1 @@ -842,6 +843,10 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals metaopts['dochecksum'] = dochecksum Package = Equo.Package() Package.prepare(packageInfo,"fetch", metaopts) + myrepo = Package.infoDict['repository'] + if not mykeys.has_key(myrepo): + mykeys[myrepo] = set() + mykeys[myrepo].add(Equo.entropyTools.dep_getkey(Package.infoDict['atom'])) xterm_header = "Equo ("+_("fetch")+") :: "+str(fetchqueue)+" of "+totalqueue+" ::" print_info(red(" :: ")+bold("(")+blue(str(fetchqueue))+"/"+red(totalqueue)+bold(") ")+">>> "+darkgreen(Package.infoDict['atom'])) @@ -855,6 +860,12 @@ def installPackages(packages = [], atomsdata = [], deps = True, emptydeps = Fals del metaopts del Package + if Equo.UGC != None: + for myrepo in mykeys: + mypkgkeys = list(mykeys[myrepo]) + Equo.UGC.add_downloads(myrepo, mypkgkeys) + del mykeys + if onlyfetch: print_info(red(" @@ ")+blue("%s." % (_("Download completed"),) )) return 0,0 diff --git a/libraries/entropy.py b/libraries/entropy.py index 4f1a7c14b..e96093964 100644 --- a/libraries/entropy.py +++ b/libraries/entropy.py @@ -3317,7 +3317,7 @@ class EquoInterface(TextInterface): else: return item - def fetch_file_on_mirrors(self, repository, branch, filename, digest = False, verified = False, fetch_abort_function = None, package_name = None): + def fetch_file_on_mirrors(self, repository, branch, filename, digest = False, verified = False, fetch_abort_function = None): uris = etpRepositories[repository]['packages'][::-1] remaining = set(uris[:]) @@ -3396,8 +3396,8 @@ class EquoInterface(TextInterface): type = "info", header = red(" ## ") ) + ''' if (self.UGC != None) and (package_name != None): - def register_download(repository, package_name): try: self.UGC.add_download(repository, package_name) @@ -3407,6 +3407,7 @@ class EquoInterface(TextInterface): task = self.entropyTools.parallelTask(register_download, repository, package_name) task.parallel_wait() task.start() + ''' return 0 elif resumed: @@ -4184,16 +4185,12 @@ class PackageInterface: header = red(" ## "), back = True ) - pkgkey = None - if self.infoDict.has_key('atom'): - pkgkey = self.Entropy.entropyTools.dep_getkey(self.infoDict['atom']) fetch = self.Entropy.fetch_file_on_mirrors( self.infoDict['repository'], self.Entropy.get_branch_from_download_relative_uri(self.infoDict['download']), self.infoDict['download'], self.infoDict['checksum'], - fetch_abort_function = self.fetch_abort_function, - package_name = pkgkey + fetch_abort_function = self.fetch_abort_function ) if fetch != 0: self.Entropy.updateProgress( @@ -5241,9 +5238,6 @@ class PackageInterface: type = "info", header = red(" ## ") ) - pkgkey = None - if self.infoDict.has_key('atom'): - pkgkey = self.Entropy.entropyTools.dep_getkey(self.infoDict['atom']) rc = self.Entropy.fetch_file_on_mirrors( self.infoDict['repository'], @@ -5251,8 +5245,7 @@ class PackageInterface: self.infoDict['download'], self.infoDict['checksum'], self.infoDict['verified'], - fetch_abort_function = self.fetch_abort_function, - package_name = pkgkey + fetch_abort_function = self.fetch_abort_function ) if rc != 0: mytxt = "%s. %s: %s" % ( @@ -15121,7 +15114,7 @@ class SocketHostInterface: self.SessionsLock.acquire() try: if session in self.sessions: - return self.sessions[session]['rc'] + return self.sessions[session].get('rc') finally: self.SessionsLock.release() @@ -18459,6 +18452,20 @@ class DistributionUGCInterface(RemoteDbSkelInterface): self.store_download_data(iddownload, ip_addr) return True + def do_downloads(self, pkgkeys, ip_addr = None, do_commit = False): + self.check_connection() + mydate = self.get_date() + for pkgkey in pkgkeys: + iddownload = self.get_iddownload(pkgkey, mydate) + if iddownload == -1: + iddownload = self.insert_download(pkgkey, mydate, count = 1) + else: + self.update_download(iddownload, pkgkey, mydate, 1) + if (iddownload > 0) and isinstance(ip_addr,basestring): + self.store_download_data(iddownload, ip_addr) + if do_commit: self.commit() + return True + def insert_document(self, pkgkey, userid, username, text, title, description, keywords, doc_type = None, do_commit = False): self.check_connection() idkey = self.handle_pkgkey(pkgkey) @@ -18892,6 +18899,16 @@ class DistributionUGCCommands(SocketCommandsSkel): 'syntax': " ugc:do_download app-foo/foo", 'from': unicode(self), # from what class }, + 'ugc:do_downloads': { + 'auth': False, + 'built_in': False, + 'cb': self.docmd_do_downloads, + 'args': ["authenticator","myargs"], + 'as_user': False, + 'desc': "inform the system of downloaded applications", + 'syntax': " ugc:do_downloads app-foo/foo1 app-foo/foo2 <...>", + 'from': unicode(self), # from what class + }, 'ugc:add_comment': { 'auth': True, 'built_in': False, @@ -19299,6 +19316,18 @@ class DistributionUGCCommands(SocketCommandsSkel): return done,'download not stored' return done,'ok' + def docmd_do_downloads(self, authenticator, myargs): + + if not myargs: + return None,'wrong arguments' + + ip_addr = self._get_session_ip_address(authenticator) + ugc = self._load_ugc_interface() + done = ugc.do_downloads(myargs, ip_addr = ip_addr) + if not done: + return done,'download not stored' + return done,'ok' + def _get_generic_doctypes(self, pkgkey, doctypes): ugc = self._load_ugc_interface() metadata = ugc.get_ugc_metadata_doctypes(pkgkey, doctypes) @@ -21096,6 +21125,15 @@ class RepositorySocketClientCommands(EntropySocketClientCommands): ) return self.do_generic_handler(cmd, session_id) + def ugc_do_downloads(self, session_id, pkgkeys): + + cmd = "%s %s %s" % ( + session_id, + 'ugc:do_downloads', + ' '.join(pkgkeys), + ) + return self.do_generic_handler(cmd, session_id) + def ugc_get_downloads(self, session_id, pkgkey): cmd = "%s %s %s" % ( @@ -26711,6 +26749,9 @@ class UGCClientInterface: def add_download(self, repository, pkgkey): return self.do_cmd(repository, False, "ugc_do_download", [pkgkey], {}) + def add_downloads(self, repository, pkgkeys): + return self.do_cmd(repository, False, "ugc_do_downloads", [pkgkeys], {}) + def get_downloads(self, repository, pkgkey): data = self.do_cmd(repository, False, "ugc_get_downloads", [pkgkey], {}) if isinstance(data,tuple): downloads, err_msg = data diff --git a/spritz/src/entropyapi.py b/spritz/src/entropyapi.py index 8f363cf62..76727030e 100644 --- a/spritz/src/entropyapi.py +++ b/spritz/src/entropyapi.py @@ -93,6 +93,7 @@ class QueueExecutor: self.Spritz.ui.abortQueue.show() # first fetch all fetchqueue = 0 + mykeys = {} for packageInfo in runQueue: self.Spritz.queue_bombing() @@ -102,6 +103,12 @@ class QueueExecutor: metaopts = {} metaopts['fetch_abort_function'] = self.Spritz.mirror_bombing Package.prepare(packageInfo,"fetch",metaopts) + + myrepo = Package.infoDict['repository'] + if not mykeys.has_key(myrepo): + mykeys[myrepo] = set() + mykeys[myrepo].add(self.Entropy.entropyTools.dep_getkey(Package.infoDict['atom'])) + self.Entropy.updateProgress( "Fetching: "+Package.infoDict['atom'], importance = 2, @@ -114,6 +121,12 @@ class QueueExecutor: del Package self.Entropy.cycleDone() + if self.Entropy.UGC != None: + for myrepo in mykeys: + mypkgkeys = list(mykeys[myrepo]) + self.Entropy.UGC.add_downloads(myrepo, mypkgkeys) + del mykeys + self.Spritz.ui.skipMirror.hide() # then removalQueue