\\d+)
+ ((?Pa|b|rc)(?P\\d+))?
+"""
regex = false
replace = "{new_version}"
search = "{current_version}"
-serialize = ["{major}.{minor}.{patch}"]
+serialize = [
+ "{major}.{minor}.{patch}{pre}{pre_n}",
+ "{major}.{minor}.{patch}",
+]
sign_tags = false
tag = false
tag_message = "chore(release): v{new_version}"
tag_name = "v{new_version}"
+[tool.bumpversion.parts.pre]
+optional_value = "stable"
+first_value = "stable"
+values = ["a", "b", "rc", "stable"]
+
+[tool.bumpversion.parts.pre_n]
+first_value = "1"
+
[[tool.bumpversion.files]]
filename = "pyproject.toml"
replace = 'version = "{new_version}"'
diff --git a/tools/prepare_release.py b/tools/prepare_release.py
index 9fdbf85de..4b2393b64 100644
--- a/tools/prepare_release.py
+++ b/tools/prepare_release.py
@@ -218,6 +218,7 @@ async def get_release_info(self) -> ReleaseInfo:
)
async def create_draft_release(self, body: str, release_branch: str) -> str:
+ is_prerelease = bool(re.search(r"(a|b|rc)\d+$", self._new_release_version))
res = await self._api_client.post(
"/releases",
json={
@@ -225,6 +226,7 @@ async def create_draft_release(self, body: str, release_branch: str) -> str:
"target_commitish": release_branch,
"name": self._new_release_tag,
"draft": True,
+ "prerelease": is_prerelease,
"body": body,
},
)
@@ -380,7 +382,7 @@ def update_pyproject_version(new_version: str) -> None:
# can't use tomli-w / tomllib for this as is messes up the formatting
pyproject = pathlib.Path("pyproject.toml")
content = pyproject.read_text()
- content = re.sub(r'(\nversion ?= ?")\d+\.\d+\.\d+("\s*\n)', rf"\g<1>{new_version}\g<2>", content)
+ content = re.sub(r'(\nversion ?= ?")\d+\.\d+\.\d+(?:(?:a|b|rc)\d+)?("\s*\n)', rf"\g<1>{new_version}\g<2>", content)
pyproject.write_text(content)
@@ -414,7 +416,7 @@ def cli(
if base is None:
base = _get_latest_tag()
- if not re.match(r"\d+\.\d+\.\d+", version):
+ if not re.match(r"\d+\.\d+\.\d+((a|b|rc)\d+)?$", version):
click.secho(f"Invalid version: {version!r}")
sys.exit(1)