Skip to content

Commit 5d34df7

Browse files
Merge pull request #1349 from RonnyPfannschmidt/fix/version-schemes
fix: correct semver scheme handling of .dev0 tags and exact pre-releases
2 parents 3054efe + c1d32a9 commit 5d34df7

3 files changed

Lines changed: 43 additions & 7 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
The ``semver-pep440`` and ``semver-pep440-release-branch`` version schemes now
2+
correctly handle ``.dev0`` tags and pre-release tags. Exact checkout on a tag
3+
returns the tag as-is (``2.0.dev0`` stays ``2.0.dev0``, ``1.0.0rc1`` stays
4+
``1.0.0rc1``). Non-exact ``.dev0`` tags are treated as explicit version anchors,
5+
producing ``X.Y.0.devN`` instead of incorrectly bumping past the anchored version.

vcs-versioning/src/vcs_versioning/_version_schemes/_standard.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ def guess_next_dev_version(version: ScmVersion) -> str:
4444
def guess_next_simple_semver(
4545
version: ScmVersion, retain: int, increment: bool = True
4646
) -> str:
47+
if increment and getattr(version.tag, "dev", None) == 0:
48+
parts = list(version.tag.release)
49+
while len(parts) < SEMVER_LEN:
50+
parts.append(0)
51+
return ".".join(str(i) for i in parts)
4752
parts = list(version.tag.release[:retain])
4853
while len(parts) < retain:
4954
parts.append(0)
@@ -56,15 +61,12 @@ def guess_next_simple_semver(
5661

5762
def simplified_semver_version(version: ScmVersion) -> str:
5863
if version.exact:
59-
return guess_next_simple_semver(version, retain=SEMVER_LEN, increment=False)
60-
elif version.branch is not None and "feature" in version.branch:
64+
return version.format_with("{tag}")
65+
if version.branch is not None and "feature" in version.branch:
6166
return version.format_next_version(
6267
guess_next_simple_semver, retain=SEMVER_MINOR
6368
)
64-
else:
65-
return version.format_next_version(
66-
guess_next_simple_semver, retain=SEMVER_PATCH
67-
)
69+
return version.format_next_version(guess_next_simple_semver, retain=SEMVER_PATCH)
6870

6971

7072
def release_branch_semver_version(version: ScmVersion) -> str:

vcs-versioning/testing_vcs/test_version.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@
2727
("version", "expected_next"),
2828
[
2929
pytest.param(meta("1.0.0", config=c), "1.0.0", id="exact"),
30-
pytest.param(meta("1.0", config=c), "1.0.0", id="short_tag"),
30+
pytest.param(meta("1.0", config=c), "1.0", id="short_tag"),
31+
pytest.param(meta("1.0.0rc1", config=c), "1.0.0rc1", id="exact_rc"),
32+
pytest.param(meta("2.0.dev0", config=c), "2.0.dev0", id="exact_dev0"),
3133
pytest.param(
3234
meta("1.0.0", distance=2, branch="default", config=c),
3335
"1.0.1.dev2",
@@ -58,6 +60,21 @@
5860
"1.0.1.dev2",
5961
id="non-normalized-allowed",
6062
),
63+
pytest.param(
64+
meta("2.0.dev0", distance=5, branch="default", config=c),
65+
"2.0.0.dev5",
66+
id="dev0_anchor_default_branch",
67+
),
68+
pytest.param(
69+
meta("2.0.dev0", distance=5, branch="feature/fun", config=c),
70+
"2.0.0.dev5",
71+
id="dev0_anchor_feature_branch",
72+
),
73+
pytest.param(
74+
meta("3.0.dev0", distance=1, branch="default", config=c),
75+
"3.0.0.dev1",
76+
id="dev0_anchor_single_commit",
77+
),
6178
],
6279
)
6380
def test_next_semver(version: ScmVersion, expected_next: str) -> None:
@@ -69,6 +86,8 @@ def test_next_semver(version: ScmVersion, expected_next: str) -> None:
6986
("version", "expected_next"),
7087
[
7188
pytest.param(meta("1.0.0", config=c), "1.0.0", id="exact"),
89+
pytest.param(meta("2.0.dev0", config=c), "2.0.dev0", id="exact_dev0"),
90+
pytest.param(meta("1.0.0rc1", config=c), "1.0.0rc1", id="exact_rc"),
7291
pytest.param(
7392
meta("1.0.0", distance=2, branch="master", config=c),
7493
"1.1.0.dev2",
@@ -99,6 +118,16 @@ def test_next_semver(version: ScmVersion, expected_next: str) -> None:
99118
"1.1.0.dev2",
100119
id="false_positive_release_branch",
101120
),
121+
pytest.param(
122+
meta("2.0.dev0", distance=5, branch="master", config=c),
123+
"2.0.0.dev5",
124+
id="dev0_anchor_development_branch",
125+
),
126+
pytest.param(
127+
meta("2.0.dev0", distance=5, branch="release-2.0", config=c),
128+
"2.0.dev5",
129+
id="dev0_anchor_release_branch",
130+
),
102131
],
103132
)
104133
def test_next_release_branch_semver(version: ScmVersion, expected_next: str) -> None:

0 commit comments

Comments
 (0)