From 8e1d3c818df8ef35fe842b31b3726e986862fa70 Mon Sep 17 00:00:00 2001 From: Marat Reymers Date: Tue, 21 Jun 2022 01:02:21 +0300 Subject: [PATCH] Update golangci-lint to v1.46.2 --- .github/workflows/ci.yaml | 8 +- .golangci.yml | 320 ++++++++++++++++++++++----------- Makefile | 4 +- pkg/testpackage/testpackage.go | 2 +- 4 files changed, 229 insertions(+), 105 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4134e9e..50404bc 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,6 +33,12 @@ jobs: if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_ssh }} uses: mxschmitt/action-tmate@v3 - - run: make ci + - run: make test-cover - uses: codecov/codecov-action@v2 + + - uses: golangci/golangci-lint-action@v3 + with: + version: "v1.46.2" + + - run: make check-tidy diff --git a/.golangci.yml b/.golangci.yml index f734eb4..c9e3ba0 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,124 +1,242 @@ run: - timeout: 1m # default 1m - tests: true # default true + # Define the Go version limit. + # Mainly related to generics support in go1.18. + # Default: use Go version from the go.mod file, fallback on the env var `GOVERSION`, fallback on 1.17 + go: "1.12" # TODO: change to 1.18 when most linters support it, see https://github.com/golangci/golangci-lint/issues/2649 + +# This file contains only configs which differ from defaults. +# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml linters-settings: + cyclop: + # The maximal code complexity to report. + # Default: 10 + max-complexity: 30 + # The maximal average package complexity. + # If it's higher than 0.0 (float) the check is enabled + # Default: 0.0 + package-average: 10.0 + errcheck: - check-type-assertions: true # default false - check-blank: true # default false - ignore: "fmt:.*" # default fmt:.* - exclude: "" # default "" - govet: - enable-all: true - settings: - shadow: - strict: true # default false - structcheck: - exported-fields: true # default false - unused: - check-exported: true # default false - varcheck: - exported-fields: true # default false + # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. + # Such cases aren't reported by default. + # Default: false + check-type-assertions: true + # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`. + # Such cases aren't reported by default. + # Default: false + check-blank: true - dupl: - threshold: 150 # default 150 - funlen: - lines: 60 # default 60 - statements: 40 # default 40 gocognit: - min-complexity: 15 # minimal code complexity to report, 30 by default (but we recommend 10-20) - goconst: - min-len: 3 # default 3 - min-occurrences: 3 # default 3 + # Minimal code complexity to report + # Default: 30 (but we recommend 10-20) + min-complexity: 20 + gocritic: + # Settings passed to gocritic. + # The settings key is the name of a supported gocritic checker. + # The list of supported checkers can be find in https://go-critic.github.io/overview. settings: captLocal: - paramsOnly: false # default true - elseif: - skipBalanced: false # default true + # Whether to restrict checker to params only. + # Default: true + paramsOnly: false underef: - skipRecvDeref: false # default true - gocyclo: - min-complexity: 15 # default 30 - goimports: - local-prefixes: github.com/maratori/testpackage - golint: - min-confidence: 0 # default 0.8 + # Whether to skip (*x).method() calls where x is a pointer receiver. + # Default: true + skipRecvDeref: false + gomnd: + # List of function patterns to exclude from analysis. + # Values always ignored: `time.Date` + # Default: [] + ignored-functions: + - os.Chmod + - os.Mkdir + - os.MkdirAll + - os.OpenFile + - os.WriteFile + - prometheus.ExponentialBuckets + - prometheus.ExponentialBucketsRange + - prometheus.LinearBuckets + - strconv.FormatFloat + - strconv.FormatInt + - strconv.FormatUint + - strconv.ParseFloat + - strconv.ParseInt + - strconv.ParseUint + + gomodguard: + blocked: + # List of blocked modules. + # Default: [] + modules: + - github.com/golang/protobuf: + recommendations: + - google.golang.org/protobuf + reason: "see https://developers.google.com/protocol-buffers/docs/reference/go/faq#modules" + - github.com/satori/go.uuid: + recommendations: + - github.com/google/uuid + reason: "satori's package is not maintained" + - github.com/gofrs/uuid: + recommendations: + - github.com/google/uuid + reason: "see recommendation from dev-infra team: https://confluence.gtforge.com/x/gQI6Aw" + + govet: + # Enable all analyzers. + # Default: false + enable-all: true + # Settings per analyzer. settings: - mnd: - # the list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description. - checks: argument,case,condition,operation,return,assign # default argument,case,condition,operation,return,assign - ignored-numbers: 0,1 # default 0,1 - lll: - line-length: 120 # default 120 - maligned: - suggest-new: true # default false - misspell: - locale: us - ignore-words: "" # default: "" + shadow: + # Whether to be strict about shadowing; can be noisy. + # Default: false + strict: true + nakedret: - max-func-lines: 0 # default 30 - prealloc: - simple: false # default true - range-loops: true # default true - for-loops: true # default false - unparam: - check-exported: true # default false - wsl: - strict-append: true # default true - allow-assign-and-call: true # default true - allow-multiline-assign: true # default true - allow-case-trailing-whitespace: true # default true - allow-cuddle-declarations: false # default false + # Make an issue if func has more lines of code than this setting, and it has naked returns. + # Default: 30 + max-func-lines: 0 + + nolintlint: + # Exclude following linters from requiring an explanation. + # Default: [] + allow-no-explanation: [ funlen, gocognit, lll ] + # Enable to require an explanation of nonzero length after each nolint directive. + # Default: false + require-explanation: true + # Enable to require nolint directives to mention the specific linter being suppressed. + # Default: false + require-specific: true + + rowserrcheck: + # database/sql is always checked + # Default: [] + packages: + - github.com/jmoiron/sqlx + + tenv: + # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures. + # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked. + # Default: false + all: true + + varcheck: + # Check usage of exported fields and variables. + # Default: false + exported-fields: true + linters: disable-all: true enable: ## enabled by default - - deadcode - - errcheck - - gosimple - - govet - - ineffassign - - staticcheck - - structcheck - - typecheck - #- unused # false positives - - varcheck + - deadcode # Finds unused code + - errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases + - gosimple # Linter for Go source code that specializes in simplifying a code + - govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string + - ineffassign # Detects when assignments to existing variables are not used + - staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks + - structcheck # Finds unused struct fields + - typecheck # Like the front-end of a Go compiler, parses and type-checks Go code + - unused # Checks Go code for unused constants, variables, functions and types + - varcheck # Finds unused global variables and constants ## disabled by default - - bodyclose - - dupl - - funlen - - gochecknoglobals - - gochecknoinits - - gocognit - - goconst - - gocritic - - gocyclo - - goimports - - golint - - gomnd - - goprintffuncname - - gosec - - lll - - maligned - - misspell - - nakedret - - prealloc - - rowserrcheck - - scopelint - - unconvert - - unparam - - whitespace - - wsl - -output: - uniq-by-line: false # default true + - asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers + - bidichk # Checks for dangerous unicode character sequences + - bodyclose # checks whether HTTP response body is closed successfully + - contextcheck # check the function whether use a non-inherited context + - cyclop # checks function and package cyclomatic complexity + - dupl # Tool for code clone detection + - durationcheck # check for two durations multiplied together + - errname # Checks that sentinel errors are prefixed with the Err and error types are suffixed with the Error. + - errorlint # errorlint is a linter for that can be used to find code that will cause problems with the error wrapping scheme introduced in Go 1.13. + - execinquery # execinquery is a linter about query string checker in Query function which reads your Go src files and warning it finds + - exhaustive # check exhaustiveness of enum switch statements + - exportloopref # checks for pointers to enclosing loop variables + - forbidigo # Forbids identifiers + - funlen # Tool for detection of long functions + - gochecknoglobals # check that no global variables exist + - gochecknoinits # Checks that no init functions are present in Go code + - gocognit # Computes and checks the cognitive complexity of functions + - goconst # Finds repeated strings that could be replaced by a constant + - gocritic # Provides diagnostics that check for bugs, performance and style issues. + - gocyclo # Computes and checks the cyclomatic complexity of functions + - godot # Check if comments end in a period + - goimports # In addition to fixing imports, goimports also formats your code in the same style as gofmt. + - gomnd # An analyzer to detect magic numbers. + - gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod. + - gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations. + - goprintffuncname # Checks that printf-like functions are named with f at the end + - gosec # Inspects source code for security problems + - lll # Reports long lines + - makezero # Finds slice declarations with non-zero initial length + - nakedret # Finds naked returns in functions greater than a specified function length + - nestif # Reports deeply nested if statements + - nilerr # Finds the code that returns nil even if it checks that the error is not nil. + - nilnil # Checks that there is no simultaneous return of nil error and an invalid value. + - noctx # noctx finds sending http request without context.Context + - nolintlint # Reports ill-formed or insufficient nolint directives + - nonamedreturns # Reports all named returns + - nosprintfhostport # Checks for misuse of Sprintf to construct a host with port in a URL. + - predeclared # find code that shadows one of Go's predeclared identifiers + - promlinter # Check Prometheus metrics naming via promlint + - revive # Fast, configurable, extensible, flexible, and beautiful linter for Go. Drop-in replacement of golint. + - rowserrcheck # checks whether Err of rows is checked successfully + - sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed. + - stylecheck # Stylecheck is a replacement for golint + - tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17 + - testpackage # linter that makes you use a separate _test package + - tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes + - unconvert # Remove unnecessary type conversions + - unparam # Reports unused function parameters + - wastedassign # wastedassign finds wasted assignment statements. + - whitespace # Tool for detection of leading and trailing whitespace + ## you may want to enable + #- decorder # check declaration order and count of types, constants, variables and functions + #- exhaustruct # Checks if all structure fields are initialized + #- goheader # Checks is file header matches to pattern + #- ireturn # Accept Interfaces, Return Concrete Types + #- prealloc # [premature optimization, but can be used in some cases] Finds slice declarations that could potentially be preallocated + #- varnamelen # [great idea, but too many false positives] checks that the length of a variable's name matches its scope + #- wrapcheck # Checks that errors returned from external packages are wrapped + ## disabled + #- containedctx # containedctx is a linter that detects struct contained context.Context field + #- depguard # [replaced by gomodguard] Go linter that checks if package imports are in a list of acceptable packages + #- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f()) + #- errchkjson # [don't see profit + I'm against of omitting errors like in the first example https://github.com/breml/errchkjson] Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occasions, where the check for the returned error can be omitted. + #- forcetypeassert # [replaced by errcheck] finds forced type assertions + #- gci # Gci controls golang package import order and makes it always deterministic. + #- godox # Tool for detection of FIXME, TODO and other comment keywords + #- goerr113 # [too strict] Golang linter to check the errors handling expressions + #- gofmt # [replaced by goimports] Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification + #- gofumpt # [replaced by goimports, gofumports is not available yet] Gofumpt checks whether code was gofumpt-ed. + #- grouper # An analyzer to analyze expression groups. + #- ifshort # Checks that your code uses short syntax for if-statements whenever possible + #- importas # Enforces consistent import aliases + #- maintidx # maintidx measures the maintainability index of each function. + #- misspell # [useless] Finds commonly misspelled English words in comments + #- nlreturn # [too strict and mostly code is not more readable] nlreturn checks for a new line before return and branch statements to increase code clarity + #- paralleltest # [too many false positives] paralleltest detects missing usage of t.Parallel() method in your Go test + #- tagliatelle # Checks the struct tags. + #- thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers + #- wsl # [too strict and mostly code is not more readable] Whitespace Linter - Forces you to use empty lines! + ## deprecated + #- exhaustivestruct # [deprecated, replaced by exhaustruct] Checks if all struct's fields are initialized + #- golint # [deprecated, replaced by revive] Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes + #- interfacer # [deprecated] Linter that suggests narrower interface types + #- maligned # [deprecated, replaced by govet fieldalignment] Tool to detect Go structs that would take less memory if their fields were sorted + #- scopelint # [deprecated, replaced by exportloopref] Scopelint checks for unpinned variables in go programs + issues: - max-issues-per-linter: 0 - max-same-issues: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 50 + exclude-rules: - path: doc.go - linters: lll + linters: [lll] diff --git a/Makefile b/Makefile index 6db9219..d198861 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -ci: test-cover lint check-tidy +ci: test lint check-tidy .PHONY: ci test: @@ -6,7 +6,7 @@ test: .PHONY: test lint: - docker run --rm --name lint -v `pwd`:/app -w /app golangci/golangci-lint:v1.24.0 golangci-lint run + docker run --rm --name lint -v `pwd`:/app -w /app golangci/golangci-lint:v1.46.2 golangci-lint run .PHONY: lint tidy: diff --git a/pkg/testpackage/testpackage.go b/pkg/testpackage/testpackage.go index cad24e1..027efac 100644 --- a/pkg/testpackage/testpackage.go +++ b/pkg/testpackage/testpackage.go @@ -14,7 +14,7 @@ const ( SkipRegexpFlagDefault = `(export|internal)_test\.go` ) -// NewAnalyzer returns Analyzer that makes you use a separate _test package +// NewAnalyzer returns Analyzer that makes you use a separate _test package. func NewAnalyzer() *analysis.Analyzer { var ( skipFileRegexp = SkipRegexpFlagDefault