Files
mlflow--mlflow/dev/create_release_branch.py
T
2026-07-13 13:22:34 +08:00

63 lines
2.1 KiB
Python

import argparse
import os
import subprocess
from packaging.version import Version
def main(new_version: str, remote: str, dry_run: bool = False) -> None:
version = Version(new_version)
release_branch = f"branch-{version.major}.{version.minor}"
exists_on_remote = (
subprocess.check_output(
["git", "ls-remote", "--heads", remote, release_branch], text=True
).strip()
!= ""
)
if exists_on_remote:
print(f"{release_branch} already exists on {remote}, skipping branch creation")
return
prev_branch = subprocess.check_output(["git", "branch", "--show-current"], text=True).strip()
try:
exists_on_local = (
subprocess.check_output(["git", "branch", "--list", release_branch], text=True).strip()
!= ""
)
if exists_on_local:
print(f"Deleting existing {release_branch}")
subprocess.check_call(["git", "branch", "-D", release_branch])
print(f"Creating {release_branch}")
subprocess.check_call(["git", "checkout", "-b", release_branch, "master"])
print(f"Pushing {release_branch} to {remote}")
subprocess.check_call([
"git",
"push",
remote,
release_branch,
*(["--dry-run"] if dry_run else []),
])
finally:
subprocess.check_call(["git", "checkout", prev_branch])
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Create a release branch")
parser.add_argument("--new-version", required=True, help="New version to release")
parser.add_argument("--remote", default="origin", help="Git remote to use (default: origin)")
parser.add_argument(
"--dry-run",
action="store_true",
default=os.environ.get("DRY_RUN", "true").lower() == "true",
help="Dry run mode (default: True, can be set via DRY_RUN env var)",
)
parser.add_argument(
"--no-dry-run",
action="store_false",
dest="dry_run",
help="Disable dry run mode",
)
args = parser.parse_args()
main(args.new_version, args.remote, args.dry_run)