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