Skip to content

Commit 64e8430

Browse files
author
Signal Linden
authored
Merge pull request #48 from secondlife/signal/scm-wo-semver
Better support non-semver SCM versions
2 parents f43ca67 + a1407c7 commit 64e8430

4 files changed

Lines changed: 27 additions & 8 deletions

File tree

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
repos:
22
- repo: https://github.com/pre-commit/pre-commit-hooks
3-
rev: v4.3.0
3+
rev: v4.6.0
44
hooks:
55
- id: check-ast
66
- id: check-yaml
77
- id: mixed-line-ending
88
- id: trailing-whitespace
99
- repo: https://github.com/pycqa/isort
10-
rev: 5.10.1
10+
rev: 5.13.2
1111
hooks:
1212
- id: isort
1313
args: [--line-length=120]

autobuild/scm/git.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class GitMeta(NamedTuple):
5454
dirty: bool
5555
distance: int
5656
commit: str # Short commit hash
57-
version: Semver
57+
version: Semver | str
5858

5959

6060
def _find_repo_dir(start: Path, level: int = 0) -> Path | None:
@@ -87,7 +87,7 @@ def _parse_describe(describe: str) -> GitMeta:
8787
dirty=dirty,
8888
distance=int(distance),
8989
commit=commit[1:], # omit "g" prefix
90-
version=Semver.parse(raw_tag),
90+
version=Semver.parse(raw_tag) or raw_tag.lstrip("v"),
9191
)
9292

9393

@@ -131,12 +131,15 @@ def version(self) -> str | None:
131131
return None
132132
meta = _parse_describe(self.describe())
133133

134+
# If the tag is not a valid semver, then use the raw tag as the next version.
135+
next_version = meta.version.next if isinstance(meta.version, Semver) else meta.version
136+
134137
if meta.dirty:
135138
# dirty + distance or no distance
136-
return f"{meta.version.next}-dev{meta.distance}.g{meta.commit}.d{date()}"
139+
return f"{next_version}-dev{meta.distance}.g{meta.commit}.d{date()}"
137140
elif meta.distance:
138141
# clean + distance
139-
return f"{meta.version.next}-dev{meta.distance}.g{meta.commit}"
142+
return f"{next_version}-dev{meta.distance}.g{meta.commit}"
140143
else:
141144
# clean + no distance
142145
return str(meta.version)

tests/basetest.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ def envvar(key: str, val: str | None):
262262

263263

264264
@contextmanager
265-
def git_repo():
265+
def git_repo(initial_tag="v1.0.0"):
266266
"""
267267
Initialize a new git repository in a temporary directory, yield its path, clean after context exit.
268268
@@ -290,7 +290,7 @@ def git_repo():
290290
cmd("git", "remote", "add", "origin", "https://example.com/foo.git")
291291
cmd("git", "add", "-A")
292292
cmd("git", "commit", "-m", "Initial")
293-
cmd("git", "tag", "v1.0.0")
293+
cmd("git", "tag", initial_tag)
294294
yield root
295295
finally:
296296
# Make sure to chdir out of temp_dir before closing it, otherwise windows

tests/test_scm_git.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,22 @@
99
from tests.basetest import chdir, git_repo, needs_git
1010

1111

12+
@needs_git
13+
class InvalidSemverTests(TestCase):
14+
def test_invalid_semver(self):
15+
with git_repo("v1.1.1q") as repo:
16+
version = get_version(repo)
17+
self.assertEqual(version, "1.1.1q")
18+
19+
def test_dirty_invalid_semver(self):
20+
with git_repo("v1.1.1q") as repo:
21+
with open(os.path.join(repo, "file"), "w") as f:
22+
f.write("+1")
23+
cmd("git", "add", "file")
24+
version = get_version(repo)
25+
self.assertRegex(version, fr"^1\.1\.1q\-dev0\.g[a-z0-9]{{7}}.d{date()}$")
26+
27+
1228
@needs_git
1329
class GitTests(TestCase):
1430
repo: str

0 commit comments

Comments
 (0)