summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorHarmen Stoppels <harmenstoppels@gmail.com>2023-08-14 15:38:06 +0200
committerGitHub <noreply@github.com>2023-08-14 15:38:06 +0200
commitda46b63a3478eac1dd27c622912f60678e3b538b (patch)
tree2dd79592f0a3a7121f0928f8bbe8f6c8e4fb9451 /lib
parentc882214273793c52f2865e068aa0499c610a2f37 (diff)
downloadspack-da46b63a3478eac1dd27c622912f60678e3b538b.tar.gz
spack-da46b63a3478eac1dd27c622912f60678e3b538b.tar.bz2
spack-da46b63a3478eac1dd27c622912f60678e3b538b.tar.xz
spack-da46b63a3478eac1dd27c622912f60678e3b538b.zip
Fix broken semver regex (#39414)
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/test/versions.py23
-rw-r--r--lib/spack/spack/version/git_ref_lookup.py22
2 files changed, 36 insertions, 9 deletions
diff --git a/lib/spack/spack/test/versions.py b/lib/spack/spack/test/versions.py
index 7d329336ae..cc06df546f 100644
--- a/lib/spack/spack/test/versions.py
+++ b/lib/spack/spack/test/versions.py
@@ -26,6 +26,7 @@ from spack.version import (
is_git_version,
ver,
)
+from spack.version.git_ref_lookup import SEMVER_REGEX
def assert_ver_lt(a, b):
@@ -976,3 +977,25 @@ def test_unresolvable_git_versions_error(config, mock_packages):
# The package exists, but does not have a git property set. When dereferencing
# the version, we should get VersionLookupError, not a generic AttributeError.
spack.spec.Spec(f"git-test-commit@{'a' * 40}").version.ref_version
+
+
+@pytest.mark.parametrize(
+ "tag,expected",
+ [
+ ("v100.2.3", "100.2.3"),
+ ("v1.2.3", "1.2.3"),
+ ("v1.2.3-pre.release+build.1", "1.2.3-pre.release+build.1"),
+ ("v1.2.3+build.1", "1.2.3+build.1"),
+ ("v1.2.3+build_1", None),
+ ("v1.2.3-pre.release", "1.2.3-pre.release"),
+ ("v1.2.3-pre_release", None),
+ ("1.2.3", "1.2.3"),
+ ("1.2.3.", None),
+ ],
+)
+def test_semver_regex(tag, expected):
+ result = SEMVER_REGEX.search(tag)
+ if expected is None:
+ assert result is None
+ else:
+ assert result.group() == expected
diff --git a/lib/spack/spack/version/git_ref_lookup.py b/lib/spack/spack/version/git_ref_lookup.py
index e239f87024..771b4caabf 100644
--- a/lib/spack/spack/version/git_ref_lookup.py
+++ b/lib/spack/spack/version/git_ref_lookup.py
@@ -22,11 +22,16 @@ from .common import VersionLookupError
from .lookup import AbstractRefLookup
# regular expression for semantic versioning
-SEMVER_REGEX = re.compile(
- ".+(?P<semver>([0-9]+)[.]([0-9]+)[.]([0-9]+)"
- "(?:-([0-9A-Za-z-]+(?:[.][0-9A-Za-z-]+)*))?"
- "(?:[+][0-9A-Za-z-]+)?)"
-)
+_VERSION_CORE = r"\d+\.\d+\.\d+"
+_IDENT = r"[0-9A-Za-z-]+"
+_SEPARATED_IDENT = rf"{_IDENT}(?:\.{_IDENT})*"
+_PRERELEASE = rf"\-{_SEPARATED_IDENT}"
+_BUILD = rf"\+{_SEPARATED_IDENT}"
+_SEMVER = rf"{_VERSION_CORE}(?:{_PRERELEASE})?(?:{_BUILD})?"
+
+# clamp on the end, so versions like v1.2.3-rc1 will match
+# without the leading 'v'.
+SEMVER_REGEX = re.compile(rf"{_SEMVER}$")
class GitRefLookup(AbstractRefLookup):
@@ -186,11 +191,10 @@ class GitRefLookup(AbstractRefLookup):
commit_to_version[tag_commit] = v
break
else:
- # try to parse tag to copare versions spack does not know
- match = SEMVER_REGEX.match(tag)
+ # try to parse tag to compare versions spack does not know
+ match = SEMVER_REGEX.search(tag)
if match:
- semver = match.groupdict()["semver"]
- commit_to_version[tag_commit] = semver
+ commit_to_version[tag_commit] = match.group()
ancestor_commits = []
for tag_commit in commit_to_version: