summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Ficarelli <federico.ficarelli@gmail.com>2018-01-26 08:33:53 +0100
committerMassimiliano Culpo <massimiliano.culpo@gmail.com>2018-01-26 08:33:53 +0100
commit1f39afe475c488066061526598df39f8f275e73e (patch)
tree758fa5764aac8af07620a257b84377034385ee2a
parent8bc5916b684d6d9a45961f935ce19d2e1e0c2a87 (diff)
downloadspack-1f39afe475c488066061526598df39f8f275e73e.tar.gz
spack-1f39afe475c488066061526598df39f8f275e73e.tar.bz2
spack-1f39afe475c488066061526598df39f8f275e73e.tar.xz
spack-1f39afe475c488066061526598df39f8f275e73e.zip
Enable install of multiple specs from yaml files (#6984)
-rw-r--r--lib/spack/spack/cmd/install.py34
-rw-r--r--lib/spack/spack/test/cmd/install.py39
2 files changed, 52 insertions, 21 deletions
diff --git a/lib/spack/spack/cmd/install.py b/lib/spack/spack/cmd/install.py
index e4fd74f6b5..12a33a0370 100644
--- a/lib/spack/spack/cmd/install.py
+++ b/lib/spack/spack/cmd/install.py
@@ -92,7 +92,8 @@ the dependencies"""
'--fake', action='store_true',
help="fake install for debug purposes.")
subparser.add_argument(
- '-f', '--file', action='store_true',
+ '-f', '--file', action='append', default=[],
+ dest='specfiles', metavar='SPEC_YAML_FILE',
help="install from file. Read specs to install from .yaml files")
cd_group = subparser.add_mutually_exclusive_group()
@@ -377,8 +378,8 @@ def install_spec(cli_args, kwargs, spec):
def install(parser, args, **kwargs):
- if not args.package:
- tty.die("install requires at least one package argument")
+ if not args.package and not args.specfiles:
+ tty.die("install requires at least one package argument or yaml file")
if args.jobs is not None:
if args.jobs <= 0:
@@ -405,6 +406,7 @@ def install(parser, args, **kwargs):
if args.run_tests:
tty.warn("Deprecated option: --run-tests: use --test=all instead")
+ # 1. Abstract specs from cli
specs = spack.cmd.parse_specs(args.package)
if args.test == 'all' or args.run_tests:
spack.package_testing.test_all()
@@ -412,23 +414,21 @@ def install(parser, args, **kwargs):
for spec in specs:
spack.package_testing.test(spec.name)
- # Spec from cli
- specs = []
- if args.file:
- for file in args.package:
- with open(file, 'r') as f:
- s = spack.spec.Spec.from_yaml(f)
+ specs = spack.cmd.parse_specs(args.package, concretize=True)
- if s.concretized().dag_hash() != s.dag_hash():
- msg = 'skipped invalid file "{0}". '
- msg += 'The file does not contain a concrete spec.'
- tty.warn(msg.format(file))
- continue
+ # 2. Concrete specs from yaml files
+ for file in args.specfiles:
+ with open(file, 'r') as f:
+ s = spack.spec.Spec.from_yaml(f)
- specs.append(s.concretized())
+ if s.concretized().dag_hash() != s.dag_hash():
+ msg = 'skipped invalid file "{0}". '
+ msg += 'The file does not contain a concrete spec.'
+ tty.warn(msg.format(file))
+ continue
+
+ specs.append(s.concretized())
- else:
- specs = spack.cmd.parse_specs(args.package, concretize=True)
if len(specs) == 0:
tty.die('The `spack install` command requires a spec to install.')
diff --git a/lib/spack/spack/test/cmd/install.py b/lib/spack/spack/test/cmd/install.py
index 8e5502049d..384a9ec3d0 100644
--- a/lib/spack/spack/test/cmd/install.py
+++ b/lib/spack/spack/test/cmd/install.py
@@ -259,10 +259,41 @@ def test_install_from_file(spec, concretize, error_code, tmpdir):
if concretize:
spec.concretize()
- with fs.working_dir(str(tmpdir)):
+ specfile = tmpdir.join('spec.yaml')
+
+ with specfile.open('w') as f:
+ spec.to_yaml(f)
+
+ # Relative path to specfile (regression for #6906)
+ with fs.working_dir(specfile.dirname):
# A non-concrete spec will fail to be installed
- with open('spec.yaml', 'w') as f:
- spec.to_yaml(f)
- install('-f', 'spec.yaml', fail_on_error=False)
+ install('-f', specfile.basename, fail_on_error=False)
+ assert install.returncode == error_code
+ # Absolute path to specfile (regression for #6983)
+ install('-f', str(specfile), fail_on_error=False)
assert install.returncode == error_code
+
+
+@pytest.mark.usefixtures('noop_install', 'config')
+@pytest.mark.parametrize('clispecs,filespecs', [
+ [[], ['mpi']],
+ [[], ['mpi', 'boost']],
+ [['cmake'], ['mpi']],
+ [['cmake', 'libelf'], []],
+ [['cmake', 'libelf'], ['mpi', 'boost']],
+])
+def test_install_mix_cli_and_files(clispecs, filespecs, tmpdir):
+
+ args = clispecs
+
+ for spec in filespecs:
+ filepath = tmpdir.join(spec + '.yaml')
+ args = ['-f', str(filepath)] + args
+ s = Spec(spec)
+ s.concretize()
+ with filepath.open('w') as f:
+ s.to_yaml(f)
+
+ install(*args, fail_on_error=False)
+ assert install.returncode == 0