diff --git a/lib/spack/spack/cmd/config.py b/lib/spack/spack/cmd/config.py index adfe286c370..ee0bad2baee 100644 --- a/lib/spack/spack/cmd/config.py +++ b/lib/spack/spack/cmd/config.py @@ -304,6 +304,10 @@ def override_cfg_spec(spec_str): item["any_of"] = [override_cfg_spec(x) for x in item["any_of"]] elif "spec" in item: item["spec"] = override_cfg_spec(item["spec"]) + elif isinstance(item, str): + item = override_cfg_spec(item) + else: + raise ValueError(f"Unexpected requirement: ({type(item)}) {str(item)}") new_require.append(item) spack.config.set(path, new_require, scope=scope) diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py index 0908ae3be3a..1d3380b8a6a 100644 --- a/lib/spack/spack/test/cmd/env.py +++ b/lib/spack/spack/test/cmd/env.py @@ -922,10 +922,22 @@ def test_config_change_existing(mutable_mock_env_path, tmp_path, mock_packages, # a spec string that requires enclosing in quotes as # part of the config path config("change", 'packages:libelf:require:"@0.8.12:"') - test_spec = spack.spec.Spec("libelf@0.8.12").concretized() + spack.spec.Spec("libelf@0.8.12").concretized() # No need for assert, if there wasn't a failure, we # changed the requirement successfully. + # Use change to add a requirement for a package that + # has no requirements defined + config("change", "packages:fftw:require:+mpi") + test_spec = spack.spec.Spec("fftw").concretized() + assert test_spec.satisfies("+mpi") + config("change", "packages:fftw:require:~mpi") + test_spec = spack.spec.Spec("fftw").concretized() + assert test_spec.satisfies("~mpi") + config("change", "packages:fftw:require:@1.0") + test_spec = spack.spec.Spec("fftw").concretized() + assert test_spec.satisfies("@1.0~mpi") + # Use "--match-spec" to change one spec in a "one_of" # list config("change", "packages:bowtie:require:@1.2.2", "--match-spec", "@1.2.0")