Skip to content

Instantly share code, notes, and snippets.

@h12w
Last active August 24, 2021 03:13
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save h12w/0f22736320abe6be71ce to your computer and use it in GitHub Desktop.
Save h12w/0f22736320abe6be71ce to your computer and use it in GitHub Desktop.
golcean.sh does automatic checking on a Go package and its sub-packages.
#!/bin/bash
# The script does automatic checking on a Go package and its sub-packages, including:
# 1. gofmt (http://golang.org/cmd/gofmt/)
# 2. goimports (https://github.com/bradfitz/goimports)
# 3. golint (https://github.com/golang/lint)
# 4. go vet (http://golang.org/cmd/vet)
# 5. race detector (http://blog.golang.org/race-detector)
# 6. test coverage (http://blog.golang.org/cover)
set -e
# Automatic checks
test -z "$(gofmt -l -w . | tee /dev/stderr)"
test -z "$(goimports -l -w . | tee /dev/stderr)"
test -z "$(golint . | tee /dev/stderr)"
go vet ./...
go test -race ./...
# Run test coverage on each subdirectories and merge the coverage profile.
echo "mode: count" > profile.cov
# Standard go tooling behavior is to ignore dirs with leading underscors
for dir in $(find . -maxdepth 10 -not -path './.git*' -not -path '*/_*' -type d);
do
if ls $dir/*.go &> /dev/null; then
go test -covermode=count -coverprofile=$dir/profile.tmp $dir
if [ -f $dir/profile.tmp ]
then
cat $dir/profile.tmp | tail -n +2 >> profile.cov
rm $dir/profile.tmp
fi
fi
done
go tool cover -func profile.cov
# To submit the test coverage result to coveralls.io,
# use goveralls (https://github.com/mattn/goveralls)
# goveralls -coverprofile=profile.cov -service=travis-ci
@drewwells
Copy link

Great work. I found one problem on circleci.com. The for dir loop is creating odd dependency paths. ie.

scripts/goclean.sh
ok      _/home/ubuntu/wellington    1.024s
ok      _/home/ubuntu/wellington/context    1.030s
ok      _/home/ubuntu/wellington/context/handlers   6.189s
ok      _/home/ubuntu/wellington/lexer  1.012s
cover: can't find "context.go": cannot find package "_/home/ubuntu/wellington/context/" 

go test|vet|tool ./... is working fine, only the find command is causing this issue. I haven't quite figured it out yet, but you can check out the build in action here: https://circleci.com/gh/wellington/wellington/27

I wonder if the pwd is changing, and profile.cov needs to explicitly define a directory to dump in?

@davecgh
Copy link

davecgh commented Jan 16, 2015

I'm using a modified version of this and noticed that when there is a race, it doesn't return an error from the test command unless you set an environment variable.

I'd suggest:
env GORACE="halt_on_error=1" go test -v -race ./...

@h12w
Copy link
Author

h12w commented Jun 15, 2015

Thanks.

I have just noticed that there are no notifications about the comments on Gist, I have just moved the script to my Git repository: https://github.com/hailiang/gosweep (name changed from goclean to gosweep to avoid confusion with "go clean" command).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment