diff --git a/bin/tools/pre-commit-hook b/bin/tools/pre-commit-hook
index 6f4023d7d8..b06ddd50b6 100755
--- a/bin/tools/pre-commit-hook
+++ b/bin/tools/pre-commit-hook
@@ -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"
diff --git a/bin/tools/pre-receive-hook b/bin/tools/pre-receive-hook
new file mode 100755
index 0000000000..f289b99be7
--- /dev/null
+++ b/bin/tools/pre-receive-hook
@@ -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 .
+#
+# 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:
+#
+# Checks for
+# - illegal code, e.g.
+# - copyright is current, e.g. if present, contains XXX-
+# - 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, or DOS-line-endings"
+
+ scope=$(gitScope $@)
+
+ badFiles=$(
+ for f in $fileList
+ do
+ # parse line numbers from grep output:
+ # : 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:
+ # : 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:
+ # : 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:
+ # : 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:
+ # : 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. , etc
+ checkIllegalCode $newSHA1
+
+ # ensure OpenCFD copyright contains correct year
+ checkCopyright $newSHA1
+
+ # ensure code conforms to 80 columns max
+ checkLineLengthNonDirective $newSHA1
+
+done
+
+
+exit 0
+#------------------------------------------------------------------------------