mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: made Andy's pre-receive hook into a pre-commit hook
- allows fixes before trying to push
This commit is contained in:
183
bin/tools/pre-commit-hook
Executable file
183
bin/tools/pre-commit-hook
Executable file
@ -0,0 +1,183 @@
|
||||
#!/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
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
Reference in New Issue
Block a user