Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions hooks/prepare-commit-msg
Original file line number Diff line number Diff line change
Expand Up @@ -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"
34 changes: 33 additions & 1 deletion test/git-mr.bats
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
}