diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2024-01-04 12:35:42 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-04 12:35:42 -0800 |
commit | 533adaaa6d1ebea3b1e6d634d67e5185cea2fe95 (patch) | |
tree | 958201b6087e16944d17679c99ad14e571dd4608 | |
parent | 3a15f57b45ec35f6d1d672cfc8b95a96a75403cd (diff) | |
download | spack-533adaaa6d1ebea3b1e6d634d67e5185cea2fe95.tar.gz spack-533adaaa6d1ebea3b1e6d634d67e5185cea2fe95.tar.bz2 spack-533adaaa6d1ebea3b1e6d634d67e5185cea2fe95.tar.xz spack-533adaaa6d1ebea3b1e6d634d67e5185cea2fe95.zip |
`spack list`: add `--namesapce` / `--repo` option (#41948)
This adds options to `spack list` that allow you to list only packages from specific
repositories/namespaces, e.g.:
```console
spack list -r builtin
```
only lists packages from the `builtin` repo, while:
```console
spack list -r myrepo -r myrepo2
```
would list packages from `myrepo` and `myrepo2`, but not from `builtin`. Note that you
can use the same argument multiple times.
You can use either `-r` / `--repo` or `-N` / `--namespace`. `-N` is there to match the
corresponding option on `spack find`.
- [x] add `-r` / `--repo` / `-N` / `--namespace` argument
- [x] add test
-rw-r--r-- | lib/spack/spack/cmd/list.py | 16 | ||||
-rw-r--r-- | lib/spack/spack/test/cmd/list.py | 19 | ||||
-rwxr-xr-x | share/spack/spack-completion.bash | 2 | ||||
-rwxr-xr-x | share/spack/spack-completion.fish | 4 |
4 files changed, 38 insertions, 3 deletions
diff --git a/lib/spack/spack/cmd/list.py b/lib/spack/spack/cmd/list.py index 231e33dc51..eb34e38841 100644 --- a/lib/spack/spack/cmd/list.py +++ b/lib/spack/spack/cmd/list.py @@ -41,6 +41,16 @@ def setup_parser(subparser): help="optional case-insensitive glob patterns to filter results", ) subparser.add_argument( + "-r", + "--repo", + "-N", + "--namespace", + dest="repos", + action="append", + default=[], + help="only list packages from the specified repo/namespace", + ) + subparser.add_argument( "-d", "--search-description", action="store_true", @@ -307,7 +317,11 @@ def list(parser, args): formatter = formatters[args.format] # Retrieve the names of all the packages - pkgs = set(spack.repo.all_package_names(args.virtuals)) + repos = [spack.repo.PATH] + if args.repos: + repos = [spack.repo.PATH.get_repo(name) for name in args.repos] + pkgs = set().union(*[set(repo.all_package_names(args.virtuals)) for repo in repos]) + # Filter the set appropriately sorted_packages = filter_by_name(pkgs, args) diff --git a/lib/spack/spack/test/cmd/list.py b/lib/spack/spack/test/cmd/list.py index 848a6d20e4..a46e690cd2 100644 --- a/lib/spack/spack/test/cmd/list.py +++ b/lib/spack/spack/test/cmd/list.py @@ -3,6 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path import sys from textwrap import dedent @@ -134,3 +135,21 @@ def test_list_count(mock_packages): assert int(output.strip()) == len( [name for name in spack.repo.all_package_names() if "py-" in name] ) + + +# def test_list_repos(mock_packages, builder_test_repository): +def test_list_repos(): + with spack.repo.use_repositories( + os.path.join(spack.paths.repos_path, "builtin.mock"), + os.path.join(spack.paths.repos_path, "builder.test"), + ): + total_pkgs = len(list().strip().split()) + + mock_pkgs = len(list("-r", "builtin.mock").strip().split()) + builder_pkgs = len(list("-r", "builder.test").strip().split()) + + assert builder_pkgs == 8 + assert total_pkgs > mock_pkgs > builder_pkgs + + both_repos = len(list("-r", "builtin.mock", "-r", "builder.test").strip().split()) + assert both_repos == total_pkgs diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index 6193982774..1cad9c3da9 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -1320,7 +1320,7 @@ _spack_license_update_copyright_year() { _spack_list() { if $list_options then - SPACK_COMPREPLY="-h --help -d --search-description --format -v --virtuals -t --tag --count --update" + SPACK_COMPREPLY="-h --help -r --repo -N --namespace -d --search-description --format -v --virtuals -t --tag --count --update" else _all_packages fi diff --git a/share/spack/spack-completion.fish b/share/spack/spack-completion.fish index 31aba0aa7d..2cd66977d1 100755 --- a/share/spack/spack-completion.fish +++ b/share/spack/spack-completion.fish @@ -2017,10 +2017,12 @@ complete -c spack -n '__fish_spack_using_command license update-copyright-year' complete -c spack -n '__fish_spack_using_command license update-copyright-year' -s h -l help -d 'show this help message and exit' # spack list -set -g __fish_spack_optspecs_spack_list h/help d/search-description format= v/virtuals t/tag= count update= +set -g __fish_spack_optspecs_spack_list h/help r/repo= d/search-description format= v/virtuals t/tag= count update= complete -c spack -n '__fish_spack_using_command_pos_remainder 0 list' -f -a '(__fish_spack_packages)' complete -c spack -n '__fish_spack_using_command list' -s h -l help -f -a help complete -c spack -n '__fish_spack_using_command list' -s h -l help -d 'show this help message and exit' +complete -c spack -n '__fish_spack_using_command list' -s r -l repo -s N -l namespace -r -f -a repos +complete -c spack -n '__fish_spack_using_command list' -s r -l repo -s N -l namespace -r -d 'only list packages from the specified repo/namespace' complete -c spack -n '__fish_spack_using_command list' -s d -l search-description -f -a search_description complete -c spack -n '__fish_spack_using_command list' -s d -l search-description -d 'filtering will also search the description for a match' complete -c spack -n '__fish_spack_using_command list' -l format -r -f -a 'name_only version_json html' |