#!/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