blob: a0c218deee3fb4b7594fe39b76c1025045ba0725 [file] [log] [blame]
#!/usr/bin/env bash
#
# A hook script to verify commit message format. Called by "git commit"
# with one argument, the name of the file that has the commit message.
# The hook exits with non-zero status after issuing an appropriate
# message if it wants to stop the commit. The hook is allowed to edit the
# commit message file.
#
# To enable this hook, run `bootstrap` or do this from the root of the repo:
#
# $ ln -s ../../support/hooks/commit-msg .git/hooks/commit-msg
COMMIT_MESSAGE=$(cat "$1")
FIRST_LINE=$(head -n 1 "$1")
LAST_CHAR=$(echo -n "$FIRST_LINE" | tail -c 1)
FIRST_CHAR=$(echo -n "$FIRST_LINE" | head -c 1)
if [[ "$FIRST_LINE" =~ ^(fixup|squash)\! ]]; then
# If the commit starts with fixup! or squash! we ignore everything.
# The message will be checked when the final commit is made.
exit 0
fi
while read -r LINE
do
# In verbose mode, the diff of the commit is included in the commit message.
# Since git looks for the following line and skips everything after it,
# we also skip everything once this line is observed.
if [ "$LINE" = "# ------------------------ >8 ------------------------" ]; then break; fi
if [ "$(echo -n "$LINE" | head -c 1)" = "#" ]; then continue; fi
LENGTH=$(echo -n "$LINE" | wc -c)
if [ "$LENGTH" -gt "72" ]; then
echo >&2 "Error: No line in the commit message summary may exceed 72 characters."
exit 1
fi
done <<< "$COMMIT_MESSAGE"
if [[ ! "$FIRST_CHAR" =~ [A-Z] ]]; then
echo >&2 "Error: Commit message summary (the first line) must start with a capital letter."
exit 1
fi
if [ "$LAST_CHAR" != "." ]; then
echo >&2 "Error: Commit message summary (the first line) must end in a period."
exit 1
fi