diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2024-11-13 07:21:16 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-13 08:21:16 -0700 |
commit | 6f948eb847c46a9caea852d3ffffd9cd4575dacc (patch) | |
tree | 58a940ad40ed51fc6ff911af5c4a9edd44dc9570 /lib | |
parent | 93bf0634f35d832b4e77de9893c16a9d564f4365 (diff) | |
download | spack-6f948eb847c46a9caea852d3ffffd9cd4575dacc.tar.gz spack-6f948eb847c46a9caea852d3ffffd9cd4575dacc.tar.bz2 spack-6f948eb847c46a9caea852d3ffffd9cd4575dacc.tar.xz spack-6f948eb847c46a9caea852d3ffffd9cd4575dacc.zip |
`spack spec`: simplify and unify output (#47574)
`spack spec` output has looked like this for a while:
```console
> spack spec /v5fn6xo /wd2p2v7
Input spec
--------------------------------
- /v5fn6xo
Concretized
--------------------------------
[+] openssl@3.3.1%apple-clang@16.0.0~docs+shared build_system=generic certs=mozilla arch=darwin-sequoia-m1
[+] ^ca-certificates-mozilla@2023-05-30%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
...
Input spec
--------------------------------
- /wd2p2v7
Concretized
--------------------------------
[+] py-six@1.16.0%apple-clang@16.0.0 build_system=python_pip arch=darwin-sequoia-m1
[+] ^py-pip@23.1.2%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
```
But the input spec is right there on the CLI, and it doesn't add anything to the output.
Also, since #44843, specs concretized in the CLI line can be unified, so it makes sense
to display them as we did in #44489 -- as one multi-root tree instead of as multiple
single-root trees.
With this PR, concretize output now looks like this:
```console
> spack spec /v5fn6xo /wd2p2v7
[+] openssl@3.3.1%apple-clang@16.0.0~docs+shared build_system=generic certs=mozilla arch=darwin-sequoia-m1
[+] ^ca-certificates-mozilla@2023-05-30%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
[+] ^gmake@4.4.1%apple-clang@16.0.0~guile build_system=generic arch=darwin-sequoia-m1
[+] ^perl@5.40.0%apple-clang@16.0.0+cpanm+opcode+open+shared+threads build_system=generic arch=darwin-sequoia-m1
[+] ^berkeley-db@18.1.40%apple-clang@16.0.0+cxx~docs+stl build_system=autotools patches=26090f4,b231fcc arch=darwin-sequoia-m1
[+] ^bzip2@1.0.8%apple-clang@16.0.0~debug~pic+shared build_system=generic arch=darwin-sequoia-m1
[+] ^diffutils@3.10%apple-clang@16.0.0 build_system=autotools arch=darwin-sequoia-m1
[+] ^libiconv@1.17%apple-clang@16.0.0 build_system=autotools libs=shared,static arch=darwin-sequoia-m1
[+] ^gdbm@1.23%apple-clang@16.0.0 build_system=autotools arch=darwin-sequoia-m1
[+] ^readline@8.2%apple-clang@16.0.0 build_system=autotools patches=bbf97f1 arch=darwin-sequoia-m1
[+] ^ncurses@6.5%apple-clang@16.0.0~symlinks+termlib abi=none build_system=autotools patches=7a351bc arch=darwin-sequoia-m1
[+] ^pkgconf@2.2.0%apple-clang@16.0.0 build_system=autotools arch=darwin-sequoia-m1
[+] ^zlib-ng@2.2.1%apple-clang@16.0.0+compat+new_strategies+opt+pic+shared build_system=autotools arch=darwin-sequoia-m1
[+] ^gnuconfig@2022-09-17%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
[+] py-six@1.16.0%apple-clang@16.0.0 build_system=python_pip arch=darwin-sequoia-m1
[+] ^py-pip@23.1.2%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
[+] ^py-setuptools@69.2.0%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
[-] ^py-wheel@0.41.2%apple-clang@16.0.0 build_system=generic arch=darwin-sequoia-m1
...
```
With no input spec displayed -- just the concretization output shown as one consolidated
tree and multiple roots.
- [x] remove "Input Spec" section and "Concretized" header from `spack spec` output
- [x] print concretized specs as one BFS tree instead of multiple
---------
Signed-off-by: Todd Gamblin <tgamblin@llnl.gov>
Co-authored-by: Harmen Stoppels <harmenstoppels@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/cmd/spec.py | 65 |
1 files changed, 23 insertions, 42 deletions
diff --git a/lib/spack/spack/cmd/spec.py b/lib/spack/spack/cmd/spec.py index 188e536088..d1278a7175 100644 --- a/lib/spack/spack/cmd/spec.py +++ b/lib/spack/spack/cmd/spec.py @@ -82,14 +82,6 @@ def spec(parser, args): if args.namespaces: fmt = "{namespace}." + fmt - tree_kwargs = { - "cover": args.cover, - "format": fmt, - "hashlen": None if args.very_long else 7, - "show_types": args.types, - "status_fn": install_status_fn if args.install_status else None, - } - # use a read transaction if we are getting install status for every # spec in the DAG. This avoids repeatedly querying the DB. tree_context = lang.nullcontext @@ -99,46 +91,35 @@ def spec(parser, args): env = ev.active_environment() if args.specs: - input_specs = spack.cmd.parse_specs(args.specs) - concretized_specs = spack.cmd.parse_specs(args.specs, concretize=True) - specs = list(zip(input_specs, concretized_specs)) + concrete_specs = spack.cmd.parse_specs(args.specs, concretize=True) elif env: env.concretize() - specs = env.concretized_specs() - - if not args.format: - # environments are printed together in a combined tree() invocation, - # except when using --yaml or --json, which we print spec by spec below. - tree_kwargs["key"] = spack.traverse.by_dag_hash - tree_kwargs["hashes"] = args.long or args.very_long - print(spack.spec.tree([concrete for _, concrete in specs], **tree_kwargs)) - return + concrete_specs = env.concrete_roots() else: tty.die("spack spec requires at least one spec or an active environment") - for input, output in specs: - # With --yaml or --json, just print the raw specs to output - if args.format: + # With --yaml, --json, or --format, just print the raw specs to output + if args.format: + for spec in concrete_specs: if args.format == "yaml": # use write because to_yaml already has a newline. - sys.stdout.write(output.to_yaml(hash=ht.dag_hash)) + sys.stdout.write(spec.to_yaml(hash=ht.dag_hash)) elif args.format == "json": - print(output.to_json(hash=ht.dag_hash)) + print(spec.to_json(hash=ht.dag_hash)) else: - print(output.format(args.format)) - continue - - with tree_context(): - # Only show the headers for input specs that are not concrete to avoid - # repeated output. This happens because parse_specs outputs concrete - # specs for `/hash` inputs. - if not input.concrete: - tree_kwargs["hashes"] = False # Always False for input spec - print("Input spec") - print("--------------------------------") - print(input.tree(**tree_kwargs)) - print("Concretized") - print("--------------------------------") - - tree_kwargs["hashes"] = args.long or args.very_long - print(output.tree(**tree_kwargs)) + print(spec.format(args.format)) + return + + with tree_context(): + print( + spack.spec.tree( + concrete_specs, + cover=args.cover, + format=fmt, + hashlen=None if args.very_long else 7, + show_types=args.types, + status_fn=install_status_fn if args.install_status else None, + hashes=args.long or args.very_long, + key=spack.traverse.by_dag_hash, + ) + ) |