1
1
package golinters
2
2
3
3
import (
4
+ "bytes"
5
+ "fmt"
4
6
"sync"
5
7
6
8
"github.com/daixiang0/gci/pkg/gci"
7
9
"github.com/pkg/errors"
10
+ "github.com/shazow/go-diff/difflib"
8
11
"golang.org/x/tools/go/analysis"
9
12
10
13
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
@@ -16,6 +19,7 @@ const gciName = "gci"
16
19
func NewGci () * goanalysis.Linter {
17
20
var mu sync.Mutex
18
21
var resIssues []goanalysis.Issue
22
+ differ := difflib .New ()
19
23
20
24
analyzer := & analysis.Analyzer {
21
25
Name : gciName ,
@@ -43,17 +47,28 @@ func NewGci() *goanalysis.Linter {
43
47
var issues []goanalysis.Issue
44
48
45
49
for _ , f := range fileNames {
46
- diff , err := gci .Run (f , & gci.FlagSet {LocalFlag : localFlag })
50
+ source , result , err := gci .Run (f , & gci.FlagSet {LocalFlag : localFlag })
47
51
if err != nil {
48
52
return nil , err
49
53
}
50
- if diff == nil {
54
+ if result == nil {
51
55
continue
52
56
}
53
57
54
- is , err := extractIssuesFromPatch (string (diff ), lintCtx .Log , lintCtx , gciName )
58
+ diff := bytes.Buffer {}
59
+ _ , err = diff .WriteString (fmt .Sprintf ("--- %[1]s\n +++ %[1]s\n " , f ))
55
60
if err != nil {
56
- return nil , errors .Wrapf (err , "can't extract issues from gci diff output %q" , string (diff ))
61
+ return nil , fmt .Errorf ("can't write diff header: %v" , err )
62
+ }
63
+
64
+ err = differ .Diff (& diff , bytes .NewReader (source ), bytes .NewReader (result ))
65
+ if err != nil {
66
+ return nil , fmt .Errorf ("can't get gci diff output: %v" , err )
67
+ }
68
+
69
+ is , err := extractIssuesFromPatch (diff .String (), lintCtx .Log , lintCtx , gciName )
70
+ if err != nil {
71
+ return nil , errors .Wrapf (err , "can't extract issues from gci diff output %q" , diff .String ())
57
72
}
58
73
59
74
for i := range is {
0 commit comments