1
1
package main
2
2
3
3
import (
4
- "bytes"
5
4
"flag"
6
5
"fmt"
6
+ "github.com/daixiang0/gci/pkg/gci"
7
7
"go/scanner"
8
- "io"
9
- "io/ioutil"
10
8
"os"
11
- "path/filepath"
12
- "strings"
13
9
)
14
10
15
11
16
12
17
13
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" )
20
16
21
17
localFlag string
22
18
25
21
26
22
func report (err error ) {
27
23
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
35
25
}
36
26
37
27
func parseFlags () []string {
@@ -42,86 +32,30 @@ func parseFlags() []string {
42
32
}
43
33
44
34
func usage () {
45
- fmt .Fprintf (os .Stderr , "usage: gci [flags] [path ...]\n " )
35
+ _ , _ = fmt .Fprintf (os .Stderr , "usage: gci [flags] [path ...]\n " )
46
36
flag .PrintDefaults ()
47
37
os .Exit (2 )
48
38
}
49
39
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
- }
113
40
114
41
func main () {
115
42
flag .Usage = usage
116
43
paths := parseFlags ()
44
+
45
+ flagSet := & gci.FlagSet {
46
+ LocalFlag : localFlag ,
47
+ DoWrite : doWrite ,
48
+ DoDiff : doDiff ,
49
+ }
50
+
117
51
for _ , path := range paths {
118
52
switch dir , err := os .Stat (path ); {
119
53
case err != nil :
120
54
report (err )
121
55
case dir .IsDir ():
122
- walkDir ( path )
56
+ report ( gci . WalkDir ( path , flagSet ) )
123
57
default :
124
- if err := processFile (path , os .Stdout ); err != nil {
58
+ if err := gci . ProcessFile (path , os .Stdout , flagSet ); err != nil {
125
59
report (err )
126
60
}
127
61
}
0 commit comments