11package golinters
22
33import (
4+ "bytes"
5+ "fmt"
46 "sync"
57
68 "github.com/daixiang0/gci/pkg/gci"
79 "github.com/pkg/errors"
10+ "github.com/shazow/go-diff/difflib"
811 "golang.org/x/tools/go/analysis"
912
1013 "github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
@@ -16,6 +19,7 @@ const gciName = "gci"
1619func NewGci () * goanalysis.Linter {
1720 var mu sync.Mutex
1821 var resIssues []goanalysis.Issue
22+ differ := difflib .New ()
1923
2024 analyzer := & analysis.Analyzer {
2125 Name : gciName ,
@@ -43,17 +47,28 @@ func NewGci() *goanalysis.Linter {
4347 var issues []goanalysis.Issue
4448
4549 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 })
4751 if err != nil {
4852 return nil , err
4953 }
50- if diff == nil {
54+ if result == nil {
5155 continue
5256 }
5357
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 ))
5560 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 ())
5772 }
5873
5974 for i := range is {
0 commit comments