#!/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
