No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-09-11 18:43:46 +01:00
cmd/gogroup update module path 2026-09-11 18:43:46 +01:00
api.go Rename 2017-06-26 21:23:06 -04:00
go.mod update module path 2026-09-11 18:43:46 +01:00
go.sum fix compile bug, use go.mod, add recursive example 2020-04-12 07:49:23 -07:00
grouper_test.go Start some tests 2017-06-26 22:21:50 -04:00
LICENSE add agpl license 2026-09-11 18:19:09 +01:00
read.go Split files 2017-06-26 21:26:46 -04:00
README.md fix compile bug, use go.mod, add recursive example 2020-04-12 07:49:23 -07:00
repair.go Handle cases where goimports is good enough 2017-06-27 09:22:56 -04:00
validate.go Add comments 2017-06-26 21:32:51 -04:00
validate_test.go Test some edge cases 2017-06-26 22:33:37 -04:00

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:

  1. A single import declaration, without parens:

    // Optional comment
    import "foo"
    
  2. 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"
      )