diff options
author | Todd Gamblin <gamblin2@llnl.gov> | 2021-11-05 00:58:29 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-05 00:58:29 -0700 |
commit | e13e697067d004107655bc206ac18e9191abf26c (patch) | |
tree | 724b5376f128221c6482688d9ae5939185d361b4 /lib | |
parent | bfbf9deb749687b3bc4700f11ee6faeb41615403 (diff) | |
download | spack-e13e697067d004107655bc206ac18e9191abf26c.tar.gz spack-e13e697067d004107655bc206ac18e9191abf26c.tar.bz2 spack-e13e697067d004107655bc206ac18e9191abf26c.tar.xz spack-e13e697067d004107655bc206ac18e9191abf26c.zip |
commands: `spack load --list` alias for `spack find --loaded` (#27184)
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.
- add help to `spack load --list` that references `spack find`
- factor some parts of `spack find` out to be called from `spack load`
- add shell tests
- update docs
Co-authored-by: Peter Josef Scheibel <scheibel1@llnl.gov>
Co-authored-by: Richarda Butler <39577672+RikkiButler20@users.noreply.github.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/docs/basic_usage.rst | 3 | ||||
-rw-r--r-- | lib/spack/spack/cmd/__init__.py | 23 | ||||
-rw-r--r-- | lib/spack/spack/cmd/find.py | 11 | ||||
-rw-r--r-- | lib/spack/spack/cmd/load.py | 23 |
4 files changed, 50 insertions, 10 deletions
diff --git a/lib/spack/docs/basic_usage.rst b/lib/spack/docs/basic_usage.rst index 091b18f6b8..165058e1d1 100644 --- a/lib/spack/docs/basic_usage.rst +++ b/lib/spack/docs/basic_usage.rst @@ -952,6 +952,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/__init__.py b/lib/spack/spack/cmd/__init__.py index e5dbcd0b27..0b0451c6f3 100644 --- a/lib/spack/spack/cmd/__init__.py +++ b/lib/spack/spack/cmd/__init__.py @@ -27,6 +27,7 @@ import spack.extensions import spack.paths import spack.spec import spack.store +import spack.user_environment as uenv import spack.util.spack_json as sjson import spack.util.string @@ -442,6 +443,28 @@ def display_specs(specs, args=None, **kwargs): output.flush() +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=""): + """Given a list of specs, this will print a message about how many + specs are in that list. + + Args: + specs (list): depending on how many items are in this list, choose + the plural or singular form of the word "package" + pkg_type (str): the output string will mention this provided + category, e.g. if pkg_type is "installed" then the message + would be "3 installed packages" + """ + tty.msg("%s" % spack.util.string.plural( + len(specs), pkg_type + " package")) + + def spack_is_git_repo(): """Ensure that this instance of Spack is a git clone.""" return is_git_repo(spack.paths.prefix) diff --git a/lib/spack/spack/cmd/find.py b/lib/spack/spack/cmd/find.py index 8378f6ef6e..cc06454817 100644 --- a/lib/spack/spack/cmd/find.py +++ b/lib/spack/spack/cmd/find.py @@ -6,7 +6,6 @@ from __future__ import print_function import copy -import os import sys import llnl.util.lang @@ -18,9 +17,7 @@ import spack.cmd as cmd import spack.cmd.common.arguments as arguments import spack.environment as ev import spack.repo -import spack.user_environment as uenv from spack.database import InstallStatuses -from spack.util.string import plural description = "list and search installed packages" section = "basic" @@ -241,8 +238,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 = spack.cmd.filter_loaded_specs(results) # Display the result if args.json: @@ -251,7 +247,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" + spack.cmd.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 ab8f88c7f5..172a35a02b 100644 --- a/lib/spack/spack/cmd/load.py +++ b/lib/spack/spack/cmd/load.py @@ -7,6 +7,7 @@ import sys 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 @@ level = "short" 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 @@ alternatively one can decide to load only the package or only 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.filter_loaded_specs(args.specs()) + if sys.stdout.isatty(): + spack.cmd.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, |