From 913e57fcda73326711946a3979f9018d59e92a31 Mon Sep 17 00:00:00 2001 From: Xiang Dai Date: Mon, 31 Aug 2020 08:38:05 +0800 Subject: [PATCH] Gci: update the way to call Run() (#1337) Signed-off-by: Xiang Dai --- go.mod | 2 +- go.sum | 4 ++-- pkg/golinters/gci.go | 23 +++++++++++++++++++---- test/linters_test.go | 2 +- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index f758a7e5..959a5cc4 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 github.com/OpenPeeDeeP/depguard v1.0.1 github.com/bombsimon/wsl/v3 v3.1.0 - github.com/daixiang0/gci v0.2.2 + github.com/daixiang0/gci v0.2.4 github.com/denis-tingajkin/go-header v0.3.1 github.com/fatih/color v1.9.0 github.com/go-critic/go-critic v0.5.2 diff --git a/go.sum b/go.sum index 4b1ad657..5cfdda24 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,8 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/daixiang0/gci v0.2.2 h1:ql+M0OX7Z+tPt0WAMpN11rgEvZGc+dqxuw5dn6d3UJM= -github.com/daixiang0/gci v0.2.2/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= +github.com/daixiang0/gci v0.2.4 h1:BUCKk5nlK2m+kRIsoj+wb/5hazHvHeZieBKWd9Afa8Q= +github.com/daixiang0/gci v0.2.4/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= diff --git a/pkg/golinters/gci.go b/pkg/golinters/gci.go index a46e650c..6fa43544 100644 --- a/pkg/golinters/gci.go +++ b/pkg/golinters/gci.go @@ -1,10 +1,13 @@ package golinters import ( + "bytes" + "fmt" "sync" "github.com/daixiang0/gci/pkg/gci" "github.com/pkg/errors" + "github.com/shazow/go-diff/difflib" "golang.org/x/tools/go/analysis" "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" @@ -16,6 +19,7 @@ const gciName = "gci" func NewGci() *goanalysis.Linter { var mu sync.Mutex var resIssues []goanalysis.Issue + differ := difflib.New() analyzer := &analysis.Analyzer{ Name: gciName, @@ -43,17 +47,28 @@ func NewGci() *goanalysis.Linter { var issues []goanalysis.Issue for _, f := range fileNames { - diff, err := gci.Run(f, &gci.FlagSet{LocalFlag: localFlag}) + source, result, err := gci.Run(f, &gci.FlagSet{LocalFlag: localFlag}) if err != nil { return nil, err } - if diff == nil { + if result == nil { continue } - is, err := extractIssuesFromPatch(string(diff), lintCtx.Log, lintCtx, gciName) + diff := bytes.Buffer{} + _, err = diff.WriteString(fmt.Sprintf("--- %[1]s\n+++ %[1]s\n", f)) if err != nil { - return nil, errors.Wrapf(err, "can't extract issues from gci diff output %q", string(diff)) + return nil, fmt.Errorf("can't write diff header: %v", err) + } + + err = differ.Diff(&diff, bytes.NewReader(source), bytes.NewReader(result)) + if err != nil { + return nil, fmt.Errorf("can't get gci diff output: %v", err) + } + + is, err := extractIssuesFromPatch(diff.String(), lintCtx.Log, lintCtx, gciName) + if err != nil { + return nil, errors.Wrapf(err, "can't extract issues from gci diff output %q", diff.String()) } for i := range is { diff --git a/test/linters_test.go b/test/linters_test.go index 084d431a..30734e3b 100644 --- a/test/linters_test.go +++ b/test/linters_test.go @@ -96,7 +96,7 @@ func TestGciLocal(t *testing.T) { assert.NoError(t, err) testshared.NewLintRunner(t).RunWithYamlConfig(string(cfg), args...). - ExpectHasIssue("testdata/gci/gci.go:8: File is not `gci`-ed") + ExpectHasIssue("testdata/gci/gci.go:7: File is not `gci`-ed") } func saveConfig(t *testing.T, cfg map[string]interface{}) (cfgPath string, finishFunc func()) {