- Writing custom git flow scripts - a start
This commit is contained in:
107
scripts/git/commands/release.py
Normal file
107
scripts/git/commands/release.py
Normal file
@@ -0,0 +1,107 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from ..core import config, git_api, 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.")
|
||||
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)
|
||||
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)
|
||||
|
||||
tag_name = cfg.tag_format.format(version=version)
|
||||
|
||||
# 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}'."
|
||||
)
|
||||
return 0
|
||||
except git_api.GitError as exc:
|
||||
output.error(str(exc))
|
||||
return 1
|
||||
|
||||
Reference in New Issue
Block a user