ee67dc1f2e
It seems that `go get` explodes and craps over your git directory if you set GIT_DIR, and some of the go tools run `go get` indirectly, so let's jump through some hoops to fix it.
53 lines
1.5 KiB
Bash
Executable file
53 lines
1.5 KiB
Bash
Executable file
#!/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
|
|
golint src/...
|
|
go fmt ./src/...
|
|
go tool vet --shadow ./src
|
|
gocyclo -over 12 src/
|
|
gb 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
|