diff --git a/lib/spack/spack/cmd/tutorial.py b/lib/spack/spack/cmd/tutorial.py new file mode 100644 index 0000000000..2bfe866d22 --- /dev/null +++ b/lib/spack/spack/cmd/tutorial.py @@ -0,0 +1,85 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from __future__ import print_function + +import os.path +import shutil + +import llnl.util.tty as tty +from llnl.util.filesystem import working_dir + +import spack.cmd.common.arguments as arguments +import spack.config +import spack.paths +import spack.util.gpg +from spack.util.executable import which +from spack.util.spack_yaml import syaml_dict + + +description = "set up spack for our tutorial (WARNING: modifies config!)" +section = "config" +level = "long" + + +# tutorial configuration parameters +tutorial_branch = "releases/v0.15" +tutorial_mirror = "s3://spack-tutorial-container/mirror/" +tutorial_key = os.path.join(spack.paths.share_path, "keys", "tutorial.pub") + +# configs to remove +rm_configs = [ + "~/.spack/linux/compilers.yaml", + "~/.spack/packages.yaml", + "~/.spack/mirrors.yaml", + "~/.spack/modules.yaml", + "~/.spack/config.yaml", +] + + +def setup_parser(subparser): + arguments.add_common_arguments(subparser, ['yes_to_all']) + + +def tutorial(parser, args): + if not spack.cmd.spack_is_git_repo(): + tty.die("This command requires a git installation of Spack!") + + if not args.yes_to_all: + tty.msg("This command will set up Spack for the tutorial at " + "https://spack-tutorial.readthedocs.io.", + "") + tty.warn("This will modify your Spack configuration by:", + " - deleting some configuration in ~/.spack", + " - adding a mirror and trusting its public key", + " - checking out a particular branch of Spack", + "") + if not tty.get_yes_or_no("Are you sure you want to proceed?"): + tty.die("Aborted") + + rm_cmds = ["rm -f %s" % f for f in rm_configs] + tty.msg("Reverting compiler and repository configuration", *rm_cmds) + for path in rm_configs: + if os.path.exists(path): + shutil.rmtree(path, ignore_errors=True) + + tty.msg("Ensuring that the tutorial binary mirror is configured:", + "spack mirror add tutorial %s" % tutorial_mirror) + mirror_config = syaml_dict() + mirror_config["tutorial"] = tutorial_mirror + spack.config.set('mirrors', mirror_config, scope="user") + + tty.msg("Ensuring that we trust tutorial binaries", + "spack gpg trust %s" % tutorial_key) + spack.util.gpg.trust(tutorial_key) + + # Note that checkout MUST be last. It changes Spack under our feet. + # If you don't put this last, you'll get import errors for the code + # that follows (exacerbated by the various lazy singletons we use) + tty.msg("Ensuring we're on the releases/v0.15 branch") + git = which("git", required=True) + with working_dir(spack.paths.prefix): + git("checkout", tutorial_branch) + # NO CODE BEYOND HERE diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 3933621e84..2a11fac65c 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -320,7 +320,7 @@ _spack() { then SPACK_COMPREPLY="-h --help -H --all-help --color -C --config-scope -d --debug --timestamp --pdb -e --env -D --env-dir -E --no-env --use-env-repo -k --insecure -l --enable-locks -L --disable-locks -m --mock -p --profile --sorted-profile --lines -v --verbose --stacktrace -V --version --print-shell-vars" else - SPACK_COMPREPLY="activate add arch blame build-env buildcache cd checksum ci clean clone commands compiler compilers concretize config containerize create deactivate debug dependencies dependents deprecate dev-build develop docs edit env extensions external fetch find flake8 gc gpg graph help info install license list load location log-parse maintainers mirror module patch pkg providers pydoc python reindex remove rm repo resource restage setup spec stage test undevelop uninstall unload url verify versions view" + SPACK_COMPREPLY="activate add arch blame build-env buildcache cd checksum ci clean clone commands compiler compilers concretize config containerize create deactivate debug dependencies dependents deprecate dev-build develop docs edit env extensions external fetch find flake8 gc gpg graph help info install license list load location log-parse maintainers mirror module patch pkg providers pydoc python reindex remove rm repo resource restage setup spec stage test tutorial undevelop uninstall unload url verify versions view" fi } @@ -1491,6 +1491,10 @@ _spack_test() { fi } +_spack_tutorial() { + SPACK_COMPREPLY="-h --help -y --yes-to-all" +} + _spack_undevelop() { if $list_options then