From 88540f8a43e48d2e0d468be3932d8ef93c97d022 Mon Sep 17 00:00:00 2001 From: Wei Lee Date: Wed, 24 Apr 2024 09:54:45 +0800 Subject: [PATCH 1/2] test(version_scheme): add test case "1.0.0-reallyweird" to semver --- tests/test_version_scheme_semver.py | 1 + tests/test_version_scheme_semver2.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/tests/test_version_scheme_semver.py b/tests/test_version_scheme_semver.py index 8785717a34..3e96f3711c 100644 --- a/tests/test_version_scheme_semver.py +++ b/tests/test_version_scheme_semver.py @@ -64,6 +64,7 @@ (("1.0.0alpha1", None, "alpha", 0, None), "1.0.0-a2"), (("1", None, "rc", 0, None), "1.0.0-rc0"), (("1.0.0rc1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"), + (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"), ] # test driven development diff --git a/tests/test_version_scheme_semver2.py b/tests/test_version_scheme_semver2.py index d18a058a7c..4ec42bc861 100644 --- a/tests/test_version_scheme_semver2.py +++ b/tests/test_version_scheme_semver2.py @@ -5,6 +5,8 @@ from commitizen.version_schemes import SemVer2, VersionProtocol +# current_version, increment, prerelease, prerelease_offset, devrelease + simple_flow = [ (("0.1.0", "PATCH", None, 0, None), "0.1.1"), (("0.1.0", "PATCH", None, 0, 1), "0.1.1-dev.1"), @@ -64,6 +66,7 @@ (("1.0.0-alpha.1", None, "alpha", 0, None), "1.0.0-alpha.2"), (("1", None, "rc", 0, None), "1.0.0-rc.0"), (("1.0.0-rc.1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"), + (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"), ] # test driven development From da46193ec2d40ce53b156fd9c5c22a0b7ccde00b Mon Sep 17 00:00:00 2001 From: Yu-Ting Hsiung Date: Fri, 13 Jun 2025 02:54:26 +0800 Subject: [PATCH 2/2] fix(BaseVersion): support more tag format --- commitizen/version_schemes.py | 43 ++++++++++++++++++++++++++++ tests/test_version_scheme_semver.py | 4 ++- tests/test_version_scheme_semver2.py | 2 +- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/commitizen/version_schemes.py b/commitizen/version_schemes.py index e9f99c5514..b05c9fec26 100644 --- a/commitizen/version_schemes.py +++ b/commitizen/version_schemes.py @@ -153,11 +153,54 @@ def bump( VersionScheme: TypeAlias = type[VersionProtocol] +# See https://github.com/pypa/packaging/blob/14b83e15dbb9caa87c63646ba7808b2b5e460ce6/src/packaging/version.py#L117 +# TODO: add more test cases for this pattern +_VERSION_PATTERN = r"""^\s* + v? + (?: + (?:(?P[0-9]+)!)? # epoch + (?P[0-9]+(?:\.[0-9]+)*) # release segment + (?P
                                          # pre-release
+            [-_\.]?
+            (?P
+                (?!                                       # negative lookahead to prevent matching post, rev, r, dev
+                    [-_\.]?
+                    (post|rev|r|dev)
+                    [-_\.]?
+                    ([0-9]+)?
+                $)
+                [a-z]+?                                   # match any letters to support semver
+            )
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+        (?P                                         # post release
+            (?:-(?P[0-9]+))
+            |
+            (?:
+                [-_\.]?
+                (?Ppost|rev|r)
+                [-_\.]?
+                (?P[0-9]+)?
+            )
+        )?
+        (?P                                          # dev release
+            [-_\.]?
+            (?Pdev)
+            [-_\.]?
+            (?P[0-9]+)?
+        )?
+    )
+    (?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))?       # local version
+\s*$"""
+
+
 class BaseVersion(_BaseVersion):
     """
     A base class implementing the `VersionProtocol` for PEP440-like versions.
     """
 
+    _regex: re.Pattern = re.compile(_VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
     parser: ClassVar[re.Pattern] = _DEFAULT_VERSION_PARSER
     """Regex capturing this version scheme into a `version` group"""
 
diff --git a/tests/test_version_scheme_semver.py b/tests/test_version_scheme_semver.py
index 3e96f3711c..836d4cdf85 100644
--- a/tests/test_version_scheme_semver.py
+++ b/tests/test_version_scheme_semver.py
@@ -64,7 +64,9 @@
     (("1.0.0alpha1", None, "alpha", 0, None), "1.0.0-a2"),
     (("1", None, "rc", 0, None), "1.0.0-rc0"),
     (("1.0.0rc1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"),
-    (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"),
+    (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0-reallyweird1"),
+    (("v0.7.1-release", "PATCH", "release", 0, None), "0.7.1-release1"),
+    (("v0.0.1-SNAPSHOT", "PATCH", "SNAPSHOT", 0, None), "0.0.1-snapshot1"),
 ]
 
 # test driven development
diff --git a/tests/test_version_scheme_semver2.py b/tests/test_version_scheme_semver2.py
index 4ec42bc861..632c4db454 100644
--- a/tests/test_version_scheme_semver2.py
+++ b/tests/test_version_scheme_semver2.py
@@ -66,7 +66,7 @@
     (("1.0.0-alpha.1", None, "alpha", 0, None), "1.0.0-alpha.2"),
     (("1", None, "rc", 0, None), "1.0.0-rc.0"),
     (("1.0.0-rc.1+e20d7b57f3eb", "PATCH", None, 0, None), "1.0.0"),
-    (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0"),
+    (("1.0.0-reallyweird", "PATCH", "reallyweird", 0, None), "1.0.0-reallyweird.1"),
 ]
 
 # test driven development