Support custom tag, title, and commit message in release script

This commit is contained in:
tapframe 2026-03-14 13:58:34 +05:30 committed by CrissZollo
parent 69af0a5a64
commit 12d01db96a
No known key found for this signature in database

View file

@ -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: <release-tag>'.",
)
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,