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