---
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
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel