In Travis CI, I want to check that my Go files are formatted properly via gofmt and goimports. During my CI builds, I only care about formatting issues in my own code, not in third-party repos.
Unfortunately, running a simple gofmt -l . in the root of my project does not work because I'm using Godep, which checks in all of my external dependencies at ./Godep/_workspace. While running go fmt ./... ignores underscore-prefixed subdirectories, the plain gofmt . does not. Neither gofmt nor goimports take the ./... arg:
➜ goimports -l ./...
stat ./...: no such file or directorySince I can use go list ./... to get a list of all subpackages in my project (exluding vendored imports in an underscore-prefixed directory), I'm using the following to run gofmt and goimports on each of my own Go files (including _test.go files):
$ OURGOFILES=($(go list -f '{{$p := .}}{{range $f := .GoFiles}}{{$p.Dir}}/{{$f}} {{end}} {{range $f := .TestGoFiles}}{{$p.Dir}}/{{$f}} {{end}}' ./... | xargs))
$ test -z "$(gofmt -l $OURGOFILES | tee /dev/stderr)"
$ test -z "$(goimports -l $OURGOFILES | tee /dev/stderr)"As Keith commented below, the following is a much simpler version. An unrelated bug caused the wildcards to not work for me the first time I tried them, but they do work.
$ dirs=$(go list -f {{.Dir}} ./...)
$ test -z "`for d in $dirs; do goimports -l $d/*.go | tee /dev/stderr; done`"
How about:
p.s. goimports also gofmts, so you only need the one.