From b06c77819392a499bce341a3f28fe2a923b4d74b Mon Sep 17 00:00:00 2001 From: Mark Olesen <Mark.Olesen@Germany> Date: Wed, 10 Nov 2010 16:25:40 +0100 Subject: [PATCH] ENH: add bin/tools/pre-receive-hook - allows us to follow the changes --- bin/tools/pre-commit-hook | 7 +- bin/tools/pre-receive-hook | 303 +++++++++++++++++++++++++++++++++++++ 2 files changed, 307 insertions(+), 3 deletions(-) create mode 100755 bin/tools/pre-receive-hook diff --git a/bin/tools/pre-commit-hook b/bin/tools/pre-commit-hook index 6f4023d7d84..b06ddd50b6b 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 00000000000..f289b99be70 --- /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 <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 +#------------------------------------------------------------------------------ -- GitLab