- Go 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| cmd/gogroup | ||
| api.go | ||
| go.mod | ||
| go.sum | ||
| grouper_test.go | ||
| LICENSE | ||
| read.go | ||
| README.md | ||
| repair.go | ||
| validate.go | ||
| validate_test.go | ||
gogroup
Check correctness of import groups in Go source, and fix files that have bad grouping.
Forked from https://github.com/vasi-stripe/gogroup, which didn't compile and seemed to be unmaintained.
Concept
Each project should choose a canonical import grouping. For example:
- First standard imports
- Then imports starting with "local/"
- Finally third party imports.
Groups should be separated by empty lines, and within each group imports should be sorted.
So this is allowed:
// In a.go
import (
"os"
"testing"
"local/bar"
"local/foo"
"github.com/Sirupsen/logrus"
"golang.org/x/net/context"
)
But this is not, because of an extra empty line, and local/foo being out of position.
// In b.go
import (
"os"
"testing"
"local/bar"
"github.com/Sirupsen/logrus"
"golang.org/x/net/context"
"local/foo"
)
Usage
Check which files validate this order:
bash$ gogroup -order std,prefix=local/,other a.go b.go
b.go:6: Extra empty line inside import group at "testing"
bash$ echo $?
3
Fixup files to match this order:
bash$ gogroup -order std,prefix=local/,other -rewrite a.go b.go
Fixed b.go.
# Operate recursively on all go files in a directory
bash$ find . -name '*.go' | xargs gogroup -order std,other -rewrite
Then check git diff, to ensure that nothing broke. Now b.go should look like a.go.
Support
The following import structures are currently supported:
-
A single import declaration, without parens:
// Optional comment import "foo" -
A single import declaration with parens:
// Optional comment import ( "something" // Optional comment // Optional comment "another/thing" "one/more/thing" name "import/with/name" . "dot/import" )
All of these allow doc comments and named imports.
TODO
- Write tests, check coverage
- Check lint
- Write better README
- Improve validation messages
- Figure out what to do with different structures:
-
Multiple import declarations. Are these allowed? Do we merge these together?
import ( "something" ) import ( "another/thing" ) -
Spaces at start/end of import declaration. Get rid of them?
import ( "something" ) -
Random comments. Are these allowed? If we move things around, where do these comments end up?
import ( "something" // Random comment in the middle. // Normal doc comment, this is already ok. "another/thing" // Trailing comment. ) // Comment in the middle of import declarations. // Normal doc comment, this is ok. import ( "something/else" ) -
import "C"statements. We should try hard to keep these separate from other imports.import ( "something" ) // Random comment. // #cgo CFLAGS: -DPNG_DEBUG=1 // #cgo amd64 386 CFLAGS: -DX86=1 // #cgo LDFLAGS: -lpng // #include <png.h> import "C" import ( "another/thing" )
-