diff --git a/python-urlgrabber.spec b/python-urlgrabber.spec index e89deeb..d84d5d2 100644 --- a/python-urlgrabber.spec +++ b/python-urlgrabber.spec @@ -3,7 +3,7 @@ Summary: A high-level cross-protocol url-grabber Name: python-urlgrabber Version: 3.9.1 -Release: 15%{?dist} +Release: 16%{?dist} Source0: urlgrabber-%{version}.tar.gz Patch1: urlgrabber-HEAD.patch @@ -44,6 +44,10 @@ rm -rf $RPM_BUILD_ROOT %attr(0755,root,root) %{_libexecdir}/urlgrabber-ext-down %changelog +* Wed Aug 8 2012 Zdeněk Pavlas - 3.9.1-16 +- Update to latest head. +- Improved multi-file progress, small bugfixes. + * Fri Jul 20 2012 Zdeněk Pavlas - 3.9.1-15 - Update to latest head, misc bugfixes: BZ 832028, 831904, 831291. - Disable Kerberos auth. BZ 769254 diff --git a/urlgrabber-HEAD.patch b/urlgrabber-HEAD.patch index 4e1b34b..67e6567 100644 --- a/urlgrabber-HEAD.patch +++ b/urlgrabber-HEAD.patch @@ -233,7 +233,7 @@ index 3e5f3b7..8eeaeda 100644 return (fb,lb) diff --git a/urlgrabber/grabber.py b/urlgrabber/grabber.py -index e090e90..83823ea 100644 +index e090e90..bdcdfe3 100644 --- a/urlgrabber/grabber.py +++ b/urlgrabber/grabber.py @@ -49,7 +49,7 @@ GENERAL ARGUMENTS (kwargs) @@ -1185,7 +1185,7 @@ index e090e90..83823ea 100644 ##################################################################### # DEPRECATED FUNCTIONS -@@ -1621,6 +1908,442 @@ def retrygrab(url, filename=None, copy_local=0, close_connection=0, +@@ -1621,6 +1908,445 @@ def retrygrab(url, filename=None, copy_local=0, close_connection=0, ##################################################################### @@ -1368,6 +1368,9 @@ index e090e90..83823ea 100644 + def perform(self): + ret = [] + for fd, event in self.epoll.poll(): ++ if event & select.EPOLLHUP: ++ if DEBUG: DEBUG.info('downloader died') ++ raise KeyboardInterrupt + assert event & select.EPOLLIN + done = self.running[fd].perform() + if not done: continue @@ -1560,7 +1563,7 @@ index e090e90..83823ea 100644 + if filename and _TH.dirty is None: + try: + for line in open(filename): -+ host, speed, fail, ts = line.split(' ', 3) ++ host, speed, fail, ts = line.rsplit(' ', 3) + _TH.hosts[host] = int(speed), int(fail), int(ts) + except IOError: pass + _TH.dirty = False @@ -1707,7 +1710,7 @@ index dad410b..ac78b34 100644 def urlopen(self, url, **kwargs): kw = dict(kwargs) diff --git a/urlgrabber/progress.py b/urlgrabber/progress.py -index dd07c6a..4c126c5 100644 +index dd07c6a..5a02707 100644 --- a/urlgrabber/progress.py +++ b/urlgrabber/progress.py @@ -211,6 +211,21 @@ def text_meter_total_size(size, downloaded=0): @@ -1796,7 +1799,7 @@ index dd07c6a..4c126c5 100644 self._do_end(now) def _do_end(self, now): -@@ -466,11 +483,20 @@ class MultiFileMeter: +@@ -466,11 +483,21 @@ class MultiFileMeter: class TextMultiFileMeter(MultiFileMeter): @@ -1805,6 +1808,7 @@ index dd07c6a..4c126c5 100644 self.fo = fo - MultiFileMeter.__init__(self) + MultiFileMeter.__init__(self, threaded) ++ self.index_time = self.index = 0 # files: ###/### ###% data: ######/###### ###% time: ##:##:##/##:##:## +# New output, like TextMeter output... @@ -1819,7 +1823,7 @@ index dd07c6a..4c126c5 100644 def _do_update_meter(self, meter, now): self._lock.acquire() try: -@@ -480,7 +506,7 @@ class TextMultiFileMeter(MultiFileMeter): +@@ -480,7 +507,7 @@ class TextMultiFileMeter(MultiFileMeter): tf = self.numfiles or 1 pf = 100 * float(df)/tf + 0.49 dd = self.re.last_amount_read @@ -1828,7 +1832,7 @@ index dd07c6a..4c126c5 100644 pd = 100 * (self.re.fraction_read() or 0) + 0.49 dt = self.re.elapsed_time() rt = self.re.remaining_time() -@@ -491,9 +517,33 @@ class TextMultiFileMeter(MultiFileMeter): +@@ -491,9 +518,39 @@ class TextMultiFileMeter(MultiFileMeter): ftd = format_number(td) + 'B' fdt = format_time(dt, 1) ftt = format_time(tt, 1) @@ -1838,9 +1842,15 @@ index dd07c6a..4c126c5 100644 + + frac = self.re.fraction_read() or 0 + ave_dl = format_number(self.re.average_rate()) ++ ++ # cycle through active meters ++ if now > self.index_time: ++ self.index_time = now + 1.0 ++ self.index = (self.index + 1) % len(self.meters) ++ meter = self.meters[self.index] + text = meter.text or meter.basename + if tf > 1: -+ text = '(%u/%u): %s' % (df+1, tf, text) ++ text = '(%u/%u): %s' % (df+1+self.index, tf, text) + + # Include text + ui_rate in minimal + tl = TerminalLine(8, 8+1+8) @@ -1865,7 +1875,7 @@ index dd07c6a..4c126c5 100644 self.fo.flush() finally: self._lock.release() -@@ -502,18 +552,30 @@ class TextMultiFileMeter(MultiFileMeter): +@@ -502,18 +559,30 @@ class TextMultiFileMeter(MultiFileMeter): self._lock.acquire() try: format = "%-30.30s %6.6s %8.8s %9.9s" @@ -1902,7 +1912,7 @@ index dd07c6a..4c126c5 100644 def _do_failure_meter(self, meter, message, now): self._lock.acquire() -@@ -536,15 +598,6 @@ class TextMultiFileMeter(MultiFileMeter): +@@ -536,15 +605,6 @@ class TextMultiFileMeter(MultiFileMeter): pass finally: self._lock.release() @@ -1918,7 +1928,7 @@ index dd07c6a..4c126c5 100644 ###################################################################### # support classes and functions -@@ -658,6 +711,8 @@ def format_time(seconds, use_hours=0): +@@ -658,6 +718,8 @@ def format_time(seconds, use_hours=0): if seconds is None or seconds < 0: if use_hours: return '--:--:--' else: return '--:--'