diff --git a/osc/commandline.py b/osc/commandline.py index 6412bfcc2..5637500fd 100644 --- a/osc/commandline.py +++ b/osc/commandline.py @@ -6046,6 +6046,8 @@ def do_rremove(self, subcmd, opts): help='list packages vertically instead horizontally for entire project') @cmdln.option('-w', '--watch', action='store_true', help='watch the results until all finished building') + @cmdln.option('-F', '--fail-on-error', action='store_true', + help='fail with exit 1 if any build has errored') @cmdln.option('-s', '--status-filter', help='only show packages with the given build status') @cmdln.option('-f', '--failed', action='store_true', @@ -6129,7 +6131,14 @@ def do_results(self, subcmd, opts, *args): kwargs['verbose'] = opts.verbose kwargs['wait'] = opts.watch kwargs['printJoin'] = '\n' - get_results(**kwargs) + + out = {} + get_results(out=out, **kwargs) + + if opts.fail_on_error and out['failed']: + sys.exit(1) + + # 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 27d5535a8..9eba3ffe4 100644 --- a/osc/core.py +++ b/osc/core.py @@ -4089,7 +4089,16 @@ def format_results(results, format): return [format % r for r in results] -def get_results(apiurl: str, project: str, package: str, verbose=False, printJoin="", *args, **kwargs): +def get_results( + apiurl: str, + project: str, + package: str, + verbose=False, + printJoin="", + out: Optional[dict] = None, + *args, + **kwargs +): """returns list of/or prints a human readable status for the specified package""" # hmm the function name is a bit too generic - something like # get_package_results_human would be better, but this would break the existing @@ -4098,6 +4107,7 @@ def get_results(apiurl: str, project: str, package: str, verbose=False, printJoi result_line_mb_templ = '%(rep)-20s %(arch)-10s %(pkg)-30s %(status)s' r = [] printed = False + failed = False multibuild_packages = kwargs.pop('multibuild_packages', []) show_excluded = kwargs.pop('showexcl', False) code_filter = kwargs.get('code') @@ -4143,12 +4153,21 @@ def get_results(apiurl: str, project: str, package: str, verbose=False, printJoi else: r.append(result_line_templ % res) + if res['code'] in ('failed', 'broken', 'unresolvable'): + failed = True + if printJoin: if printed: # will print a newline if already a result was printed (improves readability) print() print(printJoin.join(r)) printed = True + + if out is None: + out = {} + + out["failed"] = failed + return r