|
@@ -0,0 +1,100 @@
|
|
|
|
|
+#!/usr/bin/env python3
|
|
|
|
|
+import re
|
|
|
|
|
+import subprocess
|
|
|
|
|
+import sys
|
|
|
|
|
+
|
|
|
|
|
+# ---------- Styling ----------
|
|
|
|
|
+RESET = "\033[0m"
|
|
|
|
|
+BOLD = "\033[1m"
|
|
|
|
|
+DIM = "\033[2m"
|
|
|
|
|
+
|
|
|
|
|
+GREEN = "\033[32m"
|
|
|
|
|
+YELLOW = "\033[33m"
|
|
|
|
|
+BLUE = "\033[34m"
|
|
|
|
|
+CYAN = "\033[36m"
|
|
|
|
|
+RED = "\033[31m"
|
|
|
|
|
+
|
|
|
|
|
+def log(icon, label, value="", color=RESET):
|
|
|
|
|
+ if value:
|
|
|
|
|
+ print(f"{color}{icon} {label:<14}{RESET} {value}")
|
|
|
|
|
+ else:
|
|
|
|
|
+ print(f"{color}{icon} {label}{RESET}")
|
|
|
|
|
+
|
|
|
|
|
+def info(label, value=""):
|
|
|
|
|
+ log("▶", label, value, BLUE)
|
|
|
|
|
+
|
|
|
|
|
+def success(label, value=""):
|
|
|
|
|
+ log("✔", label, value, GREEN)
|
|
|
|
|
+
|
|
|
|
|
+def warn(label, value=""):
|
|
|
|
|
+ log("⚠", label, value, YELLOW)
|
|
|
|
|
+
|
|
|
|
|
+def action(label, value=""):
|
|
|
|
|
+ log("✎", label, value, CYAN)
|
|
|
|
|
+
|
|
|
|
|
+# ---------- Git helpers ----------
|
|
|
|
|
+def git(cmd):
|
|
|
|
|
+ return subprocess.check_output(cmd, stderr=subprocess.DEVNULL).decode().strip()
|
|
|
|
|
+
|
|
|
|
|
+def get_branch():
|
|
|
|
|
+ try:
|
|
|
|
|
+ return git(["git", "symbolic-ref", "--short", "HEAD"])
|
|
|
|
|
+ except subprocess.CalledProcessError:
|
|
|
|
|
+ return None
|
|
|
|
|
+
|
|
|
|
|
+def get_ticket(branch):
|
|
|
|
|
+ if not branch:
|
|
|
|
|
+ return None
|
|
|
|
|
+ m = re.match(r"(ocst-\d{2,5})", branch, re.IGNORECASE)
|
|
|
|
|
+ return m.group(1).lower() if m else None
|
|
|
|
|
+
|
|
|
|
|
+# ---------- Commit logic ----------
|
|
|
|
|
+def format_subject(message, ticket):
|
|
|
|
|
+ m = re.match(r"([^:]+):\s*(.*)", message)
|
|
|
|
|
+ if m:
|
|
|
|
|
+ return f"{m.group(1)}({ticket}): {m.group(2)}"
|
|
|
|
|
+ return message
|
|
|
|
|
+
|
|
|
|
|
+def main():
|
|
|
|
|
+ if len(sys.argv) < 2:
|
|
|
|
|
+ print("Usage: g cm <message> [git commit flags]", file=sys.stderr)
|
|
|
|
|
+ sys.exit(1)
|
|
|
|
|
+
|
|
|
|
|
+ message = sys.argv[1]
|
|
|
|
|
+ flags = sys.argv[2:]
|
|
|
|
|
+
|
|
|
|
|
+ branch = get_branch()
|
|
|
|
|
+ if branch:
|
|
|
|
|
+ info("Branch", branch)
|
|
|
|
|
+
|
|
|
|
|
+ ticket = get_ticket(branch)
|
|
|
|
|
+ if ticket:
|
|
|
|
|
+ success("Ticket", ticket.upper())
|
|
|
|
|
+ subject = format_subject(message, ticket)
|
|
|
|
|
+ action("Subject", subject)
|
|
|
|
|
+ action("Reference", f"Refs: {ticket.upper()}")
|
|
|
|
|
+
|
|
|
|
|
+ cmd = [
|
|
|
|
|
+ "git", "commit",
|
|
|
|
|
+ "-m", subject,
|
|
|
|
|
+ "-m", f"Refs: {ticket.upper()}",
|
|
|
|
|
+ *flags,
|
|
|
|
|
+ ]
|
|
|
|
|
+ else:
|
|
|
|
|
+ warn("No ticket found in branch name")
|
|
|
|
|
+ cmd = ["git", "commit", "-m", message, *flags]
|
|
|
|
|
+
|
|
|
|
|
+ info("Committing…")
|
|
|
|
|
+ proc = subprocess.run(cmd)
|
|
|
|
|
+
|
|
|
|
|
+ if proc.returncode == 0:
|
|
|
|
|
+ success("Done")
|
|
|
|
|
+ elif proc.returncode == 1:
|
|
|
|
|
+ warn("Nothing to commit")
|
|
|
|
|
+ sys.exit(0)
|
|
|
|
|
+ else:
|
|
|
|
|
+ sys.exit(proc.returncode)
|
|
|
|
|
+
|
|
|
|
|
+if __name__ == "__main__":
|
|
|
|
|
+ main()
|
|
|
|
|
+
|