From fcc6d71be2c3ce7d9305c04fc2e87af554571bac Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Mon, 22 Feb 2021 20:37:25 +0100 Subject: go.mod: update golangci-lint to v1.37 --- .../github.com/tommy-muehle/go-mnd/.editorconfig | 12 -- vendor/github.com/tommy-muehle/go-mnd/.gitignore | 2 - .../github.com/tommy-muehle/go-mnd/.goreleaser.yml | 30 --- vendor/github.com/tommy-muehle/go-mnd/.travis.yml | 12 -- vendor/github.com/tommy-muehle/go-mnd/LICENSE | 21 -- vendor/github.com/tommy-muehle/go-mnd/README.md | 111 ---------- vendor/github.com/tommy-muehle/go-mnd/analyzer.go | 91 -------- .../tommy-muehle/go-mnd/checks/argument.go | 107 ---------- .../tommy-muehle/go-mnd/checks/assign.go | 66 ------ .../github.com/tommy-muehle/go-mnd/checks/case.go | 68 ------ .../tommy-muehle/go-mnd/checks/checks.go | 3 - .../tommy-muehle/go-mnd/checks/condition.go | 55 ----- .../tommy-muehle/go-mnd/checks/operation.go | 73 ------- .../tommy-muehle/go-mnd/checks/return.go | 50 ----- .../tommy-muehle/go-mnd/config/config.go | 84 -------- vendor/github.com/tommy-muehle/go-mnd/go.mod | 11 - vendor/github.com/tommy-muehle/go-mnd/go.sum | 18 -- .../tommy-muehle/go-mnd/v2/.editorconfig | 21 ++ .../tommy-muehle/go-mnd/v2/.gitattributes | 9 + .../github.com/tommy-muehle/go-mnd/v2/.gitignore | 3 + .../tommy-muehle/go-mnd/v2/.goreleaser.yml | 27 +++ .../github.com/tommy-muehle/go-mnd/v2/Dockerfile | 17 ++ vendor/github.com/tommy-muehle/go-mnd/v2/LICENSE | 21 ++ vendor/github.com/tommy-muehle/go-mnd/v2/Makefile | 32 +++ vendor/github.com/tommy-muehle/go-mnd/v2/README.md | 230 +++++++++++++++++++++ .../github.com/tommy-muehle/go-mnd/v2/action.yml | 19 ++ .../github.com/tommy-muehle/go-mnd/v2/analyzer.go | 115 +++++++++++ .../tommy-muehle/go-mnd/v2/checks/argument.go | 118 +++++++++++ .../tommy-muehle/go-mnd/v2/checks/assign.go | 86 ++++++++ .../tommy-muehle/go-mnd/v2/checks/case.go | 68 ++++++ .../tommy-muehle/go-mnd/v2/checks/checks.go | 3 + .../tommy-muehle/go-mnd/v2/checks/condition.go | 55 +++++ .../tommy-muehle/go-mnd/v2/checks/operation.go | 77 +++++++ .../tommy-muehle/go-mnd/v2/checks/return.go | 68 ++++++ .../tommy-muehle/go-mnd/v2/config/config.go | 118 +++++++++++ .../tommy-muehle/go-mnd/v2/entrypoint.sh | 7 + vendor/github.com/tommy-muehle/go-mnd/v2/go.mod | 9 + vendor/github.com/tommy-muehle/go-mnd/v2/go.sum | 28 +++ 38 files changed, 1131 insertions(+), 814 deletions(-) delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/.editorconfig delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/.gitignore delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/.goreleaser.yml delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/.travis.yml delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/LICENSE delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/README.md delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/analyzer.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/argument.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/assign.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/case.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/checks.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/condition.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/operation.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/checks/return.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/config/config.go delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/go.mod delete mode 100644 vendor/github.com/tommy-muehle/go-mnd/go.sum create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/.editorconfig create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/.gitattributes create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/.gitignore create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/.goreleaser.yml create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/Dockerfile create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/LICENSE create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/Makefile create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/README.md create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/action.yml create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/analyzer.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/argument.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/assign.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/case.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/checks.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/condition.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/operation.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/checks/return.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/config/config.go create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/entrypoint.sh create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/go.mod create mode 100644 vendor/github.com/tommy-muehle/go-mnd/v2/go.sum (limited to 'vendor/github.com/tommy-muehle') diff --git a/vendor/github.com/tommy-muehle/go-mnd/.editorconfig b/vendor/github.com/tommy-muehle/go-mnd/.editorconfig deleted file mode 100644 index 316b8cae0..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/.editorconfig +++ /dev/null @@ -1,12 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_size = 4 -indent_style = space -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.md] -trim_trailing_whitespace = false \ No newline at end of file diff --git a/vendor/github.com/tommy-muehle/go-mnd/.gitignore b/vendor/github.com/tommy-muehle/go-mnd/.gitignore deleted file mode 100644 index edd9d60a7..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -build/ -dist/ diff --git a/vendor/github.com/tommy-muehle/go-mnd/.goreleaser.yml b/vendor/github.com/tommy-muehle/go-mnd/.goreleaser.yml deleted file mode 100644 index 0986ff2f0..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/.goreleaser.yml +++ /dev/null @@ -1,30 +0,0 @@ -builds: - - - main: ./cmd/mnd/main.go - binary: mnd - goos: - - windows - - darwin - - linux - goarch: - - amd64 - ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.buildTime={{.Date}}`. - -archives: - - - format: tar.gz - format_overrides: - - goos: windows - format: zip - -brews: - - - name: mnd - github: - owner: tommy-muehle - name: homebrew-tap - folder: Formula - homepage: https://github.com/tommy-muehle/go-mnd - description: Magic number detector for Go - test: | - system "#{bin}/mnd --version" diff --git a/vendor/github.com/tommy-muehle/go-mnd/.travis.yml b/vendor/github.com/tommy-muehle/go-mnd/.travis.yml deleted file mode 100644 index fd76a2fc6..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.13.x - - 1.12.x - - tip - -script: - - go test -v ./... - -notifications: - email: false diff --git a/vendor/github.com/tommy-muehle/go-mnd/LICENSE b/vendor/github.com/tommy-muehle/go-mnd/LICENSE deleted file mode 100644 index 8825fad20..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Tommy Muehle - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/tommy-muehle/go-mnd/README.md b/vendor/github.com/tommy-muehle/go-mnd/README.md deleted file mode 100644 index a85ed780c..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/README.md +++ /dev/null @@ -1,111 +0,0 @@ -# go-mnd - Magic number detector for Golang - -A vet analyzer to detect magic numbers. - -> **What is a magic number?** -> A magic number is a numeric literal that is not defined as a constant, but which may change, and therefore can be hard to update. It's considered a bad programming practice to use numbers directly in any source code without an explanation. It makes programs harder to read, understand, and maintain. - -## Project status - -[![Build Status](https://travis-ci.org/tommy-muehle/go-mnd.svg?branch=master)](https://travis-ci.org/tommy-muehle/go-mnd) -[![Go Report Card](https://goreportcard.com/badge/github.com/tommy-muehle/go-mnd)](https://goreportcard.com/report/github.com/tommy-muehle/go-mnd) - -## Install - -This analyzer requires Golang in version >= 1.12 because it's depends on the **go/analysis** API. - -``` -go get github.com/tommy-muehle/go-mnd/cmd/mnd -``` - -To install with [Homebrew](https://brew.sh/), run: - -``` -brew tap tommy-muehle/tap && brew install tommy-muehle/tap/mnd -``` - -On Windows download the [latest release](https://github.com/tommy-muehle/go-mnd/releases). - -## Usage - -[![asciicast](https://asciinema.org/a/231021.svg)](https://asciinema.org/a/231021) - -``` -go vet -vettool $(which mnd) ./... -``` - -or directly - -``` -mnd ./... -``` - -The ```-checks``` option let's you define a comma separated list of checks. - -The ```-ignored-numbers``` option let's you define a comma separated list of numbers to ignore. - -The ```-excludes``` option let's you define a comma separated list of regexp patterns to exclude. - -## Checks - -By default this detector analyses arguments, assigns, cases, conditions, operations and return statements. - -* argument - -``` -t := http.StatusText(200) -``` - -* assign - -``` -c := &http.Client{ - Timeout: 5 * time.Second, -} -``` - -* case - -``` -switch x { - case 3: -} -``` - -* condition - -``` -if x > 7 { -} -``` - -* operation - -``` -var x, y int -y = 10 * x -``` - -* return - -``` -return 3 -``` - -## Excludes - -By default the numbers 0 and 1 as well as test files are excluded! - -### Further known excludes - -The function "Date" in the "Time" package. - -``` -t := time.Date(2017, time.September, 26, 12, 13, 14, 0, time.UTC) -``` - -Additional custom excludes can be defined via option flag. - -## License - -The MIT License (MIT). Please see [LICENSE](LICENSE) for more information. diff --git a/vendor/github.com/tommy-muehle/go-mnd/analyzer.go b/vendor/github.com/tommy-muehle/go-mnd/analyzer.go deleted file mode 100644 index 9930170f2..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/analyzer.go +++ /dev/null @@ -1,91 +0,0 @@ -package magic_numbers - -import ( - "flag" - "go/ast" - - "github.com/tommy-muehle/go-mnd/checks" - "github.com/tommy-muehle/go-mnd/config" - - "golang.org/x/tools/go/analysis" - "golang.org/x/tools/go/analysis/passes/inspect" - "golang.org/x/tools/go/ast/inspector" -) - -const Doc = `magic number detector` - -var Analyzer = &analysis.Analyzer{ - Name: "mnd", - Doc: Doc, - Run: run, - Flags: options(), - Requires: []*analysis.Analyzer{inspect.Analyzer}, - RunDespiteErrors: true, -} - -type Checker interface { - NodeFilter() []ast.Node - Check(n ast.Node) -} - -func options() flag.FlagSet { - options := flag.NewFlagSet("", flag.ExitOnError) - options.String("excludes", "", "comma separated list of patterns to exclude from analysis") - options.String("ignored-numbers", "", "comma separated list of numbers excluded from analysis") - options.String( - "checks", - checks.ArgumentCheck+","+ - checks.CaseCheck+","+ - checks.ConditionCheck+","+ - checks.OperationCheck+","+ - checks.ReturnCheck+","+ - checks.AssignCheck, - "comma separated list of checks", - ) - - return *options -} - -func run(pass *analysis.Pass) (interface{}, error) { - conf := config.WithOptions( - config.WithCustomChecks(pass.Analyzer.Flags.Lookup("checks").Value.String()), - config.WithExcludes(pass.Analyzer.Flags.Lookup("excludes").Value.String()), - config.WithIgnoredNumbers(pass.Analyzer.Flags.Lookup("ignored-numbers").Value.String()), - ) - - var checker []Checker - if conf.IsCheckEnabled(checks.ArgumentCheck) { - checker = append(checker, checks.NewArgumentAnalyzer(pass, conf)) - } - if conf.IsCheckEnabled(checks.CaseCheck) { - checker = append(checker, checks.NewCaseAnalyzer(pass, conf)) - } - if conf.IsCheckEnabled(checks.ConditionCheck) { - checker = append(checker, checks.NewConditionAnalyzer(pass, conf)) - } - if conf.IsCheckEnabled(checks.OperationCheck) { - checker = append(checker, checks.NewOperationAnalyzer(pass, conf)) - } - if conf.IsCheckEnabled(checks.ReturnCheck) { - checker = append(checker, checks.NewReturnAnalyzer(pass, conf)) - } - if conf.IsCheckEnabled(checks.AssignCheck) { - checker = append(checker, checks.NewAssignAnalyzer(pass, conf)) - } - - i := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) - - for _, c := range checker { - i.Preorder(c.NodeFilter(), func(node ast.Node) { - for _, exclude := range conf.Excludes { - if exclude.MatchString(pass.Fset.Position(node.Pos()).Filename) { - return - } - } - - c.Check(node) - }) - } - - return nil, nil -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/argument.go b/vendor/github.com/tommy-muehle/go-mnd/checks/argument.go deleted file mode 100644 index 34cc1d09f..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/argument.go +++ /dev/null @@ -1,107 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const ArgumentCheck = "argument" - -// Known excludes for the argument check. -var argumentExcludes = map[string]string{ - // package: function - "time": "Date", // https://golang.org/pkg/time/#Date -} - -type ArgumentAnalyzer struct { - config *config.Config - pass *analysis.Pass -} - -func NewArgumentAnalyzer(pass *analysis.Pass, config *config.Config) *ArgumentAnalyzer { - return &ArgumentAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *ArgumentAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.CallExpr)(nil), - } -} - -func (a *ArgumentAnalyzer) Check(n ast.Node) { - expr, ok := n.(*ast.CallExpr) - if !ok { - return - } - - // Don't check if package and function combination is excluded - if s, ok := expr.Fun.(*ast.SelectorExpr); ok && a.isExcluded(s) { - return - } - - for i, arg := range expr.Args { - switch x := arg.(type) { - case *ast.BasicLit: - if !a.isMagicNumber(x) { - continue - } - // If it's a magic number and has no previous element, report it - if i == 0 { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) - } else { - // Otherwise check the previous element type - switch expr.Args[i-1].(type) { - case *ast.ChanType: - // When it's not a simple buffered channel, report it - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) - } - } - } - case *ast.BinaryExpr: - a.checkBinaryExpr(x) - } - } -} - -func (a *ArgumentAnalyzer) isExcluded(expr *ast.SelectorExpr) bool { - var p string - - switch x := expr.X.(type) { - case *ast.Ident: - p = x.Name - } - - if v, ok := argumentExcludes[p]; ok && v == expr.Sel.Name { - return true - } - - return false -} - -func (a *ArgumentAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { - switch x := expr.X.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) - } - } - - switch y := expr.Y.(type) { - case *ast.BasicLit: - if a.isMagicNumber(y) { - a.pass.Reportf(y.Pos(), reportMsg, y.Value, ArgumentCheck) - } - } -} - -func (a *ArgumentAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/assign.go b/vendor/github.com/tommy-muehle/go-mnd/checks/assign.go deleted file mode 100644 index 8699ce17f..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/assign.go +++ /dev/null @@ -1,66 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const AssignCheck = "assign" - -type AssignAnalyzer struct { - pass *analysis.Pass - config *config.Config -} - -func NewAssignAnalyzer(pass *analysis.Pass, config *config.Config) *AssignAnalyzer { - return &AssignAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *AssignAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.KeyValueExpr)(nil), - } -} - -func (a *AssignAnalyzer) Check(n ast.Node) { - expr, ok := n.(*ast.KeyValueExpr) - if !ok { - return - } - - switch x := expr.Value.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, AssignCheck) - } - case *ast.BinaryExpr: - a.checkBinaryExpr(x) - } -} - -func (a *AssignAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { - switch x := expr.X.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, AssignCheck) - } - } - - switch y := expr.Y.(type) { - case *ast.BasicLit: - if a.isMagicNumber(y) { - a.pass.Reportf(y.Pos(), reportMsg, y.Value, AssignCheck) - } - } -} - -func (a *AssignAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/case.go b/vendor/github.com/tommy-muehle/go-mnd/checks/case.go deleted file mode 100644 index d7993ede0..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/case.go +++ /dev/null @@ -1,68 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const CaseCheck = "case" - -type CaseAnalyzer struct { - pass *analysis.Pass - config *config.Config -} - -func NewCaseAnalyzer(pass *analysis.Pass, config *config.Config) *CaseAnalyzer { - return &CaseAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *CaseAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.CaseClause)(nil), - } -} - -func (a *CaseAnalyzer) Check(n ast.Node) { - caseClause, ok := n.(*ast.CaseClause) - if !ok { - return - } - - for _, c := range caseClause.List { - switch x := c.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, CaseCheck) - } - case *ast.BinaryExpr: - a.checkBinaryExpr(x) - } - } -} - -func (a *CaseAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { - switch x := expr.X.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, CaseCheck) - } - } - - switch y := expr.Y.(type) { - case *ast.BasicLit: - if a.isMagicNumber(y) { - a.pass.Reportf(y.Pos(), reportMsg, y.Value, CaseCheck) - } - } -} - -func (a *CaseAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/checks.go b/vendor/github.com/tommy-muehle/go-mnd/checks/checks.go deleted file mode 100644 index deff0c7bf..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/checks.go +++ /dev/null @@ -1,3 +0,0 @@ -package checks - -const reportMsg = "Magic number: %v, in <%s> detected" diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/condition.go b/vendor/github.com/tommy-muehle/go-mnd/checks/condition.go deleted file mode 100644 index b61bc0de9..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/condition.go +++ /dev/null @@ -1,55 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const ConditionCheck = "condition" - -type ConditionAnalyzer struct { - pass *analysis.Pass - config *config.Config -} - -func NewConditionAnalyzer(pass *analysis.Pass, config *config.Config) *ConditionAnalyzer { - return &ConditionAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *ConditionAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.IfStmt)(nil), - } -} - -func (a *ConditionAnalyzer) Check(n ast.Node) { - expr, ok := n.(*ast.IfStmt).Cond.(*ast.BinaryExpr) - if !ok { - return - } - - switch x := expr.X.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, ConditionCheck) - } - } - - switch y := expr.Y.(type) { - case *ast.BasicLit: - if a.isMagicNumber(y) { - a.pass.Reportf(y.Pos(), reportMsg, y.Value, ConditionCheck) - } - } -} - -func (a *ConditionAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/operation.go b/vendor/github.com/tommy-muehle/go-mnd/checks/operation.go deleted file mode 100644 index f1f8cf445..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/operation.go +++ /dev/null @@ -1,73 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const OperationCheck = "operation" - -type OperationAnalyzer struct { - pass *analysis.Pass - config *config.Config -} - -func NewOperationAnalyzer(pass *analysis.Pass, config *config.Config) *OperationAnalyzer { - return &OperationAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *OperationAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.AssignStmt)(nil), - } -} - -func (a *OperationAnalyzer) Check(n ast.Node) { - stmt, ok := n.(*ast.AssignStmt) - if !ok { - return - } - - for _, expr := range stmt.Rhs { - switch x := expr.(type) { - case *ast.BinaryExpr: - switch xExpr := x.X.(type) { - case *ast.BinaryExpr: - a.checkBinaryExpr(xExpr) - } - switch yExpr := x.Y.(type) { - case *ast.BinaryExpr: - a.checkBinaryExpr(yExpr) - } - - a.checkBinaryExpr(x) - } - } -} - -func (a *OperationAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { - switch x := expr.X.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, OperationCheck) - } - } - - switch y := expr.Y.(type) { - case *ast.BasicLit: - if a.isMagicNumber(y) { - a.pass.Reportf(y.Pos(), reportMsg, y.Value, OperationCheck) - } - } -} - -func (a *OperationAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/checks/return.go b/vendor/github.com/tommy-muehle/go-mnd/checks/return.go deleted file mode 100644 index be7f54697..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/checks/return.go +++ /dev/null @@ -1,50 +0,0 @@ -package checks - -import ( - "go/ast" - "go/token" - - "golang.org/x/tools/go/analysis" - - config "github.com/tommy-muehle/go-mnd/config" -) - -const ReturnCheck = "return" - -type ReturnAnalyzer struct { - pass *analysis.Pass - config *config.Config -} - -func NewReturnAnalyzer(pass *analysis.Pass, config *config.Config) *ReturnAnalyzer { - return &ReturnAnalyzer{ - pass: pass, - config: config, - } -} - -func (a *ReturnAnalyzer) NodeFilter() []ast.Node { - return []ast.Node{ - (*ast.ReturnStmt)(nil), - } -} - -func (a *ReturnAnalyzer) Check(n ast.Node) { - stmt, ok := n.(*ast.ReturnStmt) - if !ok { - return - } - - for _, expr := range stmt.Results { - switch x := expr.(type) { - case *ast.BasicLit: - if a.isMagicNumber(x) { - a.pass.Reportf(x.Pos(), reportMsg, x.Value, ReturnCheck) - } - } - } -} - -func (a *ReturnAnalyzer) isMagicNumber(l *ast.BasicLit) bool { - return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/config/config.go b/vendor/github.com/tommy-muehle/go-mnd/config/config.go deleted file mode 100644 index 35c82eaf2..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/config/config.go +++ /dev/null @@ -1,84 +0,0 @@ -package config - -import ( - "regexp" - "strings" -) - -type Config struct { - Checks map[string]bool - IgnoredNumbers map[string]struct{} - Excludes []*regexp.Regexp -} - -type Option func(config *Config) - -func DefaultConfig() *Config { - return &Config{ - Checks: map[string]bool{}, - IgnoredNumbers: map[string]struct{}{ - "0": {}, - "1": {}, - }, - Excludes: []*regexp.Regexp{ - regexp.MustCompile(`_test.go`), - }, - } -} - -func WithOptions(options ...Option) *Config { - c := DefaultConfig() - for _, option := range options { - option(c) - } - return c -} - -func WithExcludes(excludes string) Option { - return func(config *Config) { - if excludes == "" { - return - } - - for _, exclude := range strings.Split(excludes, ",") { - config.Excludes = append(config.Excludes, regexp.MustCompile(exclude)) - } - } -} - -func WithIgnoredNumbers(numbers string) Option { - return func(config *Config) { - if numbers == "" { - return - } - - for _, number := range strings.Split(numbers, ",") { - config.IgnoredNumbers[number] = struct{}{} - } - } -} - -func WithCustomChecks(checks string) Option { - return func(config *Config) { - if checks == "" { - return - } - - for name, _ := range config.Checks { - config.Checks[name] = false - } - - for _, name := range strings.Split(checks, ",") { - config.Checks[name] = true - } - } -} - -func (c *Config) IsCheckEnabled(name string) bool { - return c.Checks[name] -} - -func (c *Config) IsIgnoredNumber(number string) bool { - _, ok := c.IgnoredNumbers[number] - return ok -} diff --git a/vendor/github.com/tommy-muehle/go-mnd/go.mod b/vendor/github.com/tommy-muehle/go-mnd/go.mod deleted file mode 100644 index 5119a7cc1..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/go.mod +++ /dev/null @@ -1,11 +0,0 @@ -module github.com/tommy-muehle/go-mnd - -go 1.12 - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/stretchr/objx v0.1.1 // indirect - github.com/stretchr/testify v1.3.0 - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect - golang.org/x/tools v0.0.0-20190221204921-83362c3779f5 -) diff --git a/vendor/github.com/tommy-muehle/go-mnd/go.sum b/vendor/github.com/tommy-muehle/go-mnd/go.sum deleted file mode 100644 index bdc021ab2..000000000 --- a/vendor/github.com/tommy-muehle/go-mnd/go.sum +++ /dev/null @@ -1,18 +0,0 @@ -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= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5 h1:ev5exjGDsOo0NPTB0qdCcE53BfWl1IICJlhgXgfT9fM= -golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/.editorconfig b/vendor/github.com/tommy-muehle/go-mnd/v2/.editorconfig new file mode 100644 index 000000000..fe2c20fb0 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/.editorconfig @@ -0,0 +1,21 @@ +root = true + +[*] +charset = utf-8 +indent_size = 4 +indent_style = space +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.json] +indent_size = 2 + +[*.{yaml,yml}] +indent_size = 2 + +[Makefile] +indent_style = tab diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/.gitattributes b/vendor/github.com/tommy-muehle/go-mnd/v2/.gitattributes new file mode 100644 index 000000000..005358190 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/.gitattributes @@ -0,0 +1,9 @@ +/.gitattributes export-ignore +/.gitignore export-ignore +/.editorconfig export-ignore +/.goreleaser.yml export-ignore +/.github/ export-ignore +/examples/ export-ignore +/testdata/ export-ignore +/tools/ export-ignore +/Makefile export-ignore diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/.gitignore b/vendor/github.com/tommy-muehle/go-mnd/v2/.gitignore new file mode 100644 index 000000000..abc11b330 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/.gitignore @@ -0,0 +1,3 @@ +build/ +dist/ +coverage.txt diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/.goreleaser.yml b/vendor/github.com/tommy-muehle/go-mnd/v2/.goreleaser.yml new file mode 100644 index 000000000..e0a87b838 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/.goreleaser.yml @@ -0,0 +1,27 @@ +builds: + - main: ./cmd/mnd/main.go + binary: mnd + goos: + - windows + - darwin + - linux + goarch: + - amd64 + ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.buildTime={{.Date}}`. + +archives: + - format: tar.gz + format_overrides: + - goos: windows + format: zip + +brews: + - name: mnd + github: + owner: tommy-muehle + name: homebrew-tap + folder: Formula + homepage: https://github.com/tommy-muehle/go-mnd + description: Magic number detector for Go + test: | + system "#{bin}/mnd --version" diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/Dockerfile b/vendor/github.com/tommy-muehle/go-mnd/v2/Dockerfile new file mode 100644 index 000000000..bb8e2b7f4 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/Dockerfile @@ -0,0 +1,17 @@ +ARG GO_VERSION=1.15 + +FROM golang:${GO_VERSION}-alpine AS builder +RUN apk add --update --no-cache make git curl gcc libc-dev +RUN mkdir -p /build +WORKDIR /build +COPY . /build/ +RUN go mod download +RUN go build -o go-mnd cmd/mnd/main.go + +FROM golang:${GO_VERSION}-alpine +RUN apk add --update --no-cache bash git gcc libc-dev +COPY --from=builder /build/go-mnd /bin/go-mnd +COPY entrypoint.sh /bin/entrypoint.sh +VOLUME /app +WORKDIR /app +ENTRYPOINT ["/bin/entrypoint.sh"] diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/LICENSE b/vendor/github.com/tommy-muehle/go-mnd/v2/LICENSE new file mode 100644 index 000000000..8825fad20 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2019 Tommy Muehle + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/Makefile b/vendor/github.com/tommy-muehle/go-mnd/v2/Makefile new file mode 100644 index 000000000..b8a32316b --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/Makefile @@ -0,0 +1,32 @@ +GIT_TAG?= $(shell git describe --abbrev=0) + +GO_VERSION = 1.15 +BUILDFLAGS := '-w -s' + +IMAGE_REPO = "tommymuehle" +BIN = "go-mnd" + +clean: + rm -rf build dist coverage.txt + +test: + go test -race ./... + +test-coverage: + go test -race -coverprofile=coverage.txt -covermode=atomic -coverpkg=./checks,./config + +build: + go build -o build/$(BIN) cmd/mnd/main.go + +image: + @echo "Building the Docker image..." + docker build --rm -t $(IMAGE_REPO)/$(BIN):$(GIT_TAG) --build-arg GO_VERSION=$(GO_VERSION) . + docker tag $(IMAGE_REPO)/$(BIN):$(GIT_TAG) $(IMAGE_REPO)/$(BIN):$(GIT_TAG) + docker tag $(IMAGE_REPO)/$(BIN):$(GIT_TAG) $(IMAGE_REPO)/$(BIN):latest + +image-push: image + @echo "Pushing the Docker image..." + docker push $(IMAGE_REPO)/$(BIN):$(GIT_TAG) + docker push $(IMAGE_REPO)/$(BIN):latest + +.PHONY: clean test test-coverage build image image-push diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/README.md b/vendor/github.com/tommy-muehle/go-mnd/v2/README.md new file mode 100644 index 000000000..fe679e138 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/README.md @@ -0,0 +1,230 @@ +# go-mnd - Magic number detector for Golang + + + +A vet analyzer to detect magic numbers. + +> **What is a magic number?** +> A magic number is a numeric literal that is not defined as a constant, but which may change, and therefore can be hard to update. It's considered a bad programming practice to use numbers directly in any source code without an explanation. It makes programs harder to read, understand, and maintain. + +## Project status + +![CI](https://github.com/tommy-muehle/go-mnd/workflows/CI/badge.svg) +[![Go Report Card](https://goreportcard.com/badge/github.com/tommy-muehle/go-mnd)](https://goreportcard.com/report/github.com/tommy-muehle/go-mnd) +[![codecov](https://codecov.io/gh/tommy-muehle/go-mnd/branch/master/graph/badge.svg)](https://codecov.io/gh/tommy-muehle/go-mnd) + +## Install + +### Local + +This analyzer requires Golang in version >= 1.12 because it's depends on the **go/analysis** API. + +``` +go get -u github.com/tommy-muehle/go-mnd/cmd/mnd +``` + +### Github action + +You can run go-mnd as a GitHub action as follows: + +``` +name: Example workflow +on: + push: + branches: + - master + pull_request: + branches: + - master +jobs: + tests: + runs-on: ubuntu-latest + env: + GO111MODULE: on + steps: + - name: Checkout Source + uses: actions/checkout@v2 + - name: Run go-mnd + uses: tommy-muehle/go-mnd@master + with: + args: ./... +``` + +### GitLab CI + +You can run go-mnd inside a GitLab CI pipeline as follows: + +``` +stages: + - lint + +go:lint:mnd: + stage: lint + needs: [] + image: golang:latest + before_script: + - go get -u github.com/tommy-muehle/go-mnd/cmd/mnd + - go mod tidy + - go mod vendor + script: + - go vet -vettool $(which mnd) ./... +``` + +### Homebrew + +To install with [Homebrew](https://brew.sh/), run: + +``` +brew tap tommy-muehle/tap && brew install tommy-muehle/tap/mnd +``` + +### Docker + +To get the latest available Docker image: + +``` +docker pull tommymuehle/go-mnd +``` + +### Windows + +On Windows download the [latest release](https://github.com/tommy-muehle/go-mnd/releases). + +## Usage + +[![asciicast](https://asciinema.org/a/231021.svg)](https://asciinema.org/a/231021) + +``` +go vet -vettool $(which mnd) ./... +``` + +or directly + +``` +mnd ./... +``` + +or via Docker + +``` +docker run --rm -v "$PWD":/app -w /app tommymuehle/go-mnd:latest ./... +``` + +## Options + +The ```-checks``` option let's you define a comma separated list of checks. + +The ```-ignored-numbers``` option let's you define a comma separated list of numbers to ignore. +For example: `-ignored-numbers=1000,10_000,3.14159264` + +The ```-ignored-functions``` option let's you define a comma separated list of function name regexp patterns to exclude. +For example: `-ignored-functions=math.*,http.StatusText` + +The ```-ignored-files``` option let's you define a comma separated list of filename regexp patterns to exclude. +For example: `-ignored-files=magic_.*.go,.*_numbers.go` + +## Checks + +By default this detector analyses arguments, assigns, cases, conditions, operations and return statements. + +* argument + +``` +t := http.StatusText(200) +``` + +* assign + +``` +c := &http.Client{ + Timeout: 5 * time.Second, +} +``` + +* case + +``` +switch x { + case 3: +} +``` + +* condition + +``` +if x > 7 { +} +``` + +* operation + +``` +var x, y int +y = 10 * x +``` + +* return + +``` +return 3 +``` + +## Excludes + +By default the numbers 0 and 1 as well as test files are excluded! + +### Further known excludes + +The function "Date" in the "Time" package. + +``` +t := time.Date(2017, time.September, 26, 12, 13, 14, 0, time.UTC) +``` + +Additional custom excludes can be defined via option flag. + +## Development + +### Build + +You can build the binary with: + +``` +make +``` + +### Tests + +You can run all unit tests using: + +``` +make test +``` + +And with coverage report: + +``` +make test-coverage +``` + +### Docker image + +You can also build locally the docker image by using the command: + +``` +make image +``` + +## Stickers + +

