summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarmen Stoppels <me@harmenstoppels.nl>2024-01-03 17:44:59 +0100
committerGitHub <noreply@github.com>2024-01-03 17:44:59 +0100
commit3e3cd641506fb392edd3ddc500dc8b83f759594a (patch)
tree38796fe43f3fb51cb5cc550782a12e437d323e1e
parent375bc6fc9443082fd28e4bbcad44d1f627a452eb (diff)
downloadspack-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.py14
-rw-r--r--lib/spack/spack/test/spec_semantics.py6
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}")