If you’re using Gitlab, you may know you could use custom hooks to validate contents. Everything is detailed in http://doc.gitlab.com/ce/hooks/custom_hooks.html
I found many examples where hooks are Ruby based and using Gitlab APIs but I wanted something in good old bash.
I found some bash hooks, https://github.com/Praqma/git-hooks, but 7 months old. They still works with Gitlab 7.8.1 and adapted them for my purposes.
Here is a sample pre-receive hook :
#!/bin/bash
#
# pre-receive hook for Commit Check
#
COMPANY_EMAIL="mycorp.org"
readonly PROGNAME=$(basename $0)
readonly PROGDIR=$(readlink -m $(dirname $0))
check_single_commit()
{
COMMIT_CHECK_STATUS=0
#
# Put here any logic you want for your commit
#
# COMMIT_MESSAGE contains commit message
# COMMIT_AUTHOR contains commit author (without email)
#
# Set COMMIT_CHECK_STATUS to non zero to indicate an error
}
check_all_commits()
{
REVISIONS=$(git rev-list $OLD_REVISION..$NEW_REVISION)
IFS='\n' read -ra LIST_OF_REVISIONS <<< "$REVISIONS"
for rid in "${!LIST_OF_REVISIONS[@]}"; do
REVISION=${LIST_OF_REVISIONS[rid]}
COMMIT_MESSAGE=$(git cat-file commit $REVISION | sed '1,/^$/d')
COMMIT_AUTHOR=$(git cat-file commit $REVISION | grep committer | sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/' | sed 's/<//' | sed 's/>//' | sed 's/@$COMPANY_EMAIL//')
check_single_commit
if [ "$COMMIT_CHECK_STATUS" != "0" ]; then
echo "Commit validation failed for commit $REVISION" >&2
exit 1
fi
done
}
# Get custom commit message format
while read OLD_REVISION NEW_REVISION REFNAME ; do
check_all_commits
done
exit 0
Install is easy (example with Omnibus based Gitlab) :
mkdir /var/opt/gitlab/git-data/repositories/MYGROUP/MYREPO.git/custom_hooks
cp pre-receive /var/opt/gitlab/git-data/repositories/MYGROUP/MYREPO.git/custom_hooks/pre-receive
chmod 755 /var/opt/gitlab/git-data/repositories/MYGROUP/MYREPO.git/custom_hooks/pre-receive
chown -R git:git /var/opt/gitlab/git-data/repositories/MYGROUP/MYREPO.git/custom_hooks