Changeset c49e500 in rtems-source-builder for source-builder/sb/download.py


Ignore:
Timestamp:
07/29/14 00:04:55 (8 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, 5, master
Children:
a083b52
Parents:
4837350
Message:

sb: Add visual feedback for http type downloads.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/download.py

    r4837350 rc49e500  
    3434import log
    3535import path
     36
     37def _humanize_bytes(bytes, precision = 1):
     38    abbrevs = (
     39        (1 << 50L, 'PB'),
     40        (1 << 40L, 'TB'),
     41        (1 << 30L, 'GB'),
     42        (1 << 20L, 'MB'),
     43        (1 << 10L, 'kB'),
     44        (1, ' bytes')
     45    )
     46    if bytes == 1:
     47        return '1 byte'
     48    for factor, suffix in abbrevs:
     49        if bytes >= factor:
     50            break
     51    return '%.*f%s' % (precision, float(bytes) / factor, suffix)
    3652
    3753def _http_parser(source, config, opts):
     
    175191    if url.startswith('https://api.github.com'):
    176192        url = urlparse.urljoin(url, config.expand('tarball/%{version}'))
    177     log.notice('download: %s -> %s' % (url, os.path.relpath(path.host(local))))
     193    dst = os.path.relpath(path.host(local))
     194    log.notice('download: %s -> %s' % (url, dst))
    178195    failed = False
    179196    if not opts.dry_run():
    180197        _in = None
    181198        _out = None
     199        _length = None
     200        _have = 0
     201        _chunk_size = 256 * 1024
     202        _chunk = None
     203        _last_percent = 200.0
     204        _last_msg = ''
     205        _wipe_output = False
    182206        try:
    183             _in = urllib2.urlopen(url)
    184             _out = open(path.host(local), 'wb')
    185             _out.write(_in.read())
     207            try:
     208                _in = urllib2.urlopen(url)
     209                _out = open(path.host(local), 'wb')
     210                try:
     211                    _length = int(_in.info().getheader('Content-Length').strip())
     212                except:
     213                    pass
     214                while True:
     215                    _msg = '\rdownloading: %s - %s ' % (dst, _humanize_bytes(_have))
     216                    if _length:
     217                        _percent = round((float(_have) / _length) * 100, 2)
     218                        if _percent != _last_percent:
     219                            _msg += 'of %s (%0.0f%%) ' % (_humanize_bytes(_length), _percent)
     220                    if _msg != _last_msg:
     221                        extras = (len(_last_msg) - len(_msg))
     222                        log.stdout_raw('%s%s' % (_msg, ' ' * extras + '\b' * extras))
     223                        _last_msg = _msg
     224                    _chunk = _in.read(_chunk_size)
     225                    if not _chunk:
     226                        break
     227                    _out.write(_chunk)
     228                    _have += len(_chunk)
     229                if _wipe_output:
     230                    log.stdout_raw('\r%s\r' % (' ' * len(_last_msg)))
     231                else:
     232                    log.stdout_raw('\n')
     233            except:
     234                log.stdout_raw('\n')
     235                raise
    186236        except IOError, err:
    187237            log.notice('download: %s: error: %s' % (url, str(err)))
Note: See TracChangeset for help on using the changeset viewer.