From b624c5b9a30c1d42784ff6cc26ef6e652e5b3120 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Tue, 2 Nov 2021 22:23:44 -0700 Subject: [PATCH] commands: `spack load --list` alias for `spack find --loaded` See #25249 and https://github.com/spack/spack/pull/27159#issuecomment-958163679. This adds `spack load --list` as an alias for `spack find --loaded`. The new command is not as powerful as `spack find --loaded`, as you can't combine it with all the queries or formats that `spack find` provides. However, it is more intuitively located in the command structure in that it appears in the output of `spack load --help`. The idea here is that people can use `spack load --list` for simple stuff but fall back to `spack find --loaded` if they need more. - [x] add help to `spack load --list` that references `spack find` - [x] factor some parts of `spack find` out to be called from `spack load` - [x] add shell integration - [x] add shell test - [x] update completion - [x] update docs --- lib/spack/docs/basic_usage.rst | 3 +++ lib/spack/spack/cmd/find.py | 18 +++++++++++++++--- lib/spack/spack/cmd/load.py | 23 +++++++++++++++++++---- share/spack/csh/spack.csh | 1 + share/spack/qa/setup-env-test.sh | 1 + share/spack/setup-env.fish | 5 +++++ share/spack/setup-env.sh | 1 + share/spack/spack-completion.bash | 2 +- 8 files changed, 46 insertions(+), 8 deletions(-) diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index 379e58324d7..de61d9fd1ad 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -924,6 +924,9 @@ use ``spack find --loaded``. -- linux-debian7 / intel@15.0.0 --------------------------------- libelf@0.8.13 +You can also use ``spack load --list`` to get the same output, but it +does not have the full set of query options that ``spack find`` offers. + We'll learn more about Spack's spec syntax in the next section. diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 8378f6ef6e1..c199f1a4b6d 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -204,6 +204,16 @@ def display_env(env, args, decorator): print() +def filter_loaded_specs(specs): + """Filter a list of specs returning only those that are currently loaded.""" + hashes = os.environ.get(uenv.spack_loaded_hashes_var, '').split(':') + return [x for x in specs if x.dag_hash() in hashes] + + +def print_how_many_pkgs(specs, pkg_type=""): + tty.msg("%s" % plural(len(specs), pkg_type + " package")) + + def find(parser, args): if args.bootstrap: bootstrap_store_path = spack.bootstrap.store_path() @@ -241,8 +251,7 @@ def _find(parser, args): results = [x for x in results if x.name in packages_with_tags] if args.loaded: - hashes = os.environ.get(uenv.spack_loaded_hashes_var, '').split(':') - results = [x for x in results if x.dag_hash() in hashes] + results = filter_loaded_specs(results) # Display the result if args.json: @@ -251,7 +260,10 @@ def _find(parser, args): if not args.format: if env: display_env(env, args, decorator) + if sys.stdout.isatty() and args.groups: - tty.msg("%s" % plural(len(results), 'installed package')) + pkg_type = "loaded" if args.loaded else "installed" + print_how_many_pkgs(results, pkg_type) + cmd.display_specs( results, args, decorator=decorator, all_headers=True) diff --git a/lib/spack/spack/cmd/load.py b/lib/spack/spack/cmd/load.py index ab8f88c7f5e..ecca3a42866 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -7,6 +7,7 @@ import spack.cmd import spack.cmd.common.arguments as arguments +import spack.cmd.find import spack.environment as ev import spack.store import spack.user_environment as uenv @@ -20,8 +21,7 @@ def setup_parser(subparser): """Parser is only constructed so that this prints a nice help message with -h. """ - arguments.add_common_arguments( - subparser, ['installed_specs']) + arguments.add_common_arguments(subparser, ['constraint']) shells = subparser.add_mutually_exclusive_group() shells.add_argument( @@ -53,14 +53,29 @@ def setup_parser(subparser): the dependencies""" ) + subparser.add_argument( + '--list', + action='store_true', + default=False, + help="show loaded packages: same as `spack find --loaded`" + ) + def load(parser, args): env = ev.active_environment() + + if args.list: + results = spack.cmd.find.filter_loaded_specs(args.specs()) + if sys.stdout.isatty(): + spack.cmd.find.print_how_many_pkgs(results, "loaded") + spack.cmd.display_specs(results) + return + specs = [spack.cmd.disambiguate_spec(spec, env, first=args.load_first) - for spec in spack.cmd.parse_specs(args.specs)] + for spec in spack.cmd.parse_specs(args.constraint)] if not args.shell: - specs_str = ' '.join(args.specs) or "SPECS" + specs_str = ' '.join(args.constraint) or "SPECS" spack.cmd.common.shell_init_instructions( "spack load", " eval `spack load {sh_arg} %s`" % specs_str, diff --git a/share/spack/csh/spack.csh b/share/spack/csh/spack.csh index 7b6bcbf929f..b105f4fa89e 100644 --- a/share/spack/csh/spack.csh +++ b/share/spack/csh/spack.csh @@ -148,6 +148,7 @@ case unload: # argument and specs with "-h" in the name. if ( " $_sp_spec" =~ "* --sh*" || \ " $_sp_spec" =~ "* --csh*" || \ + " $_sp_spec" =~ "* --list*" || \ " $_sp_spec" =~ "* -h*" || \ " $_sp_spec" =~ "* --help*") then # Args contain --sh, --csh, or -h/--help: just execute. diff --git a/share/spack/qa/setup-env-test.sh b/share/spack/qa/setup-env-test.sh index b93ac6c0e60..a1dc0e1c835 100755 --- a/share/spack/qa/setup-env-test.sh +++ b/share/spack/qa/setup-env-test.sh @@ -106,6 +106,7 @@ contains "usage: spack module " spack -m module title 'Testing `spack load`' contains "export PATH=$(spack -m location -i b)/bin" spack -m load --only package --sh b succeeds spack -m load b +contains "b@" spack load --list fails spack -m load -l # test a variable MacOS clears and one it doesn't for recursive loads contains "export PATH=$(spack -m location -i a)/bin:$(spack -m location -i b)/bin" spack -m load --sh a diff --git a/share/spack/setup-env.fish b/share/spack/setup-env.fish index 85a453d1c47..d16ee617dfb 100755 --- a/share/spack/setup-env.fish +++ b/share/spack/setup-env.fish @@ -320,6 +320,11 @@ function check_env_activate_flags -d "check spack env subcommand flags for -h, - return 0 end + # looks for a single `--list` + if match_flag $_a "--list" + return 0 + end + end return 1 diff --git a/share/spack/setup-env.sh b/share/spack/setup-env.sh index eb364a38090..5136e8a58a6 100755 --- a/share/spack/setup-env.sh +++ b/share/spack/setup-env.sh @@ -180,6 +180,7 @@ _spack_shell_wrapper() { if [ "${_a#* --sh}" != "$_a" ] || \ [ "${_a#* --csh}" != "$_a" ] || \ [ "${_a#* -h}" != "$_a" ] || \ + [ "${_a#* --list}" != "$_a" ] || \ [ "${_a#* --help}" != "$_a" ]; then # Args contain --sh, --csh, or -h/--help: just execute. diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 90bb79a66a0..e9bf34821f3 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -1215,7 +1215,7 @@ _spack_list() { _spack_load() { if $list_options then - SPACK_COMPREPLY="-h --help --sh --csh --fish --first --only" + SPACK_COMPREPLY="-h --help --sh --csh --fish --first --only --list" else _installed_packages fi