From 596a91f00faa1bd9a2f2a03f4711f82cb9be1a30 Mon Sep 17 00:00:00 2001 From: Colin Arnott Date: Wed, 3 Mar 2021 19:21:52 +0000 Subject: [PATCH] pkg/golinters: add noreplace Add support for enforcing that go.mod should not contain replace clauses. --- assets/github-action-config.json | 8 +++-- go.mod | 1 + go.sum | 5 ++- pkg/golinters/noreplace.go | 53 ++++++++++++++++++++++++++++++++ pkg/lint/lintersdb/manager.go | 4 +++ 5 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 pkg/golinters/noreplace.go diff --git a/assets/github-action-config.json b/assets/github-action-config.json index e83d2d560e3c..99e72c7838fe 100644 --- a/assets/github-action-config.json +++ b/assets/github-action-config.json @@ -1,8 +1,8 @@ { "MinorVersionToConfig": { "latest": { - "TargetVersion": "v1.37.1", - "AssetURL": "https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.tar.gz" + "TargetVersion": "v1.38.0", + "AssetURL": "https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.38.0-linux-amd64.tar.gz" }, "v1.10": { "Error": "golangci-lint version 'v1.10' isn't supported: we support only v1.14.0 and later versions" @@ -115,6 +115,10 @@ "TargetVersion": "v1.37.1", "AssetURL": "https://github.com/golangci/golangci-lint/releases/download/v1.37.1/golangci-lint-1.37.1-linux-amd64.tar.gz" }, + "v1.38": { + "TargetVersion": "v1.38.0", + "AssetURL": "https://github.com/golangci/golangci-lint/releases/download/v1.38.0/golangci-lint-1.38.0-linux-amd64.tar.gz" + }, "v1.4": { "Error": "golangci-lint version 'v1.4' isn't supported: we support only v1.14.0 and later versions" }, diff --git a/go.mod b/go.mod index 1e76ab4e7472..ecc2112cb221 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.14 require ( 4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a + git.sr.ht/~urandom/noreplace v0.0.0-20210303085701-97f39e5a1bba github.com/BurntSushi/toml v0.3.1 github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 github.com/OpenPeeDeeP/depguard v1.0.1 diff --git a/go.sum b/go.sum index 9571cb8a4ef3..e66d210498aa 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +git.sr.ht/~urandom/noreplace v0.0.0-20210303085701-97f39e5a1bba h1:EtOYwKPazzAAxzqigCp0JAxe0T3e6lt0yWcKW0LIcNU= +git.sr.ht/~urandom/noreplace v0.0.0-20210303085701-97f39e5a1bba/go.mod h1:U4dO6Da6Bk/lCoZqo630j/XoYccw5XHl10D0p5BgQrE= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -477,8 +479,9 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0 h1:8pl+sMODzuvGJkmj2W4kZihvVb5mKm8pB/X44PIQHv8= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= diff --git a/pkg/golinters/noreplace.go b/pkg/golinters/noreplace.go new file mode 100644 index 000000000000..e3a6d08f8267 --- /dev/null +++ b/pkg/golinters/noreplace.go @@ -0,0 +1,53 @@ +package golinters + +import ( + "sync" + + "git.sr.ht/~urandom/noreplace" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" + "github.com/golangci/golangci-lint/pkg/lint/linter" + "github.com/golangci/golangci-lint/pkg/result" +) + +const noreplaceName = "noreplace" + +// NewNoreplace returns a new noreplace linter. +func NewNoreplace() *goanalysis.Linter { + var issues []goanalysis.Issue + var mu sync.Mutex + analyzer := &analysis.Analyzer{ + Name: goanalysis.TheOnlyAnalyzerName, + Doc: goanalysis.TheOnlyanalyzerDoc, + } + return goanalysis.NewLinter( + noreplaceName, + "Block the use of replace directives Go modules.", + []*analysis.Analyzer{analyzer}, + nil, + ).WithContextSetter(func(lintCtx *linter.Context) { + analyzer.Run = func(pass *analysis.Pass) (interface{}, error) { + pp, err := noreplace.Check() + if err != nil { + lintCtx.Log.Warnf("running %s failed: %s: if you are not using go modules "+ + "it is suggested to disable this linter", noreplaceName, err) + return nil, nil + } + mu.Lock() + defer mu.Unlock() + for _, p := range pp { + issues = append(issues, goanalysis.NewIssue(&result.Issue{ + FromLinter: noreplaceName, + Pos: p[0], + LineRange: &result.Range{From: p[0].Line, To: p[1].Line}, + Replacement: &result.Replacement{NeedOnlyDelete: true}, + Text: noreplace.Text, + }, pass)) + } + return nil, nil + } + }).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue { + return issues + }).WithLoadMode(goanalysis.LoadModeSyntax) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 086309567b25..cafa13b5da7a 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -394,6 +394,10 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetStyle). WithLoadForGoAnalysis(). WithURL("https://github.com/gostaticanalysis/forcetypeassert"), + linter.NewConfig(golinters.NewNoreplace()). + WithPresets(linter.PresetStyle). + WithAutoFix(). + WithURL("https://git.sr.ht/~urandom/noreplace"), // nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives linter.NewConfig(golinters.NewNoLintLint()).