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
This commit is contained in:
Todd Gamblin
2024-01-04 12:35:42 -08:00
committed by GitHub
parent 3a15f57b45
commit 533adaaa6d
4 changed files with 38 additions and 3 deletions

View File

@@ -40,6 +40,16 @@ def setup_parser(subparser):
nargs=argparse.REMAINDER,
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",
@@ -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)

View File

@@ -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