diff options
-rw-r--r-- | lib/spack/spack/cmd/buildcache.py | 26 | ||||
-rwxr-xr-x | share/spack/spack-completion.bash | 4 | ||||
-rwxr-xr-x | share/spack/spack-completion.fish | 8 |
3 files changed, 33 insertions, 5 deletions
diff --git a/lib/spack/spack/cmd/buildcache.py b/lib/spack/spack/cmd/buildcache.py index cd89201f52..17d3f6728c 100644 --- a/lib/spack/spack/cmd/buildcache.py +++ b/lib/spack/spack/cmd/buildcache.py @@ -20,6 +20,7 @@ import spack.cmd import spack.cmd.common.arguments as arguments import spack.config import spack.environment as ev +import spack.error import spack.mirror import spack.relocate import spack.repo @@ -78,6 +79,11 @@ def setup_parser(subparser: argparse.ArgumentParser): "Alternatively, one can decide to build a cache for only the package or only the " "dependencies", ) + push.add_argument( + "--fail-fast", + action="store_true", + help="stop pushing on first failure (default is best effort)", + ) arguments.add_common_arguments(push, ["specs"]) push.set_defaults(func=push_fn) @@ -296,6 +302,7 @@ def push_fn(args): tty.info(f"Selected {len(specs)} specs to push to {url}") skipped = [] + failed = [] # tty printing color = clr.get_color_when() @@ -326,11 +333,17 @@ def push_fn(args): except bindist.NoOverwriteException: skipped.append(format_spec(spec)) + # Catch any other exception unless the fail fast option is set + except Exception as e: + if args.fail_fast or isinstance(e, (bindist.PickKeyException, bindist.NoKeyException)): + raise + failed.append((format_spec(spec), e)) + if skipped: if len(specs) == 1: tty.info("The spec is already in the buildcache. Use --force to overwrite it.") elif len(skipped) == len(specs): - tty.info("All specs are already in the buildcache. Use --force to overwite them.") + tty.info("All specs are already in the buildcache. Use --force to overwrite them.") else: tty.info( "The following {} specs were skipped as they already exist in the buildcache:\n" @@ -340,6 +353,17 @@ def push_fn(args): ) ) + if failed: + if len(failed) == 1: + raise failed[0][1] + + raise spack.error.SpackError( + f"The following {len(failed)} errors occurred while pushing specs to the buildcache", + "\n".join( + elide_list([f" {spec}: {e.__class__.__name__}: {e}" for spec, e in failed], 5) + ), + ) + def install_fn(args): """install from a binary package""" diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index f504bea390..b85da2b6c4 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -498,7 +498,7 @@ _spack_buildcache() { _spack_buildcache_push() { if $list_options then - SPACK_COMPREPLY="-h --help -f --force --allow-root -a --unsigned -u --key -k --update-index --rebuild-index --spec-file --only" + SPACK_COMPREPLY="-h --help -f --force --allow-root -a --unsigned -u --key -k --update-index --rebuild-index --spec-file --only --fail-fast" else _mirrors fi @@ -507,7 +507,7 @@ _spack_buildcache_push() { _spack_buildcache_create() { if $list_options then - SPACK_COMPREPLY="-h --help -f --force --allow-root -a --unsigned -u --key -k --update-index --rebuild-index --spec-file --only" + SPACK_COMPREPLY="-h --help -f --force --allow-root -a --unsigned -u --key -k --update-index --rebuild-index --spec-file --only --fail-fast" else _mirrors fi diff --git a/share/spack/spack-completion.fish b/share/spack/spack-completion.fish index d743cf0f52..00cbe80ca2 100755 --- a/share/spack/spack-completion.fish +++ b/share/spack/spack-completion.fish @@ -685,7 +685,7 @@ complete -c spack -n '__fish_spack_using_command buildcache' -s h -l help -f -a complete -c spack -n '__fish_spack_using_command buildcache' -s h -l help -d 'show this help message and exit' # spack buildcache push -set -g __fish_spack_optspecs_spack_buildcache_push h/help f/force a/allow-root u/unsigned k/key= update-index spec-file= only= +set -g __fish_spack_optspecs_spack_buildcache_push h/help f/force a/allow-root u/unsigned k/key= update-index spec-file= only= fail-fast complete -c spack -n '__fish_spack_using_command_pos_remainder 1 buildcache push' -f -k -a '(__fish_spack_specs)' complete -c spack -n '__fish_spack_using_command buildcache push' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command buildcache push' -s h -l help -d 'show this help message and exit' @@ -703,9 +703,11 @@ complete -c spack -n '__fish_spack_using_command buildcache push' -l spec-file - complete -c spack -n '__fish_spack_using_command buildcache push' -l spec-file -r -d 'create buildcache entry for spec from json or yaml file' complete -c spack -n '__fish_spack_using_command buildcache push' -l only -r -f -a 'package dependencies' complete -c spack -n '__fish_spack_using_command buildcache push' -l only -r -d 'select the buildcache mode. The default is to build a cache for the package along with all its dependencies. Alternatively, one can decide to build a cache for only the package or only the dependencies' +complete -c spack -n '__fish_spack_using_command buildcache push' -l fail-fast -f -a fail_fast +complete -c spack -n '__fish_spack_using_command buildcache push' -l fail-fast -d 'stop pushing on first failure (default is best effort)' # spack buildcache create -set -g __fish_spack_optspecs_spack_buildcache_create h/help f/force a/allow-root u/unsigned k/key= update-index spec-file= only= +set -g __fish_spack_optspecs_spack_buildcache_create h/help f/force a/allow-root u/unsigned k/key= update-index spec-file= only= fail-fast complete -c spack -n '__fish_spack_using_command_pos_remainder 1 buildcache create' -f -k -a '(__fish_spack_specs)' complete -c spack -n '__fish_spack_using_command buildcache create' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command buildcache create' -s h -l help -d 'show this help message and exit' @@ -723,6 +725,8 @@ complete -c spack -n '__fish_spack_using_command buildcache create' -l spec-file complete -c spack -n '__fish_spack_using_command buildcache create' -l spec-file -r -d 'create buildcache entry for spec from json or yaml file' complete -c spack -n '__fish_spack_using_command buildcache create' -l only -r -f -a 'package dependencies' complete -c spack -n '__fish_spack_using_command buildcache create' -l only -r -d 'select the buildcache mode. The default is to build a cache for the package along with all its dependencies. Alternatively, one can decide to build a cache for only the package or only the dependencies' +complete -c spack -n '__fish_spack_using_command buildcache create' -l fail-fast -f -a fail_fast +complete -c spack -n '__fish_spack_using_command buildcache create' -l fail-fast -d 'stop pushing on first failure (default is best effort)' # spack buildcache install set -g __fish_spack_optspecs_spack_buildcache_install h/help f/force m/multiple u/unsigned o/otherarch |