build-sys: added a git hook for WS error checks.
authorKrisztian Litkey <krisztian.litkey@intel.com>
Tue, 26 Jun 2012 13:22:21 +0000 (16:22 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Tue, 26 Jun 2012 13:22:21 +0000 (16:22 +0300)
Makefile.am
githooks/pre-commit [new file with mode: 0755]

index a13f07e..e2c8627 100644 (file)
@@ -1,5 +1,43 @@
-SUBDIRS  = src doc .
+SUBDIRS  = . src doc
 doc_DATA = AUTHORS ChangeLog COPYING INSTALL NEWS README
 
+# This is the only way with automake I know of to force 'check-git-hooks'
+# to be evaluated before 'all'. If there is a nicer way, I'm all ears...
+BUILT_SOURCES = check-git-hooks
+
+###################################
+# git hook management
+#
+
+install-git-hooks:
+       if test -d .git; then                                       \
+           for hook in githooks/???*; do                           \
+               case $$hook in                                      \
+                   *.sample|*~|*.swp) continue;;                   \
+               esac;                                               \
+               if test -x $$hook; then                             \
+                   echo "Installing git hook $${hook##*/}...";     \
+                   cp $$hook .git/hooks;                           \
+                   chmod a+x .git/hooks/$${hook##*/};              \
+               fi                                                  \
+           done                                                    \
+       fi
+
+check-git-hooks:
+       if test -d .git; then                                                \
+           for hook in githooks/???*; do                                    \
+               case $$hook in                                               \
+                   *.sample|*~|*.swp) continue;;                            \
+               esac;                                                        \
+               if test -x $$hook -a ! -e .git/hooks/$${hook##*/}; then      \
+                   echo "WARNING:";                                         \
+                   echo "WARNING: You have an uninstalled git hook $$hook"; \
+                   echo "WARNING:";                                         \
+               fi                                                           \
+           done                                                             \
+       fi
+
+
+# cleanup
 clean-local:
        rm -f *~
diff --git a/githooks/pre-commit b/githooks/pre-commit
new file mode 100755 (executable)
index 0000000..3e27ed9
--- /dev/null
@@ -0,0 +1,88 @@
+#!/bin/bash
+#
+# This is a modified version of the stock git sample pre-commit hook.
+# In addition to the stock whitespace error checks, this one will also
+# reject any commits that try to insert TABs to *.c or *.h files.
+
+if git rev-parse --verify HEAD >/dev/null 2>&1
+then
+       against=HEAD
+else
+       # Initial commit: diff against an empty tree object
+       against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+fi
+
+# If you want to allow non-ascii filenames set this variable to true.
+allownonascii=$(git config hooks.allownonascii)
+
+# Redirect output to stderr.
+exec 1>&2
+
+# Cross platform projects tend to avoid non-ascii filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if [ "$allownonascii" != "true" ] &&
+       # Note that the use of brackets around a tr range is ok here, (it's
+       # even required, for portability to Solaris 10's /usr/bin/tr), since
+       # the square bracket bytes happen to fall in the designated range.
+       test $(git diff --cached --name-only --diff-filter=A -z $against |
+         LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
+then
+       echo "Error: Attempt to add a non-ascii file name."
+       echo
+       echo "This can cause problems if you want to work"
+       echo "with people on other platforms."
+       echo
+       echo "To be portable it is advisable to rename the file ..."
+       echo
+       echo "If you know what you are doing you can disable this"
+       echo "check using:"
+       echo
+       echo "  git config hooks.allownonascii true"
+       echo
+       exit 1
+fi
+
+# If there are whitespace errors, print the offending file names and fail.
+git diff-index --check --cached $against --
+status=$?
+
+if [ "$status" != "0" ]; then
+    echo ""
+    echo "WARNING:"
+    echo "WARNING: Your commit would introduce whitespace errors and was"
+    echo "WARNING: hence rejected. Please fix those errors before trying"
+    echo "WARNING: to commit again."
+    echo "WARNING:"
+    exit 1
+fi
+
+# Check if any TABS have been added to .c or .h files...
+git diff --cached $against | \
+    while read line; do
+        case $line in
+            diff\ --git\ a/*)
+                file="${line##*b/}"
+                continue
+                ;;
+        esac
+        case $file in
+            *.h|*.c) ;;
+            *) continue;;
+        esac
+        echo "$line" | grep -q $'\t'
+        if [ "$?" = "0" ]; then
+            echo "WARNING:"
+            echo "WARNING: In $file:"
+            echo "WARNING:"
+            echo "WARNING: Your commit would introduce TABS in a *.c or *.h"
+            echo "WARNING: file and was hence rejected. We prefer not to use"
+            echo "WARNING: TABS in source code to avoid TAB-size dependent"
+            echo "WARNING: incorrect indentation to sneak in. Please fix those"
+            echo "WARNING: errors before trying to commit again."
+            echo "WARNING:"
+            exit 1
+        fi
+    done
+
+exit 0