From 12d01db96a69ca9b08bc018d6d34edeef9206212 Mon Sep 17 00:00:00 2001 From: tapframe <85391825+tapframe@users.noreply.github.com> Date: Sat, 14 Mar 2026 13:58:34 +0530 Subject: [PATCH] Support custom tag, title, and commit message in release script --- scripts/release_beta.py | 71 +++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 14 deletions(-) diff --git a/scripts/release_beta.py b/scripts/release_beta.py index ccf3869a..c93bf946 100755 --- a/scripts/release_beta.py +++ b/scripts/release_beta.py @@ -263,6 +263,9 @@ def append_job_summary( *, dry_run: bool, version_name: str, + release_tag: str, + release_title: str, + commit_message: str, version_code: int, previous_tag: str | None, notes_path: Path, @@ -277,6 +280,9 @@ def append_job_summary( "", f"- Mode: {'dry-run' if dry_run else 'publish'}", f"- Version: `{version_name}`", + f"- Tag: `{release_tag}`", + f"- Title: `{release_title}`", + f"- Commit message: `{commit_message}`", f"- versionCode: `{version_code}`", f"- Previous tag: `{previous_tag or 'none'}`", f"- Notes file: `{notes_path.relative_to(ROOT)}`", @@ -315,12 +321,12 @@ def ensure_clean_worktree() -> None: ) -def ensure_version_available(version_name: str) -> None: +def ensure_version_available(release_tag: str) -> None: tag_check = run( - "git", "rev-parse", "-q", "--verify", f"refs/tags/{version_name}", check=False + "git", "rev-parse", "-q", "--verify", f"refs/tags/{release_tag}", check=False ) if tag_check.returncode == 0: - raise SystemExit(f"Tag already exists: {version_name}") + raise SystemExit(f"Tag already exists: {release_tag}") def build_release() -> list[Path]: @@ -342,34 +348,42 @@ def build_release() -> list[Path]: return assets -def commit_tag_push(version_name: str, branch_name: str) -> None: +def commit_tag_push( + version_name: str, + release_tag: str, + release_title: str, + commit_message: str, + branch_name: str, +) -> None: subprocess.run(["git", "add", str(BUILD_FILE.relative_to(ROOT))], cwd=ROOT, check=True) subprocess.run( - ["git", "commit", "-m", f"release: {version_name}"], + ["git", "commit", "-m", commit_message], cwd=ROOT, check=True, text=True, ) subprocess.run( - ["git", "tag", "-a", version_name, "-m", f"Release {version_name}"], + ["git", "tag", "-a", release_tag, "-m", f"Release {release_title}"], cwd=ROOT, check=True, text=True, ) subprocess.run(["git", "push", "origin", f"HEAD:{branch_name}"], cwd=ROOT, check=True) - subprocess.run(["git", "push", "origin", version_name], cwd=ROOT, check=True) + subprocess.run(["git", "push", "origin", release_tag], cwd=ROOT, check=True) -def create_github_release(version_name: str, notes_path: Path, assets: list[Path]) -> None: +def create_github_release( + release_tag: str, release_title: str, notes_path: Path, assets: list[Path] +) -> None: require_tool("gh") command = [ "gh", "release", "create", - version_name, + release_tag, *[str(asset) for asset in assets], "--title", - version_name, + release_title, "--notes-file", str(notes_path), "--latest", @@ -385,6 +399,18 @@ def parse_args() -> argparse.Namespace: ) ) parser.add_argument("version", help="Target versionName, for example 0.4.19-beta") + parser.add_argument( + "--release-tag", + help="Git tag to create for the release. Defaults to the target versionName.", + ) + parser.add_argument( + "--release-title", + help="GitHub release title. Defaults to the release tag.", + ) + parser.add_argument( + "--commit-message", + help="Git commit message for the version bump. Defaults to 'release: '.", + ) parser.add_argument( "--custom-notes", help="Full release notes markdown. When set, it replaces the generated notes entirely.", @@ -441,6 +467,9 @@ def main() -> int: current_version_name, current_version_code = parse_versions(original_contents) next_version_code = current_version_code + 1 previous_tag = last_tag() + release_tag = args.release_tag or args.version + release_title = args.release_title or release_tag + commit_message = args.commit_message or f"release: {release_tag}" custom_notes = args.custom_notes if args.custom_notes_file: custom_notes = Path(args.custom_notes_file).read_text(encoding="utf-8") @@ -457,6 +486,9 @@ def main() -> int: print(f"Current versionName: {current_version_name}") print(f"Current versionCode: {current_version_code}") print(f"Target versionName: {args.version}") + print(f"Release tag: {release_tag}") + print(f"Release title: {release_title}") + print(f"Commit message: {commit_message}") print(f"Target versionCode: {next_version_code}") print(f"Previous tag: {previous_tag or 'none'}") print(f"Release notes: {notes_path.relative_to(ROOT)}") @@ -471,6 +503,9 @@ def main() -> int: append_job_summary( dry_run=True, version_name=args.version, + release_tag=release_tag, + release_title=release_title, + commit_message=commit_message, version_code=next_version_code, previous_tag=previous_tag, notes_path=notes_path, @@ -480,7 +515,7 @@ def main() -> int: if args.publish: ensure_clean_worktree() - ensure_version_available(args.version) + ensure_version_available(release_tag) updated_contents = updated_build_file( original_contents, version_name=args.version, version_code=next_version_code @@ -497,9 +532,14 @@ def main() -> int: if args.publish: branch_name = current_branch() - commit_tag_push(args.version, branch_name) - create_github_release(args.version, notes_path, assets) - print(f"Published GitHub release {args.version} from branch {branch_name}") + commit_tag_push( + args.version, release_tag, release_title, commit_message, branch_name + ) + create_github_release(release_tag, release_title, notes_path, assets) + print( + f"Published GitHub release {release_tag} " + f"({release_title}) from branch {branch_name}" + ) except Exception: if not args.publish: write_build_file(original_contents) @@ -508,6 +548,9 @@ def main() -> int: append_job_summary( dry_run=False, version_name=args.version, + release_tag=release_tag, + release_title=release_title, + commit_message=commit_message, version_code=next_version_code, previous_tag=previous_tag, notes_path=notes_path,