Skip to content

Commit bb48144

Browse files
committed
fix(BaseVersion): support more tag format
1 parent 918cfd6 commit bb48144

File tree

3 files changed

+49
-2
lines changed

3 files changed

+49
-2
lines changed

commitizen/version_schemes.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,56 @@ def bump(
153153
VersionScheme: TypeAlias = type[VersionProtocol]
154154

155155

156+
# See https://github.com/pypa/packaging/blob/14b83e15dbb9caa87c63646ba7808b2b5e460ce6/src/packaging/version.py#L117
157+
# TODO: add more test cases for this pattern
158+
_VERSION_PATTERN = r"""^\s*
159+
v?
160+
(?:
161+
(?:(?P<epoch>[0-9]+)!)? # epoch
162+
(?P<release>[0-9]+(?:\.[0-9]+)*) # release segment
163+
(?P<pre> # pre-release
164+
[-_\.]?
165+
# BEGIN different from packaging.version.py
166+
(?P<pre_l>
167+
(?! # negative lookahead to prevent matching post, rev, r, dev
168+
[-_\.]?
169+
(post|rev|r|dev)
170+
[-_\.]?
171+
([0-9]+)?
172+
$)
173+
[a-z]+? # match any letters to support semver
174+
)
175+
# END different from packaging.version.py
176+
[-_\.]?
177+
(?P<pre_n>[0-9]+)?
178+
)?
179+
(?P<post> # post release
180+
(?:-(?P<post_n1>[0-9]+))
181+
|
182+
(?:
183+
[-_\.]?
184+
(?P<post_l>post|rev|r)
185+
[-_\.]?
186+
(?P<post_n2>[0-9]+)?
187+
)
188+
)?
189+
(?P<dev> # dev release
190+
[-_\.]?
191+
(?P<dev_l>dev)
192+
[-_\.]?
193+
(?P<dev_n>[0-9]+)?
194+
)?
195+
)
196+
(?:\+(?P<local>[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
197+
\s*$"""
198+
199+
156200
class BaseVersion(_BaseVersion):
157201
"""
158202
A base class implementing the `VersionProtocol` for PEP440-like versions.
159203
"""
160204

205+
_regex: re.Pattern = re.compile(_VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
161206
parser: ClassVar[re.Pattern] = _DEFAULT_VERSION_PARSER
162207
"""Regex capturing this version scheme into a `version` group"""
163208

tests/test_version_scheme_semver.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@
6464
(("1.0.0alpha1", None, "alpha", 0, None), "1.0.0-a2"),
6565
(("1", None, "rc", 0, None), "1.0.0-rc0"),
6666
(("1.0.0rc1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"),
67-
(("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"),
67+
(("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0-reallyweird1"),
68+
(("v0.7.1-release", "PATCH", "release", 0, None), "0.7.1-release1"),
69+
(("v0.0.1-SNAPSHOT", "PATCH", "SNAPSHOT", 0, None), "0.0.1-snapshot1"),
6870
]
6971

7072
# test driven development

tests/test_version_scheme_semver2.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
(("1.0.0-alpha.1", None, "alpha", 0, None), "1.0.0-alpha.2"),
6767
(("1", None, "rc", 0, None), "1.0.0-rc.0"),
6868
(("1.0.0-rc.1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"),
69-
(("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"),
69+
(("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0-reallyweird.1"),
7070
]
7171

7272
# test driven development

0 commit comments

Comments
 (0)