diff --git a/NEWS b/NEWS index 53dff1c8..26899a5b 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,7 @@ 0.134 - patchinfo call can work without checked out copy now - use qemu as fallback for building not directly supported architectures + - "results --watch" option to watch build results until they finished building # # Features which requires OBS 2.3 # diff --git a/osc/commandline.py b/osc/commandline.py index db8a202f..4e0d1228 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -4191,6 +4191,8 @@ Please submit there instead, or use --nodevelproject to force direct submission. help='Show results only for specified architecture(s)') @cmdln.option('-v', '--verbose', action='store_true', default=False, help='more verbose output') + @cmdln.option('-w', '--watch', action='store_true', default=False, + help='permanently watch the result') @cmdln.option('', '--xml', action='store_true', default=False, help='generate output in XML (former results_meta)') @cmdln.option('', '--csv', action='store_true', default=False, @@ -4245,7 +4247,9 @@ Please submit there instead, or use --nodevelproject to force direct submission. print '\n'.join(format_results(get_package_results(*args), opts.format)) else: args.append(opts.verbose) - print '\n'.join(get_results(*args)) + args.append(opts.watch) + args.append("\n") + get_results(*args) # WARNING: this function is also called by do_results. You need to set a default there # as well when adding a new option! diff --git a/osc/core.py b/osc/core.py index beb5faa0..4c05c85c 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4634,10 +4634,12 @@ def get_binarylist_published(apiurl, prj, repo, arch): return r -def show_results_meta(apiurl, prj, package=None, lastbuild=None, repository=[], arch=[]): +def show_results_meta(apiurl, prj, package=None, lastbuild=None, repository=[], arch=[], oldstate=None): query = {} if package: query['package'] = package + if oldstate: + query['oldstate'] = oldstate if lastbuild: query['lastbuild'] = 1 u = makeurl(apiurl, ['build', prj, '_result'], query=query) @@ -4655,13 +4657,15 @@ def show_prj_results_meta(apiurl, prj): return f.readlines() -def get_package_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[]): +def get_package_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[], oldstate=None): """ return a package results as a list of dicts """ r = [] - f = show_results_meta(apiurl, prj, package, lastbuild, repository, arch) + f = show_results_meta(apiurl, prj, package, lastbuild, repository, arch, oldstate) root = ET.fromstring(''.join(f)) + r.append( {'_oldstate': root.get('state')} ) + for node in root.findall('result'): rmap = {} rmap['project'] = rmap['prj'] = prj @@ -4692,26 +4696,42 @@ def format_results(results, format): """apply selected format on each dict in results and return it as a list of strings""" return [format % r for r in results] -def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[], verbose=False): +def get_results(apiurl, prj, package, lastbuild=None, repository=[], arch=[], verbose=False, wait=False, printJoin=None): r = [] result_line_templ = '%(rep)-20s %(arch)-10s %(status)s' + oldstate = None - for res in get_package_results(apiurl, prj, package, lastbuild, repository, arch): - res['status'] = res['code'] - if verbose and res['details'] != '': - if res['status'] in ('unresolvable', 'expansion error'): - lines = res['details'].split(',') - res['status'] += ': ' + '\n '.join(lines) + while True: + waiting = False + r = [] + for res in get_package_results(apiurl, prj, package, lastbuild, repository, arch, oldstate): + if res.has_key('_oldstate'): + oldstate = res['_oldstate'] + continue + res['status'] = res['code'] + if verbose and res['details'] != '': + if res['status'] in ('unresolvable', 'expansion error'): + lines = res['details'].split(',') + res['status'] += ': ' + '\n '.join(lines) - else: - res['status'] += ': %s' % (res['details'], ) - if res['dirty']: - if verbose: - res['status'] = 'outdated (was: %s)' % res['status'] - else: - res['status'] += '*' + else: + res['status'] += ': %s' % (res['details'], ) + if res['dirty']: + waiting=True + if verbose: + res['status'] = 'outdated (was: %s)' % res['status'] + else: + res['status'] += '*' + if res['status'] in ('scheduled', 'finished', 'building', 'signing', 'dispatching'): + waiting=True - r.append(result_line_templ % res) + r.append(result_line_templ % res) + + if printJoin: + print printJoin.join(r) + + if wait==False or waiting==False: + break return r