This saves some code, and runs downloads in parallel, if possible. --- reposync.py | 91 ++++++++++++++++++----------------------------------- yumdownloader.py | 66 +++++++++++++-------------------------- 2 files changed, 53 insertions(+), 104 deletions(-)
diff --git a/reposync.py b/reposync.py index fb2c592..ad4e441 100755 --- a/reposync.py +++ b/reposync.py @@ -276,75 +276,46 @@ def main(): urlgrabber.progress.text_meter_total_size(remote_size) download_list.sort(sortPkgObj) - n = 0 - exit_code = 0 + if opts.urls: + for pkg in download_list: + print urljoin(pkg.repo.urls[0], pkg.relativepath) + return 0 + + # create dest dir + if not os.path.exists(local_repo_path): + os.makedirs(local_repo_path) + + # set localpaths for pkg in download_list: - n = n + 1 - repo = my.repos.getRepo(pkg.repoid) - remote = pkg.returnSimple('relativepath') - local = local_repo_path + '/' + remote - localdir = os.path.dirname(local) - if not os.path.exists(localdir): - os.makedirs(localdir) - - sz = int(pkg.returnSimple('packagesize')) - if os.path.exists(local) and os.path.getsize(local) == sz: - - if not opts.quiet: - my.logger.error("[%s: %-5d of %-5d ] Skipping existing %s" % (repo.id, n, len(download_list), remote)) - continue - - if opts.urls: - baseurl = None - if repo.urls[0][-1] != '/': - baseurl = repo.urls[0] + '/' - else: - baseurl = repo.urls[0] - url = urljoin(baseurl,remote) - print '%s' % url - continue - - # make sure the repo subdir is here before we go on. - if not os.path.exists(local_repo_path): - try: - os.makedirs(local_repo_path) - except IOError, e: - my.logger.error("Could not make repo subdir: %s" % e) - my.closeRpmDB() - sys.exit(1) - - # Disable cache otherwise things won't download - repo.cache = 0 - if not opts.quiet: - my.logger.info( '[%s: %-5d of %-5d ] Downloading %s' % (repo.id, n, len(download_list), remote)) - pkg.localpath = local # Hack: to set the localpath we want. - try: - path = repo.getPackage(pkg) - except yum.Errors.RepoError, e: - my.logger.error("Could not retrieve package %s. Error was %s" % (pkg, str(e))) - local_size += sz - exit_code = 1 - continue - - local_size += sz - if hasattr(urlgrabber.progress, 'text_meter_total_size'): - urlgrabber.progress.text_meter_total_size(remote_size, local_size) - if opts.gpgcheck: + rpmfn = os.path.basename(pkg.remote_path) + pkg.localpath = os.path.join(local_repo_path, rpmfn) + pkg.repo.copy_local = True + pkg.repo.cache = 0 + + # use downloader from YumBase + exit_code = 0 + probs = my.downloadPkgs(download_list) + if probs: + exit_code = 1 + for key in probs: + for error in probs[key]: + self.logger.error('%s: %s', key, error) + + if opts.gpgcheck: + for pkg in download_list: result, error = my.sigCheckPkg(pkg) if result != 0: + rpmfn = os.path.basename(pkg.remote_path) if result == 1: - my.logger.warning('Removing %s, due to missing GPG key.' % os.path.basename(remote)) + my.logger.warning('Removing %s, due to missing GPG key.' % rpmfn) elif result == 2: - my.logger.warning('Removing %s due to failed signature check.' % os.path.basename(remote)) + my.logger.warning('Removing %s due to failed signature check.' % rpmfn) else: - my.logger.warning('Removing %s due to failed signature check: %s' % (os.path.basename(remote), error)) - os.unlink(path) + my.logger.warning('Removing %s due to failed signature check: %s' % rpmfn) + os.unlink(pkg.localpath) exit_code = 1 continue - if not os.path.exists(local) or not os.path.samefile(path, local): - shutil.copy2(path, local) - my.closeRpmDB() sys.exit(exit_code) diff --git a/yumdownloader.py b/yumdownloader.py index 4cdd595..ba17edd 100755 --- a/yumdownloader.py +++ b/yumdownloader.py @@ -192,52 +192,30 @@ class YumDownloader(YumUtilBase): if len(toDownload) == 0: self.logger.error('Nothing to download') sys.exit(1) + if opts.urls: + for pkg in toDownload: + print urljoin(pkg.repo.urls[0], pkg.relativepath) + return 0 - exit_code = 0 + # create dest dir + if not os.path.exists(opts.destdir): + os.makedirs(opts.destdir) + + # set localpaths for pkg in toDownload: - n,a,e,v,r = pkg.pkgtup - packages = self.pkgSack.searchNevra(n,e,v,r,a) - packages.sort() - last = None - for download in packages: - if download.pkgtup == last : - continue - last = download.pkgtup - repo = self.repos.getRepo(download.repoid) - remote = download.returnSimple('relativepath') - if opts.urls: - url = urljoin(repo.urls[0]+'/',remote) - self.logger.info('%s' % url) - continue - local = os.path.basename(remote) - if not os.path.exists(opts.destdir): - os.makedirs(opts.destdir) - local = os.path.join(opts.destdir, local) - if (os.path.exists(local) and - os.path.getsize(local) == int(download.returnSimple('packagesize'))): - self.logger.error("%s already exists and appears to be complete" % local) - continue - # Disable cache otherwise things won't download - repo.cache = 0 - download.localpath = local # Hack: to set the localpath we want. - try: - checkfunc = (self.verifyPkg, (download, 1), {}) - path = repo.getPackage(download, checkfunc=checkfunc) - except IOError, e: - self.logger.error("Cannot write to file %s. Error was: %s" % (local, e)) - exit_code = 2 - continue - except RepoError, e: - self.logger.error("Could not download/verify pkg %s: %s" % (download, e)) - exit_code = 2 - continue - - if not os.path.exists(local) or not os.path.samefile(path, local): - progress = TextMeter() - progress.start(basename=os.path.basename(local), - size=os.stat(path).st_size) - shutil.copy2(path, local) - progress.end(progress.size) + rpmfn = os.path.basename(pkg.remote_path) + pkg.localpath = os.path.join(opts.destdir, rpmfn) + pkg.repo.copy_local = True + pkg.repo.cache = 0 + + # use downloader from YumBase + exit_code = 0 + probs = self.downloadPkgs(toDownload) + if probs: + exit_code = 2 + for key in probs: + for error in probs[key]: + self.logger.error('%s: %s', key, error) return exit_code def _groupPackages(self,pkglist): -- 1.7.4.4 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel