#!/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-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. # - copyright is current, e.g. if present, contains XXX- # - 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" "") 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. , Nabla etc checkIllegalCode # if OpenCFD copyright exists, ensure it contains correct year checkCopyright # ensure code conforms to 80 col max checkLineLength #------------------------------------------------------------------------------