Changeset d755065 in rtems-source-builder


Ignore:
Timestamp:
Feb 17, 2015, 11:15:31 PM (5 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
9b8c76d
Parents:
6168929
git-author:
Chris Johns <chrisj@…> (02/17/15 23:15:31)
git-committer:
Chris Johns <chrisj@…> (02/17/15 23:27:02)
Message:

Add options support for --with/--without processing. Add --with-download support.

You can now test downloading by using --dry-run and --with-download.

Print the redirect if one is taken.

Location:
source-builder/sb
Files:
2 edited

Legend:

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

    r6168929 rd755065  
    3636import path
    3737import sources
     38
     39def _do_download(opts):
     40    download = True
     41    if opts.dry_run():
     42        download = False
     43        wa = opts.with_arg('download')
     44        if wa is not None:
     45            if wa[0] == 'with_download' and wa[1] == 'yes':
     46                download = True
     47    return download
    3848
    3949def _humanize_bytes(bytes, precision = 1):
     
    103113    return not failed
    104114
    105 def _http_parser(source, config, opts):
     115def _local_path(source, pathkey, config):
     116    for p in config.define(pathkey).split(':'):
     117        local = path.join(path.abspath(p), source['file'])
     118        if source['local'] is None:
     119            source['local_prefix'] = path.abspath(p)
     120            source['local'] = local
     121        if path.exists(local):
     122            source['local_prefix'] = path.abspath(p)
     123            source['local'] = local
     124            _hash_check(source['file'], local, config.macros)
     125            break
     126
     127def _http_parser(source, pathkey, config, opts):
     128    #
     129    # Hack for gitweb.cgi patch downloads. We rewrite the various fields.
     130    #
     131    if 'gitweb.cgi' in source['url']:
     132        url = source['url']
     133        if '?' not in url:
     134            raise error.general('invalid gitweb.cgi request: %s' % (url))
     135        req = url.split('?')[1]
     136        if len(req) == 0:
     137            raise error.general('invalid gitweb.cgi request: %s' % (url))
     138        #
     139        # The gitweb.cgi request should have:
     140        #    p=<what>
     141        #    a=patch
     142        #    h=<hash>
     143        # so extract the p and h parts to make the local name.
     144        #
     145        p = None
     146        a = None
     147        h = None
     148        for r in req.split(';'):
     149            if '=' not in r:
     150                raise error.general('invalid gitweb.cgi path: %s' % (url))
     151            rs = r.split('=')
     152            if rs[0] == 'p':
     153                p = rs[1].replace('.', '-')
     154            elif rs[0] == 'a':
     155                a = rs[1]
     156            elif rs[0] == 'h':
     157                h = rs[1]
     158        if p is None or h is None:
     159            raise error.general('gitweb.cgi path missing p or h: %s' % (url))
     160        source['file'] = '%s-%s.patch' % (p, h)
     161    #
     162    # Check local path
     163    #
     164    _local_path(source, pathkey, config)
    106165    #
    107166    # Is the file compressed ?
     
    121180        source['compressed'] = '%{__xz} -dc'
    122181
    123 def _patchworks_parser(source, config, opts):
     182def _patchworks_parser(source, pathkey, config, opts):
     183    #
     184    # Check local path
     185    #
     186    _local_path(source, pathkey, config)
    124187    source['url'] = 'http%s' % (source['path'][2:])
    125188
    126 def _git_parser(source, config, opts):
     189def _git_parser(source, pathkey, config, opts):
     190    #
     191    # Check local path
     192    #
     193    _local_path(source, pathkey, config)
    127194    #
    128195    # Symlink.
     
    138205    source['symlink'] = source['local']
    139206
    140 def _cvs_parser(source, config, opts):
     207def _cvs_parser(source, pathkey, config, opts):
     208    #
     209    # Check local path
     210    #
     211    _local_path(source, pathkey, config)
    141212    #
    142213    # Symlink.
     
    186257        source['symlink'] = source['local']
    187258
    188 def _file_parser(source, config, opts):
     259def _file_parser(source, pathkey, config, opts):
     260    #
     261    # Check local path
     262    #
     263    _local_path(source, pathkey, config)
    189264    #
    190265    # Symlink.
     
    218293    #
    219294    source['local'] = None
    220     for p in config.define(pathkey).split(':'):
    221         local = path.join(path.abspath(p), source['file'])
    222         if source['local'] is None:
    223             source['local_prefix'] = path.abspath(p)
    224             source['local'] = local
    225         if path.exists(local):
    226             source['local_prefix'] = path.abspath(p)
    227             source['local'] = local
    228             _hash_check(source['file'], local, config.macros)
    229             break
    230     source['script'] = ''
    231295    for p in parsers:
    232296        if url.startswith(p):
    233297            source['type'] = p
    234             if parsers[p](source, config, opts):
     298            if parsers[p](source, pathkey, config, opts):
    235299                break
     300    source['script'] = ''
    236301    return source
    237302
     
    247312    log.notice('download: %s -> %s' % (url, dst))
    248313    failed = False
    249     if not opts.dry_run():
     314    if _do_download(opts):
    250315        _in = None
    251316        _out = None
     
    259324        try:
    260325            try:
     326                _in = None
    261327                _in = urllib2.urlopen(url)
     328                if url != _in.geturl():
     329                    log.notice(' redirect: %s' % (_in.geturl()))
    262330                _out = open(path.host(local), 'wb')
    263331                try:
     
    301369            log.stderr(msg)
    302370            log.notice(msg)
     371            if _in is not None:
     372                _in.close()
    303373            if _out is not None:
    304374                _out.close()
     
    307377            _out.close()
    308378        if _in is not None:
     379            _in.close()
    309380            del _in
    310381        if not failed:
     
    339410    if not repo.valid():
    340411        log.notice('git: clone: %s -> %s' % (us[0], rlp))
    341         if not opts.dry_run():
     412        if _do_download(opts):
    342413            repo.clone(us[0], local)
    343414    else:
     
    351422                raise error.general('invalid git branch/checkout: %s' % (_as))
    352423            log.notice('git: checkout: %s => %s' % (us[0], _as[1]))
    353             if not opts.dry_run():
     424            if _do_download(opts):
    354425                repo.checkout(_as[1])
    355426        elif _as[0] == 'pull':
    356427            log.notice('git: pull: %s' % (us[0]))
    357             if not opts.dry_run():
     428            if _do_download(opts):
    358429                repo.pull()
    359430        elif _as[0] == 'submodule':
     
    361432                raise error.general('invalid git submodule: %s' % (_as))
    362433            log.notice('git: submodule: %s <= %s' % (us[0], _as[1]))
    363             if not opts.dry_run():
     434            if _do_download(opts):
    364435                repo.submodule(_as[1])
    365436        elif _as[0] == 'fetch':
    366437            log.notice('git: fetch: %s -> %s' % (us[0], rlp))
    367             if not opts.dry_run():
     438            if _do_download(opts):
    368439                repo.fetch()
    369440        elif _as[0] == 'reset':
     
    372443                arg = ['--%s' % (_as[1])]
    373444            log.notice('git: reset: %s' % (us[0]))
    374             if not opts.dry_run():
     445            if _do_download(opts):
    375446                repo.reset(arg)
    376447        elif _as[0] == 'protocol':
     
    410481            log.notice('Creating source directory: %s' % \
    411482                           (os.path.relpath(path.host(local))))
    412             if not opts.dry_run():
     483            if _do_download(opts):
    413484                path.mkdir(local)
    414485            log.notice('cvs: checkout: %s -> %s' % (us[0], rlp))
    415             if not opts.dry_run():
     486            if _do_download(opts):
    416487                repo.checkout(':%s' % (us[0][6:]), module, tag, date)
    417488    for a in us[1:]:
     
    419490        if _as[0] == 'update':
    420491            log.notice('cvs: update: %s' % (us[0]))
    421             if not opts.dry_run():
     492            if _do_download(opts):
    422493                repo.update()
    423494        elif _as[0] == 'reset':
    424495            log.notice('cvs: reset: %s' % (us[0]))
    425             if not opts.dry_run():
     496            if _do_download(opts):
    426497                repo.reset()
    427498    return True
     
    446517                       (os.path.relpath(path.host(path.dirname(local)))))
    447518    log.output('making dir: %s' % (path.host(path.dirname(local))))
    448     if not opts.dry_run():
     519    if _do_download(opts):
    449520        path.mkdir(path.dirname(local))
    450521    if not path.exists(local) and opts.download_disabled():
     
    473544                if downloaders[dl](url, local, config, opts):
    474545                    return
    475     if not opts.dry_run():
     546    if _do_download(opts):
    476547        raise error.general('downloading %s: all paths have failed, giving up' % (url))
  • source-builder/sb/options.py

    r6168929 rd755065  
    191191    def help(self):
    192192        print '%s: [options] [args]' % (self.command_name)
    193         print 'RTEMS Source Builder, an RTEMS Tools Project (c) 2012-2013 Chris Johns'
     193        print 'RTEMS Source Builder, an RTEMS Tools Project (c) 2012-2015 Chris Johns'
    194194        print 'Options and arguments:'
    195195        print '--force                : Force the build to proceed'
     
    428428        return self.opts['params']
    429429
     430    def parse_args(self, arg, error = True):
     431        for a in range(0, len(self.args)):
     432            if self.args[a].startswith(arg):
     433                lhs = None
     434                rhs = None
     435                if '=' in self.args[a]:
     436                    eqs = self.args[a].split('=')
     437                    lhs = eqs[0]
     438                    if len(eqs) > 2:
     439                        rhs = '='.join(eqs[1:])
     440                    else:
     441                        rhs = eqs[1]
     442                else:
     443                    lhs = self.args[a]
     444                    a += 1
     445                    if a >= len(self.args):
     446                        return [arg, None]
     447                    rhs = self.args[a]
     448                return [lhs, rhs]
     449            a += 1
     450        return None
     451
    430452    def get_arg(self, arg):
    431453        if self.optargs is None or arg not in self.optargs:
    432454            raise error.internal('bad arg: %s' % (arg))
    433         for a in self.args:
    434             sa = a.split('=')
    435             if sa[0].startswith(arg):
    436                 return sa
    437         return None
     455        return self.parse_args(arg)
     456
     457    def with_arg(self, label):
     458        for pre in ['with', 'without']:
     459            arg_str = '--%s-%s' % (pre, label)
     460            arg_label = '%s_%s' % (pre, label)
     461            arg = self.parse_args(arg_str, error = False)
     462            if arg is not None:
     463                if arg[1] is  None:
     464                    result = 'yes'
     465                else:
     466                    result = arg[1]
     467                break
     468            if pre == 'with':
     469                result = 'yes'
     470            else:
     471                result = 'no'
     472        return [arg_label, result]
    438473
    439474    def get_config_files(self, config):
     
    571606        log.notice('Defaults:')
    572607        log.notice(str(_opts.defaults))
     608        log.notice('with-opt1: %r' % (_opts.with_arg('opt1')))
     609        log.notice('without-opt2: %r' % (_opts.with_arg('opt2')))
    573610    except error.general, gerr:
    574611        print gerr
Note: See TracChangeset for help on using the changeset viewer.