From f3f4bfb10709a64faada93ca2fcc8281f2892343 Mon Sep 17 00:00:00 2001 From: youdie006 Date: Sat, 26 Sep 2026 11:19:43 +0900 Subject: [PATCH 1/2] Drop build metadata when bumping an old-style prerelease next_version("prerelease") drops the build on every path except the old-style one added in #485: 1.2.3-rc.3+build.5 becomes 1.2.3-rc.4, but 1.2.3-rc3+build.5 became 1.2.3-rc4+build.5. Pass build=None there as the token-change branch below it already does. --- src/semver/version.py | 4 +++- tests/test_issue484.py | 6 ++++++ tests/test_parsing.py | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/semver/version.py b/src/semver/version.py index af0cc3f1..75e73be2 100644 --- a/src/semver/version.py +++ b/src/semver/version.py @@ -544,7 +544,9 @@ def next_version(self, part: str, prerelease_token: str = "rc") -> "Version": match = re.match(f"^{prerelease_token}(\\d+)$", version.prerelease) if match: num = int(match.group(1)) - return version.replace(prerelease=f"{prerelease_token}{num + 1}") + return version.replace( + prerelease=f"{prerelease_token}{num + 1}", build=None + ) current_token = version.prerelease.split(".")[0] if current_token != prerelease_token: diff --git a/tests/test_issue484.py b/tests/test_issue484.py index 47d04b44..5b11d68d 100644 --- a/tests/test_issue484.py +++ b/tests/test_issue484.py @@ -31,3 +31,9 @@ def test_issue_484_custom_token(): """Custom prerelease token should be respected.""" v = Version.parse("1.2.3-beta2") assert str(v.next_version("prerelease", "beta")) == "1.2.3-beta3" + + +def test_issue_484_old_style_drops_build(): + """Build metadata is dropped, as it is for dot-separated prereleases.""" + v = Version.parse("1.2.3-rc3+build.5") + assert v.next_version("prerelease").build is None diff --git a/tests/test_parsing.py b/tests/test_parsing.py index e4e78588..7987d7d0 100644 --- a/tests/test_parsing.py +++ b/tests/test_parsing.py @@ -208,6 +208,7 @@ def test_next_version_with_invalid_parts(): # prerelease+build: build is stripped along with prerelease during finalization ("1.2.3-rc.1+build.5", "patch", "1.2.3"), ("1.2.3-rc.1+build.5", "prerelease", "1.2.3-rc.2"), + ("1.2.3-rc1+build.5", "prerelease", "1.2.3-rc2"), ], ) def test_next_version_with_versioninfo(version, part, expected): From ac9d8b4017deb1959558d4f338572320e2c64a0b Mon Sep 17 00:00:00 2001 From: youdie006 Date: Sat, 26 Sep 2026 11:20:10 +0900 Subject: [PATCH 2/2] Add changelog entry for #486 --- changelog.d/pr486.bugfix.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/pr486.bugfix.rst diff --git a/changelog.d/pr486.bugfix.rst b/changelog.d/pr486.bugfix.rst new file mode 100644 index 00000000..e72ec57a --- /dev/null +++ b/changelog.d/pr486.bugfix.rst @@ -0,0 +1 @@ +Fix :meth:`~semver.Version.next_version` to drop the build metadata when incrementing an old-style prerelease without a dot separator (for example ``rc3``). Previously ``1.2.3-rc3+build.5`` became ``1.2.3-rc4+build.5`` while ``1.2.3-rc.3+build.5`` became ``1.2.3-rc.4``.