diff options
author | Harmen Stoppels <me@harmenstoppels.nl> | 2024-01-03 17:44:59 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-03 17:44:59 +0100 |
commit | 3e3cd641506fb392edd3ddc500dc8b83f759594a (patch) | |
tree | 38796fe43f3fb51cb5cc550782a12e437d323e1e | |
parent | 375bc6fc9443082fd28e4bbcad44d1f627a452eb (diff) | |
download | spack-3e3cd641506fb392edd3ddc500dc8b83f759594a.tar.gz spack-3e3cd641506fb392edd3ddc500dc8b83f759594a.tar.bz2 spack-3e3cd641506fb392edd3ddc500dc8b83f759594a.tar.xz spack-3e3cd641506fb392edd3ddc500dc8b83f759594a.zip |
Spec.format: error on old style format strings (#41934)
-rw-r--r-- | lib/spack/spack/spec.py | 14 | ||||
-rw-r--r-- | lib/spack/spack/test/spec_semantics.py | 6 |
2 files changed, 20 insertions, 0 deletions
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index f37d993993..9140a3532a 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -213,6 +213,19 @@ def colorize_spec(spec): return clr.colorize(re.sub(_SEPARATORS, insert_color(), str(spec)) + "@.") +OLD_STYLE_FMT_RE = re.compile(r"\${[A-Z]+}") + + +def ensure_modern_format_string(fmt: str) -> None: + """Ensure that the format string does not contain old ${...} syntax.""" + result = OLD_STYLE_FMT_RE.search(fmt) + if result: + raise SpecFormatStringError( + f"Format string `{fmt}` contains old syntax `{result.group(0)}`. " + "This is no longer supported." + ) + + @lang.lazy_lexicographic_ordering class ArchSpec: """Aggregate the target platform, the operating system and the target microarchitecture.""" @@ -4362,6 +4375,7 @@ class Spec: that accepts a string and returns another one """ + ensure_modern_format_string(format_string) color = kwargs.get("color", False) transform = kwargs.get("transform", {}) diff --git a/lib/spack/spack/test/spec_semantics.py b/lib/spack/spack/test/spec_semantics.py index 7964ed3184..d159bf744a 100644 --- a/lib/spack/spack/test/spec_semantics.py +++ b/lib/spack/spack/test/spec_semantics.py @@ -1528,3 +1528,9 @@ def test_edge_equality_does_not_depend_on_virtual_order(): assert edge1 == edge2 assert tuple(sorted(edge1.virtuals)) == edge1.virtuals assert tuple(sorted(edge2.virtuals)) == edge1.virtuals + + +def test_old_format_strings_trigger_error(default_mock_concretization): + s = Spec("a").concretized() + with pytest.raises(SpecFormatStringError): + s.format("${PACKAGE}-${VERSION}-${HASH}") |