#!/usr/bin/env bb
(ns prepare_commit_msg
(:require [clojure.java.shell :refer [sh]]
[clojure.string :refer [includes? split trim trim-newline
upper-case]]))
(def ^:private branches-to-skip #{"master"
"main"
"develop"
"test"})
(def commit-message-file ".git/COMMIT_EDITMSG")
(def commit-message (slurp commit-message-file))
(defn- should-skip-this-branch? [branch]
(contains? branches-to-skip branch))
(defn current-git-branch []
(->> (sh "git" "symbolic-ref" "--short" "HEAD")
:out
trim-newline))
(defn jira-ticket-number []
(when-let [s (->> (split (current-git-branch) #"/")
last
(re-seq #"^[a-zA-Z]+-[0-9]+")
first)]
(upper-case s)))
(defn github-issue-number []
(when-let [s (->> (split (current-git-branch) #"/")
last
(re-seq #"#[0-9]+$")
last)]
(upper-case s)))
(defn include-jira-ticket-number? []
(when-let [ticket (jira-ticket-number)]
(includes? commit-message ticket)))
(defn include-github-issue-number? []
(when-let [ticket (github-issue-number)]
(includes? commit-message ticket)))
(defn combine-ticket-number-with-message []
(if-let [ticket (or (jira-ticket-number)
(github-issue-number))]
(format "%s (%s)" (trim commit-message) ticket)
commit-message))
(defn skip? [branch]
(or (should-skip-this-branch? branch)
(include-jira-ticket-number?)))
(defn -main [& _args]
(->> (if (skip? (current-git-branch))
commit-message
(combine-ticket-number-with-message))
(spit commit-message-file))
(System/exit 0))