Skip to content

Commit

Permalink
(feat): restrict release branches in automation (#1765)
Browse files Browse the repository at this point in the history
* (fix): no patch release on main for automation

* (fix): use non-release-regex

* (fix): `msg` format

* (fix): string business

* Use argparse machinery (#1770)

Co-authored-by: Ilan Gold <[email protected]>

---------

Co-authored-by: Philipp A. <[email protected]>
  • Loading branch information
ilan-gold and flying-sheep authored Nov 18, 2024
1 parent af6480e commit 2602e5b
Showing 1 changed file with 40 additions and 12 deletions.
52 changes: 40 additions & 12 deletions ci/scripts/towncrier_automation.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from __future__ import annotations

import argparse
import re
import subprocess
from functools import cache
from typing import TYPE_CHECKING

from packaging.version import Version
Expand All @@ -11,8 +13,33 @@
from collections.abc import Sequence


class BumpVersion(Version):
def __init__(self, version: str) -> None:
super().__init__(version)

if len(self.release) != 3:
msg = f"{version} must contain major, minor, and patch version."
raise argparse.ArgumentTypeError(msg)

base_branch = get_base_branch()
patch_branch_pattern = re.compile(r"\d+\.\d+\.x")
if self.micro != 0 and not patch_branch_pattern.fullmatch(base_branch):
msg = (
f"{version} is a patch release, but "
f"you are trying to release from a non-patch release branch: {base_branch}."
)
raise argparse.ArgumentTypeError(msg)

if self.micro == 0 and base_branch != "main":
msg = (
f"{version} is a minor or major release, "
f"but you are trying to release not from main: {base_branch}."
)
raise argparse.ArgumentTypeError(msg)


class Args(argparse.Namespace):
version: str
version: BumpVersion
dry_run: bool


Expand All @@ -28,7 +55,7 @@ def parse_args(argv: Sequence[str] | None = None) -> Args:
)
parser.add_argument(
"version",
type=str,
type=BumpVersion,
help=(
"The new version for the release must have at least three parts, like `major.minor.patch` and no `major.minor`. "
"It can have a suffix like `major.minor.patch.dev0` or `major.minor.0rc1`."
Expand All @@ -40,10 +67,6 @@ def parse_args(argv: Sequence[str] | None = None) -> Args:
action="store_true",
)
args = parser.parse_args(argv, Args())
# validate the version
if len(Version(args.version).release) != 3:
msg = f"Version argument {args.version} must contain major, minor, and patch version."
raise ValueError(msg)
return args


Expand All @@ -56,12 +79,7 @@ def main(argv: Sequence[str] | None = None) -> None:
)

# Check if we are on the main branch to know if we need to backport
base_branch = subprocess.run(
["git", "rev-parse", "--abbrev-ref", "HEAD"],
capture_output=True,
text=True,
check=True,
).stdout.strip()
base_branch = get_base_branch()
pr_description = "" if base_branch == "main" else "@meeseeksdev backport to main"
branch_name = f"release_notes_{args.version}"

Expand Down Expand Up @@ -104,5 +122,15 @@ def main(argv: Sequence[str] | None = None) -> None:
print("Dry run, not merging")


@cache
def get_base_branch():
return subprocess.run(
["git", "rev-parse", "--abbrev-ref", "HEAD"],
capture_output=True,
text=True,
check=True,
).stdout.strip()


if __name__ == "__main__":
main()

0 comments on commit 2602e5b

Please sign in to comment.