Commit b2d6ae09 authored by Mark Olesen's avatar Mark Olesen
Browse files

ENH: made Andy's pre-receive hook into a pre-commit hook

- allows fixes before trying to push
parent 82dec482
#!/bin/bash
#---------------------------------*- sh -*-------------------------------------
# ========= |
# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
# \\ / O peration |
# \\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
# \\/ M anipulation |
#------------------------------------------------------------------------------
# License
# This file is part of OpenFOAM.
#
# OpenFOAM is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
#
# Script
# pre-commit-hook
#
# Description
# pre-commit hook for git.
# Copy or link this file as ".git/hooks/pre-commit"
#
# Eg,
# (
# cd $WM_PROJECT_DIR/.git/hooks &&
# ln -sf ../../bin/tools/pre-commit-hook pre-commit
# )
#
# Hook receives: empty
#
# Checks for
# - illegal code, e.g. <TAB>
# - copyright is current, e.g. if present, contains XXX-<current-year>
# - columns greater than 80 for *.[CH] files
#
# Note
# Using "git commit --no-verify" it is possible to override the hook.
#
#------------------------------------------------------------------------------
die()
{
echo 'pre-commit hook failure' 1>&2
echo '-----------------------' 1>&2
echo '' 1>&2
echo "$@" 1>&2
exit 1
}
#-----------------------------------------------------------------------------
# Check content that will be added by this commit.
if git rev-parse --verify -q HEAD > /dev/null
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# list of all files
fileList=$(git diff-index --name-only $against --)
unset badFiles
# join badFiles with this
NL=$'\n '
showBadFiles()
{
if [ -n "$badFiles" ]
then
echo 'pre-commit hook failure' 1>&2
echo '-----------------------' 1>&2
echo "$@" 1>&2
echo '' 1>&2
echo "File(s):$badFiles" 1>&2
echo '' 1>&2
exit 1
fi
}
#
# check for bad characters or strings
#
checkIllegalCode()
{
TAB=$'\t'
BAD=("Nabla" "$TAB")
BADmsg=("Nabla" "<TAB>")
n=${#BAD[@]};
unset errorType
for (( i = 0; i < $n; i++ ))
do
for f in $fileList
do
illegalWord="${BAD[$i]}"
if git grep -q --cached "$illegalWord" -- "$f"
then
errorType="${BADmsg[$i]}"
badFiles="$badFiles$NL$f"
break 2
fi
done
done
showBadFiles "Remove/correct '$errorType' references before pushing"
}
#
# check that OpenCFD copyright is current
#
checkCopyright()
{
year=$(date +%Y)
for f in $fileList
do
present=`git grep --cached Copyright -- "$f" | grep OpenCFD`
if [ -n "$present" ]
then
echo "$present" | grep -q "$year" || badFiles="$badFiles$NL$f"
fi
done
showBadFiles "Update copyright year before pushing, e.g. XXXX-$year"
}
#
# limit line length to 80-columns, except C++ comment lines
#
checkLineLength()
{
for f in $fileList
do
# limit to *.[CH] files
case "$f" in
*.[CH])
## detect long lines, but ignore C++ comment-lines
## extract line numbers
longLines=$(git grep -n --cached ".\{81,\}" -- "$f" |
sed -ne '\@^[^:]*:[^:]*: *//.*@b; s@^[^:]*:\([0-9]*\):.*@\1@p' |
tr '\n' ' '
)
if [ -n "$longLines" ]
then
badFiles="$badFiles$NL$f -- lines: $longLines"
fi
;;
esac
done
showBadFiles "Limit code to 80 columns before pushing"
}
# do all checks
#~~~~~~~~~~~~~~
# use builtin whitespace checks to avoid trailing space
bad=$(git diff-index --check --cached $against --) || die "$bad"
# check for illegal code, e.g. <TAB>, Nabla etc
checkIllegalCode
# if OpenCFD copyright exists, ensure it contains correct year
checkCopyright
# ensure code conforms to 80 col max
checkLineLength
#------------------------------------------------------------------------------
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment