Files
eveAI/scripts/git/commands/release.py

143 lines
5.2 KiB
Python

from __future__ import annotations
from ..core import config, git_api, hooks, output
def _release_branch_name(version: str) -> str:
return f"{config.CONFIG.release_prefix}{version}"
def _ensure_version(version: str | None) -> str:
if version:
return version
# Eenvoudige interactieve prompt; later kunnen we validatie uitbreiden
output.info("Geen versie opgegeven. Gelieve een versie in te geven (bijv. 1.2.0):")
entered = input("Versie: ").strip()
if not entered:
raise git_api.GitError("Geen versie opgegeven.")
return entered
def handle_release_start(args) -> int:
cfg = config.CONFIG
try:
version = _ensure_version(getattr(args, "version", None))
branch_name = _release_branch_name(version)
git_api.ensure_clean_working_tree()
git_api.fetch_remote(cfg.remote_name)
git_api.ensure_not_behind_remote(cfg.develop_branch, cfg.remote_name)
output.info(f"Aanmaken van release branch '{branch_name}' vanaf '{cfg.develop_branch}'")
git_api.create_branch(branch_name, cfg.develop_branch)
output.success(f"Release branch '{branch_name}' is aangemaakt en gecheckt out.")
# Hooks na succesvol aanmaken van een release branch
hooks.run_hooks(
"release_start",
{
"branch": branch_name,
"base_branch": cfg.develop_branch,
"version": version,
},
)
return 0
except git_api.GitError as exc:
output.error(str(exc))
return 1
def handle_release_finish(args) -> int:
cfg = config.CONFIG
try:
version_arg = getattr(args, "version", None)
env_arg = getattr(args, "env", None)
git_api.ensure_clean_working_tree()
git_api.fetch_remote(cfg.remote_name)
if version_arg:
version = version_arg
release_branch = _release_branch_name(version)
else:
# Probeer huidige branch te gebruiken
current = git_api.get_current_branch()
prefix = cfg.release_prefix
if current.startswith(prefix):
version = current[len(prefix) :]
release_branch = current
else:
# Geen logische branch, vraag versie interactief
version = _ensure_version(None)
release_branch = _release_branch_name(version)
# Zorg dat betrokken branches niet achterlopen
git_api.ensure_not_behind_remote(release_branch, cfg.remote_name)
git_api.ensure_not_behind_remote(cfg.main_branch, cfg.remote_name)
git_api.ensure_not_behind_remote(cfg.develop_branch, cfg.remote_name)
# Bepaal omgeving en uiteindelijke tagnaam
env = env_arg or cfg.release_default_env
suffix = cfg.environments.get(env, "")
base_tag = cfg.tag_format.format(version=version)
tag_name = f"{base_tag}{suffix}"
# Merge naar main
output.info(f"Mergen van '{release_branch}' naar '{cfg.main_branch}' en tag '{tag_name}' aanmaken")
git_api.checkout_branch(cfg.main_branch)
merge_args = ["merge"]
if cfg.use_no_ff_for_release:
merge_args.append("--no-ff")
merge_args.append(release_branch)
try:
git_api._run_git(merge_args) # type: ignore[attr-defined]
except git_api.GitError as exc:
raise git_api.GitError(
"Merge naar main is mislukt (mogelijk conflicten). Los de conflicten op en voltooi de merge handmatig."
) from exc
# Tag aanmaken op main
git_api._run_git(["tag", tag_name]) # type: ignore[attr-defined]
# Merge terug naar develop
output.info(f"Mergen van '{release_branch}' terug naar '{cfg.develop_branch}'")
git_api.checkout_branch(cfg.develop_branch)
merge_args = ["merge"]
if cfg.use_no_ff_for_release:
merge_args.append("--no-ff")
merge_args.append(release_branch)
try:
git_api._run_git(merge_args) # type: ignore[attr-defined]
except git_api.GitError as exc:
raise git_api.GitError(
"Merge naar develop is mislukt (mogelijk conflicten). Los de conflicten op en voltooi de merge handmatig."
) from exc
output.success(
f"Release '{version}' is voltooid: gemerged naar '{cfg.main_branch}' en '{cfg.develop_branch}' en getagd als '{tag_name}'."
)
# Optionele cleanup van release branch
if cfg.delete_release_after_finish:
output.info(f"Opruimen van lokale release branch '{release_branch}'")
try:
git_api._run_git(["branch", "-d", release_branch]) # type: ignore[attr-defined]
except git_api.GitError as exc:
output.warning(f"Kon release branch '{release_branch}' niet verwijderen: {exc}")
# Hooks na succesvolle release-finish
hooks.run_hooks(
"release_finish",
{
"branch": release_branch,
"base_branch": cfg.main_branch,
"version": version,
"env": env,
"tag": tag_name,
},
)
return 0
except git_api.GitError as exc:
output.error(str(exc))
return 1