+ Stickers image + Sticker image +

+ +Just drop me a message via Twitter DM or email if you want some go-mnd stickers +for you or your Gopher usergroup. + +## License + +The MIT License (MIT). Please see [LICENSE](LICENSE) for more information. diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/action.yml b/vendor/github.com/tommy-muehle/go-mnd/v2/action.yml new file mode 100644 index 000000000..3a1f8eb11 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/action.yml @@ -0,0 +1,19 @@ +name: 'go-mnd' +description: 'Runs the Golang magic number detector' +author: '@tommy-muehle' + +inputs: + args: + description: 'Arguments for go-mnd' + required: true + default: '-h' + +runs: + using: 'docker' + image: 'Dockerfile' + args: + - ${{ inputs.args }} + +branding: + icon: 'check-circle' + color: 'blue' diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/analyzer.go b/vendor/github.com/tommy-muehle/go-mnd/v2/analyzer.go new file mode 100644 index 000000000..9153e0bc3 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/analyzer.go @@ -0,0 +1,115 @@ +package magic_numbers + +import ( + "flag" + "go/ast" + "strings" + + "github.com/tommy-muehle/go-mnd/v2/checks" + "github.com/tommy-muehle/go-mnd/v2/config" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/inspector" +) + +const Doc = `magic number detector` + +var Analyzer = &analysis.Analyzer{ + Name: "mnd", + Doc: Doc, + Run: run, + Flags: options(), + Requires: []*analysis.Analyzer{inspect.Analyzer}, + RunDespiteErrors: true, +} + +type Checker interface { + NodeFilter() []ast.Node + Check(n ast.Node) +} + +func options() flag.FlagSet { + options := flag.NewFlagSet("", flag.ExitOnError) + options.String("excludes", "", "deprecated: use ignored-files instead") + options.String("ignored-files", "", "comma separated list of file patterns to exclude from analysis") + options.String("ignored-functions", "", "comma separated list of function patterns to exclude from analysis") + options.String("ignored-numbers", "", "comma separated list of numbers to exclude from analysis") + options.String( + "checks", + checks.ArgumentCheck+","+ + checks.CaseCheck+","+ + checks.ConditionCheck+","+ + checks.OperationCheck+","+ + checks.ReturnCheck+","+ + checks.AssignCheck, + "comma separated list of checks", + ) + + return *options +} + +func run(pass *analysis.Pass) (interface{}, error) { + var ignoredFiles string + + ignoredFiles = strings.Join( + []string{ + pass.Analyzer.Flags.Lookup("excludes").Value.String(), // is deprecated + pass.Analyzer.Flags.Lookup("ignored-files").Value.String(), + }, + ",", + ) + + if ignoredFiles == "," { + ignoredFiles = "" + } + + conf := config.WithOptions( + config.WithCustomChecks(pass.Analyzer.Flags.Lookup("checks").Value.String()), + config.WithIgnoredFiles(ignoredFiles), + config.WithIgnoredFunctions(pass.Analyzer.Flags.Lookup("ignored-functions").Value.String()), + config.WithIgnoredNumbers(pass.Analyzer.Flags.Lookup("ignored-numbers").Value.String()), + ) + + var checker []Checker + if conf.IsCheckEnabled(checks.ArgumentCheck) { + checker = append(checker, checks.NewArgumentAnalyzer(pass, conf)) + } + + if conf.IsCheckEnabled(checks.CaseCheck) { + checker = append(checker, checks.NewCaseAnalyzer(pass, conf)) + } + + if conf.IsCheckEnabled(checks.ConditionCheck) { + checker = append(checker, checks.NewConditionAnalyzer(pass, conf)) + } + + if conf.IsCheckEnabled(checks.OperationCheck) { + checker = append(checker, checks.NewOperationAnalyzer(pass, conf)) + } + + if conf.IsCheckEnabled(checks.ReturnCheck) { + checker = append(checker, checks.NewReturnAnalyzer(pass, conf)) + } + + if conf.IsCheckEnabled(checks.AssignCheck) { + checker = append(checker, checks.NewAssignAnalyzer(pass, conf)) + } + + i := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) + + for _, c := range checker { + c := c + i.Preorder(c.NodeFilter(), func(node ast.Node) { + for _, exclude := range conf.IgnoredFiles { + if exclude.MatchString(pass.Fset.Position(node.Pos()).Filename) { + return + } + } + + c.Check(node) + }) + } + + return nil, nil +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/argument.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/argument.go new file mode 100644 index 000000000..f0c5d71d2 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/argument.go @@ -0,0 +1,118 @@ +package checks + +import ( + "go/ast" + "go/token" + "strconv" + "sync" + + "golang.org/x/tools/go/analysis" + + "github.com/tommy-muehle/go-mnd/v2/config" +) + +const ArgumentCheck = "argument" + +// constantDefinitions is used to save lines (by number) which contain a constant definition. +var constantDefinitions = map[string]bool{} +var mu sync.RWMutex + +type ArgumentAnalyzer struct { + config *config.Config + pass *analysis.Pass +} + +func NewArgumentAnalyzer(pass *analysis.Pass, config *config.Config) *ArgumentAnalyzer { + return &ArgumentAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *ArgumentAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.GenDecl)(nil), + (*ast.CallExpr)(nil), + } +} + +func (a *ArgumentAnalyzer) Check(n ast.Node) { + switch expr := n.(type) { + case *ast.CallExpr: + a.checkCallExpr(expr) + case *ast.GenDecl: + if expr.Tok == token.CONST { + pos := a.pass.Fset.Position(expr.TokPos) + + mu.Lock() + constantDefinitions[pos.Filename+":"+strconv.Itoa(pos.Line)] = true + mu.Unlock() + } + } +} + +func (a *ArgumentAnalyzer) checkCallExpr(expr *ast.CallExpr) { + pos := a.pass.Fset.Position(expr.Pos()) + + mu.RLock() + ok := constantDefinitions[pos.Filename+":"+strconv.Itoa(pos.Line)] + mu.RUnlock() + + if ok { + return + } + + switch f := expr.Fun.(type) { + case *ast.SelectorExpr: + switch prefix := f.X.(type) { + case *ast.Ident: + if a.config.IsIgnoredFunction(prefix.Name + "." + f.Sel.Name) { + return + } + } + } + + for i, arg := range expr.Args { + switch x := arg.(type) { + case *ast.BasicLit: + if !a.isMagicNumber(x) { + continue + } + // If it's a magic number and has no previous element, report it + if i == 0 { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) + } else { + // Otherwise check the previous element type + switch expr.Args[i-1].(type) { + case *ast.ChanType: + // When it's not a simple buffered channel, report it + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) + } + } + } + case *ast.BinaryExpr: + a.checkBinaryExpr(x) + } + } +} + +func (a *ArgumentAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ArgumentCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, ArgumentCheck) + } + } +} + +func (a *ArgumentAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/assign.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/assign.go new file mode 100644 index 000000000..f930d0880 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/assign.go @@ -0,0 +1,86 @@ +package checks + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/analysis" + + config "github.com/tommy-muehle/go-mnd/v2/config" +) + +const AssignCheck = "assign" + +type AssignAnalyzer struct { + pass *analysis.Pass + config *config.Config +} + +func NewAssignAnalyzer(pass *analysis.Pass, config *config.Config) *AssignAnalyzer { + return &AssignAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *AssignAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.KeyValueExpr)(nil), + (*ast.AssignStmt)(nil), + } +} + +func (a *AssignAnalyzer) Check(n ast.Node) { + switch expr := n.(type) { + case *ast.KeyValueExpr: + switch x := expr.Value.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, AssignCheck) + } + case *ast.BinaryExpr: + a.checkBinaryExpr(x) + } + case *ast.AssignStmt: + for _, e := range expr.Rhs { + switch y := e.(type) { + case *ast.UnaryExpr: + a.checkUnaryExpr(y) + case *ast.BinaryExpr: + switch x := y.Y.(type) { + case *ast.UnaryExpr: + a.checkUnaryExpr(x) + } + } + } + } +} + +func (a *AssignAnalyzer) checkUnaryExpr(expr *ast.UnaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, AssignCheck) + } + } +} + +func (a *AssignAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, AssignCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, AssignCheck) + } + } +} + +func (a *AssignAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/case.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/case.go new file mode 100644 index 000000000..228cab4b8 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/case.go @@ -0,0 +1,68 @@ +package checks + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/analysis" + + config "github.com/tommy-muehle/go-mnd/v2/config" +) + +const CaseCheck = "case" + +type CaseAnalyzer struct { + pass *analysis.Pass + config *config.Config +} + +func NewCaseAnalyzer(pass *analysis.Pass, config *config.Config) *CaseAnalyzer { + return &CaseAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *CaseAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.CaseClause)(nil), + } +} + +func (a *CaseAnalyzer) Check(n ast.Node) { + caseClause, ok := n.(*ast.CaseClause) + if !ok { + return + } + + for _, c := range caseClause.List { + switch x := c.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, CaseCheck) + } + case *ast.BinaryExpr: + a.checkBinaryExpr(x) + } + } +} + +func (a *CaseAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, CaseCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, CaseCheck) + } + } +} + +func (a *CaseAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/checks.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/checks.go new file mode 100644 index 000000000..deff0c7bf --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/checks.go @@ -0,0 +1,3 @@ +package checks + +const reportMsg = "Magic number: %v, in <%s> detected" diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/condition.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/condition.go new file mode 100644 index 000000000..20f892ede --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/condition.go @@ -0,0 +1,55 @@ +package checks + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/analysis" + + config "github.com/tommy-muehle/go-mnd/v2/config" +) + +const ConditionCheck = "condition" + +type ConditionAnalyzer struct { + pass *analysis.Pass + config *config.Config +} + +func NewConditionAnalyzer(pass *analysis.Pass, config *config.Config) *ConditionAnalyzer { + return &ConditionAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *ConditionAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.IfStmt)(nil), + } +} + +func (a *ConditionAnalyzer) Check(n ast.Node) { + expr, ok := n.(*ast.IfStmt).Cond.(*ast.BinaryExpr) + if !ok { + return + } + + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ConditionCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, ConditionCheck) + } + } +} + +func (a *ConditionAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/operation.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/operation.go new file mode 100644 index 000000000..ddf3a0363 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/operation.go @@ -0,0 +1,77 @@ +package checks + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/analysis" + + config "github.com/tommy-muehle/go-mnd/v2/config" +) + +const OperationCheck = "operation" + +type OperationAnalyzer struct { + pass *analysis.Pass + config *config.Config +} + +func NewOperationAnalyzer(pass *analysis.Pass, config *config.Config) *OperationAnalyzer { + return &OperationAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *OperationAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.AssignStmt)(nil), + (*ast.ParenExpr)(nil), + } +} + +func (a *OperationAnalyzer) Check(n ast.Node) { + switch expr := n.(type) { + case *ast.ParenExpr: + switch x := expr.X.(type) { + case *ast.BinaryExpr: + a.checkBinaryExpr(x) + } + case *ast.AssignStmt: + for _, y := range expr.Rhs { + switch x := y.(type) { + case *ast.BinaryExpr: + switch xExpr := x.X.(type) { + case *ast.BinaryExpr: + a.checkBinaryExpr(xExpr) + } + switch yExpr := x.Y.(type) { + case *ast.BinaryExpr: + a.checkBinaryExpr(yExpr) + } + + a.checkBinaryExpr(x) + } + } + } +} + +func (a *OperationAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, OperationCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, OperationCheck) + } + } +} + +func (a *OperationAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/checks/return.go b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/return.go new file mode 100644 index 000000000..bc53940c7 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/checks/return.go @@ -0,0 +1,68 @@ +package checks + +import ( + "go/ast" + "go/token" + + "golang.org/x/tools/go/analysis" + + config "github.com/tommy-muehle/go-mnd/v2/config" +) + +const ReturnCheck = "return" + +type ReturnAnalyzer struct { + pass *analysis.Pass + config *config.Config +} + +func NewReturnAnalyzer(pass *analysis.Pass, config *config.Config) *ReturnAnalyzer { + return &ReturnAnalyzer{ + pass: pass, + config: config, + } +} + +func (a *ReturnAnalyzer) NodeFilter() []ast.Node { + return []ast.Node{ + (*ast.ReturnStmt)(nil), + } +} + +func (a *ReturnAnalyzer) Check(n ast.Node) { + stmt, ok := n.(*ast.ReturnStmt) + if !ok { + return + } + + for _, expr := range stmt.Results { + switch x := expr.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ReturnCheck) + } + case *ast.BinaryExpr: + a.checkBinaryExpr(x) + } + } +} + +func (a *ReturnAnalyzer) checkBinaryExpr(expr *ast.BinaryExpr) { + switch x := expr.X.(type) { + case *ast.BasicLit: + if a.isMagicNumber(x) { + a.pass.Reportf(x.Pos(), reportMsg, x.Value, ReturnCheck) + } + } + + switch y := expr.Y.(type) { + case *ast.BasicLit: + if a.isMagicNumber(y) { + a.pass.Reportf(y.Pos(), reportMsg, y.Value, ReturnCheck) + } + } +} + +func (a *ReturnAnalyzer) isMagicNumber(l *ast.BasicLit) bool { + return (l.Kind == token.FLOAT || l.Kind == token.INT) && !a.config.IsIgnoredNumber(l.Value) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/config/config.go b/vendor/github.com/tommy-muehle/go-mnd/v2/config/config.go new file mode 100644 index 000000000..a4681e37d --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/config/config.go @@ -0,0 +1,118 @@ +package config + +import ( + "regexp" + "strings" +) + +type Config struct { + Checks map[string]bool + IgnoredNumbers map[string]struct{} + IgnoredFunctions []*regexp.Regexp + IgnoredFiles []*regexp.Regexp +} + +type Option func(config *Config) + +func DefaultConfig() *Config { + return &Config{ + Checks: map[string]bool{}, + IgnoredNumbers: map[string]struct{}{ + "0": {}, + "0.0": {}, + "1": {}, + "1.0": {}, + }, + IgnoredFiles: []*regexp.Regexp{ + regexp.MustCompile(`_test.go`), + }, + IgnoredFunctions: []*regexp.Regexp{ + regexp.MustCompile(`time.Date`), + }, + } +} + +func WithOptions(options ...Option) *Config { + c := DefaultConfig() + + for _, option := range options { + option(c) + } + + return c +} + +func WithIgnoredFunctions(excludes string) Option { + return func(config *Config) { + if excludes == "" { + return + } + + for _, exclude := range strings.Split(excludes, ",") { + config.IgnoredFunctions = append(config.IgnoredFunctions, regexp.MustCompile(exclude)) + } + } +} + +func WithIgnoredFiles(excludes string) Option { + return func(config *Config) { + if excludes == "" { + return + } + + for _, exclude := range strings.Split(excludes, ",") { + config.IgnoredFiles = append(config.IgnoredFiles, regexp.MustCompile(exclude)) + } + } +} + +func WithIgnoredNumbers(numbers string) Option { + return func(config *Config) { + if numbers == "" { + return + } + + for _, number := range strings.Split(numbers, ",") { + config.IgnoredNumbers[config.removeDigitSeparator(number)] = struct{}{} + } + } +} + +func WithCustomChecks(checks string) Option { + return func(config *Config) { + if checks == "" { + return + } + + for name, _ := range config.Checks { + config.Checks[name] = false + } + + for _, name := range strings.Split(checks, ",") { + config.Checks[name] = true + } + } +} + +func (c *Config) IsCheckEnabled(name string) bool { + return c.Checks[name] +} + +func (c *Config) IsIgnoredNumber(number string) bool { + _, ok := c.IgnoredNumbers[c.removeDigitSeparator(number)] + return ok +} + +func (c *Config) IsIgnoredFunction(f string) bool { + for _, pattern := range c.IgnoredFunctions { + if pattern.MatchString(f) { + return true + } + } + + return false +} + +func (c *Config) removeDigitSeparator(number string) string { + return strings.Replace(number, "_", "", -1) +} diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/entrypoint.sh b/vendor/github.com/tommy-muehle/go-mnd/v2/entrypoint.sh new file mode 100644 index 000000000..cabc2f63d --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/entrypoint.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +# Expand the arguments into an array of strings. This is required because the GitHub action +# provides all arguments concatenated as a single string. +ARGS=("$@") + +/bin/go-mnd "${ARGS[*]}" diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/go.mod b/vendor/github.com/tommy-muehle/go-mnd/v2/go.mod new file mode 100644 index 000000000..8e7c18e22 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/go.mod @@ -0,0 +1,9 @@ +module github.com/tommy-muehle/go-mnd/v2 + +go 1.12 + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/stretchr/testify v1.3.0 + golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65 +) diff --git a/vendor/github.com/tommy-muehle/go-mnd/v2/go.sum b/vendor/github.com/tommy-muehle/go-mnd/v2/go.sum new file mode 100644 index 000000000..991a43759 --- /dev/null +++ b/vendor/github.com/tommy-muehle/go-mnd/v2/go.sum @@ -0,0 +1,28 @@ +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= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65 h1:1KSbntBked74wYsKq0jzXYy7ZwcjAUtrl7EmPE97Iiw= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -- cgit mrf-deployment