diff --git a/Makefile b/Makefile index 4cfa6dbb..dc7dfe76 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,14 @@ endif # Tools AUTOPREFIXER_BROWSER_SUPPORT := "> 1%, last 2 versions, Firefox ESR, Opera 12.1" -build: get binary assets +build: hook get binary assets + +# the pre-commit hook checks for formatted Go files +hook: + if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \); then \ + rm -f .git/hooks/pre-commit; \ + ln -s ../../src/hooks/pre-commit.hook .git/hooks/pre-commit; \ + fi gopath: @echo GOPATH=$(GOPATH) @@ -171,4 +178,4 @@ tarball: distclean release install echo -n $(VERSION) > $(TARPATH)/version.txt tar czf $(DIST)/$(PACKAGE_NAME).tar.gz -C $(DIST) $(PACKAGE_NAME) -.PHONY: clean distclean pristine get getupdate build styles javascript release releasetest dist_gopath install gopath binary binaryrace binaryall tarball assets +.PHONY: hook clean distclean pristine get getupdate build styles javascript release releasetest dist_gopath install gopath binary binaryrace binaryall tarball assets diff --git a/src/hooks/pre-commit.hook b/src/hooks/pre-commit.hook new file mode 100755 index 00000000..e57b8cee --- /dev/null +++ b/src/hooks/pre-commit.hook @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Check that Go files have been formatted +# + +for file in `git diff-index --cached --name-only HEAD --diff-filter=ACMR| grep "\.go$"` ; do + # nf is the temporary checkout. This makes sure we check against the + # revision in the index (and not the checked out version). + nf=`git checkout-index --temp ${file} | cut -f 1` + newfile=`mktemp /tmp/${nf}.XXXXXX` || exit 1 + gofmt ${nf} > "${newfile}" 2>> /dev/null + diff -u -p "${nf}" "${newfile}" + r=$? + rm "${newfile}" + rm "${nf}" + if [ $r != 0 ] ; then +echo "=================================================================================================" +echo " Code format error in: $file " +echo " " +echo " Please fix before committing. Don't forget to run git add before trying to commit again. " +echo " If the whole file is to be committed, this should work (run from the top-level directory): " +echo " " +echo " go fmt $file; git add $file; git commit" +echo " " +echo "=================================================================================================" + exit 1 + fi +done