Add "spack [cd|location] --source-dir" (#22321)

This commit is contained in:
Harmen Stoppels 2021-03-29 17:31:24 +02:00 committed by GitHub
parent 3d7069e039
commit 8b16728fd9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 74 additions and 50 deletions

View file

@ -47,9 +47,13 @@ def setup_parser(subparser):
directories.add_argument(
'-S', '--stages', action='store_true',
help="top level stage directory")
directories.add_argument(
'--source-dir', action='store_true',
help="source directory for a spec "
"(requires it to be staged first)")
directories.add_argument(
'-b', '--build-dir', action='store_true',
help="checked out or expanded source directory for a spec "
help="build directory for a spec "
"(requires it to be staged first)")
directories.add_argument(
'-e', '--env', action='store',
@ -61,64 +65,78 @@ def setup_parser(subparser):
def location(parser, args):
if args.module_dir:
print(spack.paths.module_path)
return
elif args.spack_root:
if args.spack_root:
print(spack.paths.prefix)
return
elif args.env:
if args.env:
path = spack.environment.root(args.env)
if not os.path.isdir(path):
tty.die("no such environment: '%s'" % args.env)
print(path)
return
elif args.packages:
if args.packages:
print(spack.repo.path.first_repo().root)
return
elif args.stages:
if args.stages:
print(spack.stage.get_stage_root())
return
else:
specs = spack.cmd.parse_specs(args.spec)
if not specs:
tty.die("You must supply a spec.")
if len(specs) != 1:
tty.die("Too many specs. Supply only one.")
specs = spack.cmd.parse_specs(args.spec)
if args.install_dir:
# install_dir command matches against installed specs.
env = ev.get_env(args, 'location')
spec = spack.cmd.disambiguate_spec(specs[0], env)
print(spec.prefix)
if not specs:
tty.die("You must supply a spec.")
else:
spec = specs[0]
if len(specs) != 1:
tty.die("Too many specs. Supply only one.")
if args.package_dir:
# This one just needs the spec name.
print(spack.repo.path.dirname_for_package_name(spec.name))
# install_dir command matches against installed specs.
if args.install_dir:
env = ev.get_env(args, 'location')
spec = spack.cmd.disambiguate_spec(specs[0], env)
print(spec.prefix)
return
else:
spec = spack.cmd.matching_spec_from_env(spec)
pkg = spec.package
spec = specs[0]
if args.stage_dir:
print(pkg.stage.path)
# Package dir just needs the spec name
if args.package_dir:
print(spack.repo.path.dirname_for_package_name(spec.name))
return
else: # args.build_dir is the default.
if not pkg.stage.expanded:
tty.die("Build directory does not exist yet. "
"Run this to create it:",
"spack stage " + " ".join(args.spec))
# Either concretize or filter from already concretized environment
spec = spack.cmd.matching_spec_from_env(spec)
pkg = spec.package
# Out of source builds have build_directory defined
if hasattr(pkg, 'build_directory'):
# build_directory can be either absolute or relative
# to the stage path in either case os.path.join makes it
# absolute
print(os.path.normpath(os.path.join(
pkg.stage.path,
pkg.build_directory
)))
else:
# Otherwise assume in-source builds
return print(pkg.stage.source_path)
if args.stage_dir:
print(pkg.stage.path)
return
if args.build_dir:
# Out of source builds have build_directory defined
if hasattr(pkg, 'build_directory'):
# build_directory can be either absolute or relative to the stage path
# in either case os.path.join makes it absolute
print(os.path.normpath(os.path.join(
pkg.stage.path,
pkg.build_directory
)))
return
# Otherwise assume in-source builds
print(pkg.stage.source_path)
return
# source and build dir remain, they require the spec to be staged
if not pkg.stage.expanded:
tty.die("Source directory does not exist yet. "
"Run this to create it:",
"spack stage " + " ".join(args.spec))
if args.source_dir:
print(pkg.stage.source_path)
return

View file

@ -52,18 +52,24 @@ def test_location_build_dir(mock_spec):
assert location('--build-dir', spec.name).strip() == pkg.stage.source_path
def test_location_build_dir_missing():
"""Tests spack location --build-dir with a missing build directory."""
def test_location_source_dir(mock_spec):
"""Tests spack location --source-dir."""
spec, pkg = mock_spec
assert location('--source-dir', spec.name).strip() == pkg.stage.source_path
def test_location_source_dir_missing():
"""Tests spack location --source-dir with a missing source directory."""
spec = 'mpileaks'
prefix = "==> Error: "
expected = "%sBuild directory does not exist yet. Run this to create it:"\
expected = "%sSource directory does not exist yet. Run this to create it:"\
"%s spack stage %s" % (prefix, os.linesep, spec)
out = location('--build-dir', spec, fail_on_error=False).strip()
out = location('--source-dir', spec, fail_on_error=False).strip()
assert out == expected
@pytest.mark.parametrize('options', [([]),
(['--build-dir', 'mpileaks']),
(['--source-dir', 'mpileaks']),
(['--env', 'missing-env']),
(['spec1', 'spec2'])])
def test_location_cmd_error(options):

View file

@ -453,7 +453,7 @@ _spack_buildcache_update_index() {
_spack_cd() {
if $list_options
then
SPACK_COMPREPLY="-h --help -m --module-dir -r --spack-root -i --install-dir -p --package-dir -P --packages -s --stage-dir -S --stages -b --build-dir -e --env"
SPACK_COMPREPLY="-h --help -m --module-dir -r --spack-root -i --install-dir -p --package-dir -P --packages -s --stage-dir -S --stages --source-dir -b --build-dir -e --env"
else
_all_packages
fi
@ -1089,7 +1089,7 @@ _spack_load() {
_spack_location() {
if $list_options
then
SPACK_COMPREPLY="-h --help -m --module-dir -r --spack-root -i --install-dir -p --package-dir -P --packages -s --stage-dir -S --stages -b --build-dir -e --env"
SPACK_COMPREPLY="-h --help -m --module-dir -r --spack-root -i --install-dir -p --package-dir -P --packages -s --stage-dir -S --stages --source-dir -b --build-dir -e --env"
else
_all_packages
fi