Skip to content

Commit 106b42d

Browse files
committed
refactor and implement go/analyzer
1 parent e4abc20 commit 106b42d

File tree

8 files changed

+416
-391
lines changed

8 files changed

+416
-391
lines changed

go.mod

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
module github.com/daixiang0/gci
2+
3+
go 1.14
4+
5+
require golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305

go.sum

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
2+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
3+
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
4+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
5+
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6+
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
7+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
8+
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
9+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
10+
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
11+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
12+
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
13+
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
14+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
15+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
16+
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305 h1:yaM5S0KcY0lIoZo7Fl+oi91b/DdlU2zuWpfHrpWbCS0=
17+
golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
18+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
19+
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
20+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

main.go

Lines changed: 14 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
package main
22

33
import (
4-
"bytes"
54
"flag"
65
"fmt"
6+
"github.com/daixiang0/gci/pkg/gci"
77
"go/scanner"
8-
"io"
9-
"io/ioutil"
108
"os"
11-
"path/filepath"
12-
"strings"
139
)
1410

1511

1612

1713
var (
18-
write = flag.Bool("w", false, "write result to (source) file instead of stdout")
19-
doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
14+
doWrite = flag.Bool("w", false, "doWrite result to (source) file instead of stdout")
15+
doDiff = flag.Bool("d", false, "display diffs instead of rewriting files")
2016

2117
localFlag string
2218

@@ -25,13 +21,7 @@ var (
2521

2622
func report(err error) {
2723
scanner.PrintError(os.Stderr, err)
28-
exitCode = 2
29-
}
30-
31-
func isGoFile(f os.FileInfo) bool {
32-
// ignore non-Go files
33-
name := f.Name()
34-
return !f.IsDir() && !strings.HasPrefix(name, ".") && strings.HasSuffix(name, ".go")
24+
exitCode = 1
3525
}
3626

3727
func parseFlags() []string {
@@ -42,86 +32,30 @@ func parseFlags() []string {
4232
}
4333

4434
func usage() {
45-
fmt.Fprintf(os.Stderr, "usage: gci [flags] [path ...]\n")
35+
_, _ = fmt.Fprintf(os.Stderr, "usage: gci [flags] [path ...]\n")
4636
flag.PrintDefaults()
4737
os.Exit(2)
4838
}
4939

50-
func processFile(filename string, out io.Writer) error {
51-
var err error
52-
53-
f, err := os.Open(filename)
54-
if err != nil {
55-
return err
56-
}
57-
defer f.Close()
58-
59-
src, err := ioutil.ReadAll(f)
60-
if err != nil {
61-
return err
62-
}
63-
64-
ori := make([]byte, len(src))
65-
copy(ori, src)
66-
start := bytes.Index(src, importStartFlag)
67-
// in case no importStartFlag or importStartFlag exist in the commentFlag
68-
if start < 0 {
69-
fmt.Printf("skip file %s since no import\n", filename)
70-
return nil
71-
}
72-
end := bytes.Index(src[start:], importEndFlag) + start
73-
74-
ret := bytes.Split(src[start+len(importStartFlag):end], []byte(linebreak))
75-
76-
p := newPkg(ret, localFlag)
77-
78-
res := append(src[:start+len(importStartFlag)], append(p.fmt(), src[end+1:]...)...)
79-
80-
if !bytes.Equal(ori, res) {
81-
exitCode = 1
82-
83-
if *write {
84-
// On Windows, we need to re-set the permissions from the file. See golang/go#38225.
85-
var perms os.FileMode
86-
if fi, err := os.Stat(filename); err == nil {
87-
perms = fi.Mode() & os.ModePerm
88-
}
89-
err = ioutil.WriteFile(filename, res, perms)
90-
if err != nil {
91-
return err
92-
}
93-
}
94-
if *doDiff {
95-
data, err := diff(ori, res, filename)
96-
if err != nil {
97-
return fmt.Errorf("failed to diff: %v", err)
98-
}
99-
fmt.Printf("diff -u %s %s\n", filepath.ToSlash(filename+".orig"), filepath.ToSlash(filename))
100-
if _, err := out.Write(data); err != nil {
101-
return fmt.Errorf("failed to write: %v", err)
102-
}
103-
}
104-
}
105-
if !*write && !*doDiff {
106-
if _, err = out.Write(res); err != nil {
107-
return fmt.Errorf("failed to write: %v", err)
108-
}
109-
}
110-
111-
return err
112-
}
11340

11441
func main() {
11542
flag.Usage = usage
11643
paths := parseFlags()
44+
45+
flagSet := &gci.FlagSet{
46+
LocalFlag: localFlag,
47+
DoWrite: doWrite,
48+
DoDiff: doDiff,
49+
}
50+
11751
for _, path := range paths {
11852
switch dir, err := os.Stat(path); {
11953
case err != nil:
12054
report(err)
12155
case dir.IsDir():
122-
walkDir(path)
56+
report(gci.WalkDir(path, flagSet))
12357
default:
124-
if err := processFile(path, os.Stdout); err != nil {
58+
if err := gci.ProcessFile(path, os.Stdout, flagSet); err != nil {
12559
report(err)
12660
}
12761
}

pkg.go

Lines changed: 0 additions & 152 deletions
This file was deleted.

pkg/analyzer/analyzer.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package analyzer
2+
3+
import (
4+
"golang.org/x/tools/go/analysis"
5+
"golang.org/x/tools/go/analysis/passes/inspect"
6+
)
7+
8+
var Analyzer = &analysis.Analyzer{
9+
Name: "gci",
10+
Doc: "A tool that control golang package import order and make it always deterministic.",
11+
Requires: []*analysis.Analyzer{inspect.Analyzer},
12+
}

0 commit comments

Comments
 (0)