ci(gofmt): check go formatting with each PR

pull/10616/head
Chris Goller 2018-10-08 13:16:06 -05:00
parent 423a5b859f
commit 2f2334a3f3
3 changed files with 34 additions and 1 deletions

View File

@ -43,6 +43,7 @@ jobs:
- platform-gocache- # Matches a new branch.
- run: make test-go # This uses the test cache so it may succeed or fail quickly.
- run: make vet
- run: make checkfmt
- run: make test-go-race # This doesn't use the test cache, and will not complete quickly.
# TODO add these checks to the Makefile
# - run: go get -v -t -d ./...

View File

@ -105,7 +105,10 @@ chronograf/ui/build:
#
fmt: $(SOURCES_NO_VENDOR)
goimports -w $^
gofmt -w -s $^
checkfmt: $(SOURCES_NO_VENDOR)
./etc/checkfmt.sh
chronograf/dist/dist_gen.go: chronograf/ui/build $(UISOURCES)
$(GO_GENERATE) ./chronograf/dist/...

29
etc/checkfmt.sh Executable file
View File

@ -0,0 +1,29 @@
#!/bin/bash
HAS_FMT_ERR=0
# For every Go file in the project, excluding vendor...
for file in $(go list -f '{{$dir := .Dir}}{{range .GoFiles}}{{printf "%s/%s\n" $dir .}}{{end}}' ./...); do
# ... if file does not contain standard generated code comment (https://golang.org/s/generatedcode)...
if ! grep -Exq '^// Code generated .* DO NOT EDIT\.$' $file; then
FMT_OUT="$(gofmt -l -d -e $file)" # gofmt exits 0 regardless of whether it's formatted.
# ... and if gofmt had any output...
if [[ -n "$FMT_OUT" ]]; then
if [ "$HAS_FMT_ERR" -eq "0" ]; then
# Only print this once.
HAS_FMT_ERR=1
echo 'Commit includes files that are not gofmt-ed' && \
echo 'run "make fmt"' && \
echo ''
fi
echo "$FMT_OUT" # Print output and continue, so developers don't fix one file at a t
fi
fi
done
## print at the end too... sometimes it is nice to see what to do at the end.
if [ "$HAS_FMT_ERR" -eq "1" ]; then
echo 'Commit includes files that are not gofmt-ed' && \
echo 'run "make fmt"' && \
echo ''
fi
exit "$HAS_FMT_ERR"