#!/bin/sh
#
# This pre-commit hook checks if any versions of clang-format
# are installed, and if so, uses the installed version to format
# the staged changes.

base=clang-format-3.8
format=""

# Redirect output to stderr.
exec 1>&2

 # check if clang-format is installed
type "$base" >/dev/null 2>&1 && format="$base"

# no versions of clang-format are installed
if [ -z "$format" ]
then
    echo "$base is not installed. Commit is cancelled. Delete the hook to force commit."
    exit 1
fi

# Do everything from top - level
cd $(git rev-parse --show-toplevel)

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

exitCode=0

# do the formatting
for file in $(git diff-index --cached --name-only $against | grep -E '\.h$|\.hpp$|\.cpp$|\.cl$|\.h\.in$|\.hpp\.in$|\.cpp\.in$')
do
    if [ -e "$file" ]
    then
       # echo "$format $file"
	"$format" -style=file -output-replacements-xml "$file" | grep "\<replacement\>" >/dev/null
	if [ $? -ne 1 ]; then
            echo "$format" -i -style=file "$file"
	    exitCode=1
	fi
	
    fi
done

if [ $exitCode -eq 1 ]; then
    echo "Please fix the errors by running the commands listed above."
    echo "Commit is cancelled. You may force by deleting the hook in .githook"
else
    echo "Clang format checks passed"
fi

exit $exitCode
