--- output.py | 24 +++++++++++++++++++++++- yum/__init__.py | 11 ++++++++++- yum/repos.py | 9 +++++++++ yum/yumRepo.py | 13 ++++++++++++- 4 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/output.py b/output.py index be4e4d9..f4e9e51 100755 --- a/output.py +++ b/output.py @@ -29,7 +29,7 @@ import re # For YumTerm from weakref import proxy as weakref -from urlgrabber.progress import TextMeter +from urlgrabber.progress import TextMeter, TextMultiFileMeter import urlgrabber.progress from urlgrabber.grabber import URLGrabError from yum.misc import prco_tuple_to_string @@ -75,6 +75,23 @@ class YumTextMeter(TextMeter): checkSignals() TextMeter.update(self, amount_read, now) +class YumTextMultiFileMeter(TextMultiFileMeter): + """A class to display text progress bar output.""" + + def __init__(self, fo=sys.stderr): + TextMultiFileMeter.__init__(self, fo, threaded=False) + + def update_meter(self, meter, now=None): + """Update the status of the text progress bar + + :param meter: the meter we have just updated + :param now: the current time in seconds since the epoch. If + *now* is not given, the output of :func:`time.time()` will + be used. + """ + checkSignals() + TextMultiFileMeter.update_meter(self, meter, now) + class YumTerm: """A class to provide some terminal "UI" helpers based on curses.""" @@ -1559,9 +1576,12 @@ Transaction Summary # progress bars - this is hacky - I'm open to other options # One of these is a download if self.conf.debuglevel < 2 or not sys.stdout.isatty(): + multi_progressbar = None progressbar = None callback = None else: + if hasattr(urlgrabber.progress, '_FakeLock'): + multi_progressbar = YumTextMultiFileMeter(fo=sys.stdout) progressbar = YumTextMeter(fo=sys.stdout) callback = CacheProgressCallback() @@ -1572,6 +1592,7 @@ Transaction Summary # setup callback for CTRL-C's interrupt_callback = self.interrupt_callback if hasattr(self, 'prerepoconf'): + self.prerepoconf.multi_progressbar = multi_progressbar self.prerepoconf.progressbar = progressbar self.prerepoconf.callback = callback self.prerepoconf.failure_callback = failure_callback @@ -1579,6 +1600,7 @@ Transaction Summary else: # Just in case some API user decides to do self.repos before # calling us. + self.repos.setMultiProgressBar(multi_progressbar) self.repos.setProgressBar(progressbar) self.repos.callback = callback self.repos.setFailureCallback(failure_callback) diff --git a/yum/__init__.py b/yum/__init__.py index b07bbb2..a61825c 100644 --- a/yum/__init__.py +++ b/yum/__init__.py @@ -135,6 +135,7 @@ class _YumPreRepoConf: """ def __init__(self): self.progressbar = None + self.multi_progressbar = None self.callback = None self.failure_callback = None self.interrupt_callback = None @@ -640,6 +641,7 @@ class YumBase(depsolve.Depsolve): del self.prerepoconf self.repos.setProgressBar(prerepoconf.progressbar) + self.repos.setMultiProgressBar(prerepoconf.multi_progressbar) self.repos.callback = prerepoconf.callback self.repos.setFailureCallback(prerepoconf.failure_callback) self.repos.setInterruptCallback(prerepoconf.interrupt_callback) @@ -2137,6 +2139,11 @@ class YumBase(depsolve.Depsolve): if (hasattr(urlgrabber.progress, 'text_meter_total_size') and len(remote_pkgs) > 1): urlgrabber.progress.text_meter_total_size(remote_size) + + if remote_pkgs and remote_pkgs[0].repo.multi_callback: # FIXME: blah + remote_pkgs[0].repo.multi_callback.start(len(remote_pkgs), + remote_size) + beg_download = time.time() i = 0 local_size = 0 @@ -2159,7 +2166,9 @@ class YumBase(depsolve.Depsolve): checkfunc = (self.verifyPkg, (po, 1), {}) try: - if i == 1 and not local_size and remote_size == po.size: + if po.repo.multi_callback: + text = os.path.basename(po.relativepath) + elif i == 1 and not local_size and remote_size == po.size: text = os.path.basename(po.relativepath) else: text = '(%s/%s): %s' % (i, len(remote_pkgs), diff --git a/yum/repos.py b/yum/repos.py index 3793bad..8cc467e 100644 --- a/yum/repos.py +++ b/yum/repos.py @@ -233,6 +233,12 @@ class RepoStorage: for repo in self.repos.values(): repo.setCallback(obj) + def setMultiProgressBar(self, obj): + """sets the multi. progress bar for downloading N files from repos""" + + for repo in self.repos.values(): + repo.setMultiCallback(obj) + def setFailureCallback(self, obj): """sets the failure callback for all repos""" @@ -375,6 +381,9 @@ class Repository: def setCallback(self, callback): raise NotImplementedError() + def setMultiCallback(self, callback): + raise NotImplementedError() + def setFailureObj(self, obj): raise NotImplementedError() diff --git a/yum/yumRepo.py b/yum/yumRepo.py index 91b7dde..65312e9 100644 --- a/yum/yumRepo.py +++ b/yum/yumRepo.py @@ -266,6 +266,7 @@ class YumRepository(Repository, config.RepoConf): # callbacks self.callback = None # for the grabber + self.multi_callback = None # for the grabber self.failure_obj = None self.mirror_failure_obj = None self.interrupt_callback = None @@ -809,9 +810,14 @@ Insufficient space in download directory %s * needed %s''' ) % (os.path.dirname(local), format_number(avail), format_number(long(size))) + if (self.multi_callback is not None and + self.multi_callback.last_update_time): + prog_cb = self.multi_callback.newMeter() + else: + prog_cb = self.callback if url and scheme != "media": ugopts = self._default_grabopts(cache=cache) - ug = URLGrabber(progress_obj = self.callback, + ug = URLGrabber(progress_obj = prog_cb, copy_local = copy_local, reget = reget, failure_callback = self.failure_obj, @@ -842,6 +848,7 @@ Insufficient space in download directory %s headers = tuple(self.__headersListFromDict(cache=cache)) try: result = self.grab.urlgrab(misc.to_utf8(relative), local, + progress_obj = prog_cb, text = misc.to_utf8(text), range = (start, end), copy_local=copy_local, @@ -1668,6 +1675,10 @@ Insufficient space in download directory %s self.callback = callback self._callbacks_changed = True + def setMultiCallback(self, callback): + self.multi_callback = callback + self._callbacks_changed = True + def setFailureObj(self, failure_obj): self.failure_obj = failure_obj self._callbacks_changed = True -- 1.7.6.4 _______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel