#!/bin/bash

set -eu

# make git_dir and GIT_INDEX_FILE absolute, before we change dir
#
# (don't actually set GIT_DIR, because it messes up `go get`, and several of
# the go commands run `go get` indirectly)
#
git_dir=$(readlink -f `git rev-parse --git-dir`)
if [ -n "${GIT_INDEX_FILE:+x}" ]; then
    export GIT_INDEX_FILE=$(readlink -f "$GIT_INDEX_FILE")
fi

wd=`pwd`

# create a temp dir. The `trap` incantation will ensure that it is removed
# again when this script completes.
tmpdir=`mktemp -d`
trap 'rm -rf "$tmpdir"' EXIT
cd "$tmpdir"

# get a clean copy of the index (ie, what has been `git add`ed), so that we can
# run the checks against what we are about to commit, rather than what is in
# the working copy.
git --git-dir="${git_dir}" checkout-index -a

# run our checks
go fmt
./scripts/lint.sh
go test

# we're done with go so can set GIT_DIR
export GIT_DIR="$git_dir"

# if there are no changes from the index, we are done
git diff --quiet && exit 0

# we now need to apply any changes made to both the index and the working copy.
# so, first get a patch
git diff > "$GIT_DIR/pre-commit.patch"

# add the changes to the index
git add -u

# attempt to apply the changes to the wc (but don't fail the commit for it if
# there are conflicts).
cd "$wd"
git apply "$GIT_DIR/pre-commit.patch" 2>/dev/null &&
    rm "$GIT_DIR/pre-commit.patch" ||
    echo "warning: unable to apply changes from commit hook to working copy; patch is in $GIT_DIR/pre-commit.patch" >&2
