kubezero/scripts/git-pre-receive-hook.sh

34 lines
1.2 KiB
Bash

#!/bin/bash
#
# Reject pushes that contain commits with messages that do not adhere
# to the defined regex.
# [1] https://www.conventionalcommits.org/en/v1.0.0/#specification
set -e
zero_commit='0000000000000000000000000000000000000000'
msg_regex='^((fixup! |squash! )?(\w+)(?:\(([^\)\s]+)\))?: (.+))(?:\n|$){0,2}?((?:^.+(\n|$))+(?:\n|$){0,2}?)*((?:^.+(\n|$))+)*'
while read -r oldrev newrev refname; do
# Branch or tag got deleted, ignore the push
[ "$newrev" = "$zero_commit" ] && continue
# Calculate range for new branch/updated branch
[ "$oldrev" = "$zero_commit" ] && range="$newrev" || range="$oldrev..$newrev"
for commit in $(git rev-list "$range" --not --all); do
if ! git log --max-count=1 --format=%B $commit | grep -iqE "$msg_regex"; then
echo "ERROR:"
echo "ERROR: Your push was rejected because the commit"
echo "ERROR: $commit in ${refname#refs/heads/}"
echo "ERROR: is not adhering to convential commit format."
echo "ERROR:"
echo "ERROR: Please fix the commit message and push again."
echo "ERROR: https://www.conventionalcommits.org/en/v1.0.0/#specification"
echo "ERROR"
exit 1
fi
done
done