#!/bin/sh

# This pre-commit hook will abort if a committed file doesn't pass gofmt.
# By Even Shaw <edsrzf@gmail.com>
# http://github.com/edsrzf/gofmt-git-hook

test_fmt() {
    hash gofmt 2>&- || { echo >&2 "gofmt not in PATH."; exit 1; }
    IFS='
'
    for file in `git diff --cached --name-only --diff-filter=ACM | grep '\.go$'`
    do
        output=`git cat-file -p :$file | gofmt -l 2>&1`
        if test $? -ne 0
        then
            output=`echo "$output" | sed "s,<standard input>,$file,"`
            syntaxerrors="${list}${output}\n"
        elif test -n "$output"
        then
            list="${list}${file}\n"
        fi
    done
    exitcode=0
    if test -n "$syntaxerrors"
    then
        echo >&2 "gofmt found syntax errors:"
        printf "$syntaxerrors"
        exitcode=1
    fi
    if test -n "$list"
    then
        echo >&2 "gofmt needs to format these files (run gofmt -w and git add):"
        printf "$list"
        exitcode=1
    fi
    exit $exitcode
}

case "$1" in
    --about )
        echo "Check Go code formatting"
        ;;
    * )
        test_fmt
        ;;
esac