---
 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

Reply via email to