From 28dc47e8ecc95a84a8d6314c23a72f4b2636b07c Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Mon, 21 Sep 2026 18:02:58 -0300 Subject: [PATCH] fix: sort release history prereleases semantically --- scripts/sync_release_history.py | 18 +++++++++++++++--- tests/test_sync_release_history.py | 8 +++++--- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/scripts/sync_release_history.py b/scripts/sync_release_history.py index 5072ea1..e71504d 100755 --- a/scripts/sync_release_history.py +++ b/scripts/sync_release_history.py @@ -72,17 +72,29 @@ def release_filename(version: str) -> str: return f"{version}.rst" -def version_key(version: str) -> tuple[int, int, int, int, str]: +def version_key(version: str) -> tuple[int, int, int, int, int, str]: match = VERSION_RE.fullmatch(version) if match is None: raise ValueError(f"unsupported release version: {version}") + prerelease = match.group("pre") + if prerelease is None: + stage_rank = 4 + sequence = 0 + fallback = "" + else: + parts = prerelease.split(".", 1) + stage_rank = {"alpha": 1, "beta": 2, "rc": 3}.get(parts[0].lower(), 0) + sequence = int(parts[1]) if len(parts) == 2 and parts[1].isdigit() else 0 + fallback = prerelease + return ( int(match.group("major")), int(match.group("minor")), int(match.group("patch")), - 1 if prerelease is None else 0, - prerelease or "", + stage_rank, + sequence, + fallback, ) diff --git a/tests/test_sync_release_history.py b/tests/test_sync_release_history.py index 6a384bf..7650cff 100644 --- a/tests/test_sync_release_history.py +++ b/tests/test_sync_release_history.py @@ -71,10 +71,12 @@ def test_synchronization_is_idempotent_and_indexes_major(self) -> None: self.assertIn("AGPL-3.0-or-later", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) def test_versions_sort_semantically(self) -> None: - versions = ["15.9.0", "15.10.0", "15.10.0-rc.1", "15.2.4"] + versions = ["15.9.0", "15.10.0", "15.10.0-rc.2", "15.10.0-rc.10", "15.10.0-beta.12", "15.2.4"] rendered = module.render_major_index(15, versions) - self.assertLess(rendered.index("15.10.0\n"), rendered.index("15.10.0-rc.1\n")) - self.assertLess(rendered.index("15.10.0-rc.1\n"), rendered.index("15.9.0\n")) + self.assertLess(rendered.index("15.10.0\n"), rendered.index("15.10.0-rc.10\n")) + self.assertLess(rendered.index("15.10.0-rc.10\n"), rendered.index("15.10.0-rc.2\n")) + self.assertLess(rendered.index("15.10.0-rc.2\n"), rendered.index("15.10.0-beta.12\n")) + self.assertLess(rendered.index("15.10.0-beta.12\n"), rendered.index("15.9.0\n")) if __name__ == "__main__":