summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/version.py18
1 files changed, 14 insertions, 4 deletions
diff --git a/lib/spack/spack/version.py b/lib/spack/spack/version.py
index 9108b1feb5..d3dd01c3a5 100644
--- a/lib/spack/spack/version.py
+++ b/lib/spack/spack/version.py
@@ -48,7 +48,7 @@ __all__ = ['Version', 'VersionRange', 'VersionList', 'ver']
VALID_VERSION = re.compile(r'^[A-Za-z0-9_.-]+$')
# regex for a commit version
-COMMIT_VERSION = re.compile(r'^[a-z0-9]{40}$')
+COMMIT_VERSION = re.compile(r'^[a-f0-9]{40}$')
# regex for version segments
SEGMENT_REGEX = re.compile(r'(?:(?P<num>[0-9]+)|(?P<str>[a-zA-Z]+))(?P<sep>[_.-]*)')
@@ -167,7 +167,14 @@ class VersionStrComponent(object):
class Version(object):
"""Class to represent versions"""
- __slots__ = ['version', 'separators', 'string', 'is_commit', 'commit_lookup']
+ __slots__ = [
+ "version",
+ "separators",
+ "string",
+ "commit_lookup",
+ "is_commit",
+ "commit_version",
+ ]
def __init__(self, string):
if not isinstance(string, str):
@@ -182,7 +189,7 @@ class Version(object):
# An object that can lookup git commits to compare them to versions
self.commit_lookup = None
-
+ self.commit_version = None
segments = SEGMENT_REGEX.findall(string)
self.version = tuple(
int(m[0]) if m[0] else VersionStrComponent(m[1]) for m in segments
@@ -195,6 +202,8 @@ class Version(object):
commit_lookup = self.commit_lookup or other_lookups
if self.is_commit and commit_lookup:
+ if self.commit_version is not None:
+ return self.commit_version
commit_info = commit_lookup.get(self.string)
if commit_info:
prev_version, distance = commit_info
@@ -203,7 +212,8 @@ class Version(object):
# If commit is exactly a known version, no distance suffix
prev_tuple = Version(prev_version).version if prev_version else ()
dist_suffix = (VersionStrComponent(''), distance) if distance else ()
- return prev_tuple + dist_suffix
+ self.commit_version = prev_tuple + dist_suffix
+ return self.commit_version
return self.version