ENH: add bin/tools/pre-receive-hook
- allows us to follow the changes
This commit is contained in:
parent
cffa2873e0
commit
b06c778193
@ -130,6 +130,7 @@ gitScope()
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# check for bad strings, characters, etc
|
||||
#
|
||||
@ -290,9 +291,9 @@ checkLineLengthNonDirective()
|
||||
}
|
||||
|
||||
|
||||
|
||||
# do all checks
|
||||
# ~~~~~~~~~~~~~
|
||||
#------------------------------------------------------------------------------
|
||||
# Main code : do all checks
|
||||
#
|
||||
|
||||
# builtin whitespace check to avoid trailing space, including CR-LF endings
|
||||
bad=$(git diff-index --cached --check $against --) || die "$bad"
|
||||
|
303
bin/tools/pre-receive-hook
Executable file
303
bin/tools/pre-receive-hook
Executable file
@ -0,0 +1,303 @@
|
||||
#!/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-receive-hook
|
||||
#
|
||||
# Description
|
||||
# pre-receive hook for git.
|
||||
# Copy or link this file as ".git/hooks/pre-receive"
|
||||
#
|
||||
# Eg,
|
||||
# (
|
||||
# cd $WM_PROJECT_DIR/.git/hooks &&
|
||||
# ln -sf ../../bin/tools/pre-receive-hook pre-receive
|
||||
# )
|
||||
#
|
||||
# Hook receives: <old-sha1> <new-sha1> <ref-name>
|
||||
#
|
||||
# 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
|
||||
#
|
||||
#------------------------------------------------------------------------------
|
||||
hookName="pre-receive"
|
||||
die()
|
||||
{
|
||||
echo '$hookName hook failure' 1>&2
|
||||
echo '-----------------------' 1>&2
|
||||
echo '' 1>&2
|
||||
echo "$@" 1>&2
|
||||
echo '' 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
unset fileList
|
||||
unset badFiles
|
||||
# join list of files with this amount of space
|
||||
Indent=" "
|
||||
|
||||
#
|
||||
# report bad files and die if there are any
|
||||
#
|
||||
dieOnBadFiles()
|
||||
{
|
||||
if [ -n "$badFiles" ]
|
||||
then
|
||||
echo '$hookName hook failure' 1>&2
|
||||
echo '-----------------------' 1>&2
|
||||
echo "$@" 1>&2
|
||||
echo '' 1>&2
|
||||
echo "File(s):" 1>&2
|
||||
echo "$badFiles" 1>&2
|
||||
echo '' 1>&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# qualify 'git grep' to check cached value or from a specific commit
|
||||
#
|
||||
gitScope()
|
||||
{
|
||||
if [ "$#" -gt 0 ]
|
||||
then
|
||||
echo "$1:"
|
||||
else
|
||||
echo "--cached -- "
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# check for bad strings, characters, etc
|
||||
#
|
||||
checkIllegalCode()
|
||||
{
|
||||
echo "$hookName: check bad strings/characters etc ..." 1>&2
|
||||
|
||||
reBad="(N""abla|"$'\t'"|"$'\r\n'")"
|
||||
msgBad="N""abla, <TAB> or DOS-line-endings"
|
||||
|
||||
scope=$(gitScope $@)
|
||||
|
||||
badFiles=$(
|
||||
for f in $fileList
|
||||
do
|
||||
# parse line numbers from grep output:
|
||||
# <lineNr>: contents
|
||||
lines=$(git grep -E -hn -e "$reBad" $scope"$f" |
|
||||
sed -e 's@:.*@@' |
|
||||
tr '\n' ' '
|
||||
)
|
||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||
done
|
||||
)
|
||||
|
||||
dieOnBadFiles "Remove/correct bad '$msgBad' references"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# check that OpenCFD copyright is current
|
||||
#
|
||||
checkCopyright()
|
||||
{
|
||||
year=$(date +%Y)
|
||||
echo "$hookName: check copyright ..." 1>&2
|
||||
|
||||
scope=$(gitScope $@)
|
||||
|
||||
badFiles=$(
|
||||
for f in $fileList
|
||||
do
|
||||
# NB: need to have OpenCFD on a separate line to prevent
|
||||
# this check being caught by itself!
|
||||
#
|
||||
# parse line numbers from grep output:
|
||||
# <lineNr>: contents
|
||||
#
|
||||
lines=$(git grep -F -hn -e Copyright \
|
||||
--and -e OpenCFD \
|
||||
--and --not -e "$year" \
|
||||
$scope"$f" |
|
||||
sed -e 's@:.*@@' |
|
||||
tr '\n' ' '
|
||||
)
|
||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||
done
|
||||
)
|
||||
|
||||
dieOnBadFiles "Update copyright year, e.g. XXXX-$year"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# limit line length to 80-columns
|
||||
#
|
||||
checkLineLength()
|
||||
{
|
||||
echo "$hookName: check line lengths ..." 1>&2
|
||||
|
||||
scope=$(gitScope $@)
|
||||
|
||||
badFiles=$(
|
||||
for f in $fileList
|
||||
do
|
||||
# limit to *.[CH] files
|
||||
case "$f" in
|
||||
(*.[CH])
|
||||
# parse line numbers from grep output:
|
||||
# <lineNr>: contents
|
||||
lines=$(git grep -hn -e '^.\{81,\}' $scope"$f" |
|
||||
sed -e 's@:.*@@' |
|
||||
tr '\n' ' '
|
||||
)
|
||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
)
|
||||
|
||||
dieOnBadFiles "Limit code to 80 columns before pushing"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# limit line length to 80-columns, except C++ comment lines
|
||||
#
|
||||
checkLineLengthNonComments()
|
||||
{
|
||||
echo "$hookName: check line lengths ..." 1>&2
|
||||
|
||||
scope=$(gitScope $@)
|
||||
|
||||
badFiles=$(
|
||||
for f in $fileList
|
||||
do
|
||||
# limit to *.[CH] files
|
||||
case "$f" in
|
||||
(*.[CH])
|
||||
# parse line numbers from grep output:
|
||||
# <lineNr>: contents
|
||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||
--and --not -e "^ *//" \
|
||||
$scope"$f" |
|
||||
sed -e 's@:.*@@' |
|
||||
tr '\n' ' '
|
||||
)
|
||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
)
|
||||
|
||||
dieOnBadFiles "Limit code to 80 columns before pushing"
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# limit line length to 80-columns, except #directive lines
|
||||
#
|
||||
checkLineLengthNonDirective()
|
||||
{
|
||||
echo "$hookName: check line lengths ..." 1>&2
|
||||
|
||||
scope=$(gitScope $@)
|
||||
|
||||
badFiles=$(
|
||||
for f in $fileList
|
||||
do
|
||||
# limit to *.[CH] files
|
||||
case "$f" in
|
||||
(*.[CH])
|
||||
# parse line numbers from grep output:
|
||||
# <lineNr>: contents
|
||||
lines=$(git grep -hn -e '^.\{81,\}' \
|
||||
--and --not -e "^ *#" \
|
||||
$scope"$f" |
|
||||
sed -e 's@:.*@@' |
|
||||
tr '\n' ' '
|
||||
)
|
||||
[ -n "$lines" ] && echo "$Indent$f -- lines: $lines"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
)
|
||||
|
||||
dieOnBadFiles "Limit code to 80 columns before pushing"
|
||||
}
|
||||
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# Main code : do all checks
|
||||
#
|
||||
|
||||
while read oldSHA1 newSHA1 refName
|
||||
do
|
||||
unset fileList rawFileList
|
||||
|
||||
if [ "$newSHA1" = 0 ]
|
||||
then
|
||||
# ref to be deleted
|
||||
continue
|
||||
elif [ "$oldSHA1" = 0 ]
|
||||
then
|
||||
# ref to be created
|
||||
rawFileList=$(git diff-tree --root $newSHA1)
|
||||
else
|
||||
# normal changes
|
||||
rawFileList=$(git diff --name-only $oldSHA1..$newSHA1)
|
||||
fi
|
||||
|
||||
#
|
||||
# no files changed: can skip all the checks
|
||||
#
|
||||
[ -n "$rawFileList" ] || continue
|
||||
|
||||
fileList=$(
|
||||
for f in $rawFileList
|
||||
do
|
||||
git cat-file -e $newSHA1:$f > /dev/null 2>&1 && echo "$f"
|
||||
done
|
||||
)
|
||||
|
||||
# check for illegal code, e.g. <TAB>, etc
|
||||
checkIllegalCode $newSHA1
|
||||
|
||||
# ensure OpenCFD copyright contains correct year
|
||||
checkCopyright $newSHA1
|
||||
|
||||
# ensure code conforms to 80 columns max
|
||||
checkLineLengthNonDirective $newSHA1
|
||||
|
||||
done
|
||||
|
||||
|
||||
exit 0
|
||||
#------------------------------------------------------------------------------
|
Loading…
Reference in New Issue
Block a user