diff --git a/hooks/prepare-commit-msg b/hooks/prepare-commit-msg index 538557a..b779506 100755 --- a/hooks/prepare-commit-msg +++ b/hooks/prepare-commit-msg @@ -4,23 +4,24 @@ # When on a branch referring to a Jira issue, # ensure commit messages start with the issue reference +# Allow skipping +case ${SKIP:-} in *prepare-commit-msg*) exit 0 ;; esac + +# Don't alter fixup messages +grep -q "^fixup! " "$1" && exit 0 + JIRA_CODE_PATTERN=${JIRA_CODE_PATTERN:-$(git config --get mr.jira-code-pattern)} if [ -z "$JIRA_CODE_PATTERN" ]; then echo "JIRA_CODE_PATTERN not set - unable to guess issue code" >&2 exit 0 fi +# Exit if code already present in message header +head -n 1 "$1" | grep -Eiq "$JIRA_CODE_PATTERN" && exit 0 + current_branch=$(git rev-parse --abbrev-ref HEAD) issue_code=$(echo "${current_branch}" | grep -Eo "$JIRA_CODE_PATTERN" | tail -n1) [ -n "$issue_code" ] || exit 0 # No issue code detected -current_msg=$(cat "$1") -msg_code=$(echo "${current_msg}" | grep -iEo "$JIRA_CODE_PATTERN" | tail -n1) -[ -z "$msg_code" ] || exit 0 # existing issue code in message - -if case "$current_msg" in "fixup! "*) ;; *) false;; esac; then - exit 0 # don't alter fixup messages -fi - echo "Prefixing message with issue code: $issue_code" >&2 sed -i.bak -e "1s/^/$issue_code /" "$1" diff --git a/test/git-mr.bats b/test/git-mr.bats index fe90626..78cd7f3 100644 --- a/test/git-mr.bats +++ b/test/git-mr.bats @@ -2715,7 +2715,17 @@ n' assert_line "Prefixing message with issue code: AB-123" assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] AB-123 Test message 2" - git reset --hard HEAD~2 + run git commit --allow-empty --fixup HEAD~1 + refute_line "Prefixing message with issue code: AB-123" + assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] fixup! Test message 1" + + run git commit --allow-empty -m "XY-456 Test message 3" + refute_line "Prefixing message with issue code: AB-123" + assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] XY-456 Test message 3" + + # standard .git directory - teardown + git reset --hard HEAD~4 + rm -f .git/hooks/prepare-commit-msg # submodule @@ -2738,4 +2748,26 @@ n' run git commit --allow-empty -m "Sub message 2" assert_line "Prefixing message with issue code: XY-345" assert_line "[feature/XY-345-test $(git rev-parse --short HEAD)] XY-345 Sub message 2" + + # submodule - teardown + cd "${BATS_TEST_DIRNAME}/data" || exit + cd repo; git submodule deinit -f sub; cd .. + rm -rf subrepo repo/sub repo/.gitmodules repo/.git/modules +} + +@test "pre-commit-msg hook can be skipped" { + # setup + git-mr hook + + run git commit --allow-empty -m "Test prefixed message" + assert_line "Prefixing message with issue code: AB-123" + assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] AB-123 Test prefixed message" + + SKIP=aaa,prepare-commit-msg,zzz run git commit --allow-empty -m "Test unprefixed message" + refute_line "Prefixing message with issue code: AB-123" + assert_line "[feature/AB-123-test-feature $(git rev-parse --short HEAD)] Test unprefixed message" + + # teardown + git reset --hard HEAD~2 + rm -f .git/hooks/prepare-commit-msg }