2025-10-28 02:50:31 +01:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
"""Branch name checker using regex (compatible with Commitizen v4.9.1).
|
|
|
|
|
|
|
|
|
|
Cross-platform + .venv aware.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
import subprocess
|
|
|
|
|
import sys
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
|
|
|
2026-02-23 20:59:03 +01:00
|
|
|
def find_cz() -> list[str]:
|
|
|
|
|
"""Return command to invoke Commitizen via virtualenv or globally."""
|
|
|
|
|
candidates = []
|
2025-10-28 02:50:31 +01:00
|
|
|
|
2026-02-23 20:59:03 +01:00
|
|
|
# 1️⃣ Currently active virtualenv
|
|
|
|
|
venv = os.getenv("VIRTUAL_ENV")
|
|
|
|
|
if venv:
|
|
|
|
|
candidates.append(Path(venv))
|
|
|
|
|
|
|
|
|
|
# 2️⃣ uv-managed virtualenv
|
|
|
|
|
uv_venv = Path(".uv") / "venv"
|
|
|
|
|
if uv_venv.exists():
|
|
|
|
|
candidates.append(uv_venv)
|
|
|
|
|
|
|
|
|
|
# 3️⃣ traditional .venv
|
|
|
|
|
dot_venv = Path(".venv")
|
|
|
|
|
if dot_venv.exists():
|
|
|
|
|
candidates.append(dot_venv)
|
|
|
|
|
|
|
|
|
|
# Check each candidate for Commitizen binary
|
|
|
|
|
for base in candidates:
|
|
|
|
|
cz_path = base / ("Scripts" if os.name == "nt" else "bin") / ("cz.exe" if os.name == "nt" else "cz")
|
|
|
|
|
if cz_path.exists():
|
|
|
|
|
return [str(cz_path)]
|
|
|
|
|
|
|
|
|
|
# 4️⃣ fallback to uv run cz
|
|
|
|
|
try:
|
|
|
|
|
subprocess.run(["uv", "run", "cz", "--version"], check=True, stdout=subprocess.DEVNULL)
|
|
|
|
|
return ["uv", "run", "cz"]
|
|
|
|
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
# 5️⃣ fallback to system cz
|
|
|
|
|
return ["cz"]
|
2025-10-28 02:50:31 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
|
# Get current branch name
|
|
|
|
|
try:
|
|
|
|
|
branch = subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], text=True).strip()
|
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
|
print("❌ Could not determine current branch name.")
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
# Regex pattern
|
|
|
|
|
pattern = r"^(feat|fix|chore|docs|refactor|test)/[a-z0-9._-]+$"
|
|
|
|
|
|
|
|
|
|
print(f"🔍 Checking branch name '{branch}'...")
|
|
|
|
|
if not re.match(pattern, branch):
|
|
|
|
|
print(f"❌ Branch name '{branch}' does not match pattern '{pattern}'")
|
|
|
|
|
return 1
|
|
|
|
|
|
|
|
|
|
print("✅ Branch name is valid.")
|
|
|
|
|
return 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
sys.exit(main())
|