diff --git a/.golangci.yaml b/.golangci.yaml index 4c414b8439..cacbf0eea7 100644 --- a/.golangci.yaml +++ b/.golangci.yaml @@ -1,284 +1,65 @@ -# This file contains all available configuration options -# with their default values. - -# options for analysis running +# Documentation reference https://github.com/golangci/golangci-lint/blob/v1.57.2/.golangci.reference.yml run: - # default concurrency is a available CPU number - concurrency: 4 - - # timeout for analysis, e.g. 30s, 5m, default is 1m timeout: 20m - - # exit code when at least one issue was found, default is 1 - issues-exit-code: 1 - - - # default is true. Enables skipping of directories: - # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ - skip-dirs-use-default: true - - # by default isn't set. If set we pass it to "go list -mod={option}". From "go help modules": - # If invoked with -mod=readonly, the go command is disallowed from the implicit - # automatic updating of go.mod described above. Instead, it fails when any changes - # to go.mod are needed. This setting is most useful to check that go.mod does - # not need updates, such as in a continuous integration and testing system. - # If invoked with -mod=vendor, the go command assumes that the vendor - # directory holds the correct copies of dependencies and ignores - # the dependency descriptions in go.mod. - # modules-download-mode: readonly|release|vendor modules-download-mode: readonly - - # Allow multiple parallel golangci-lint instances running. - # If false (default) - golangci-lint acquires file lock on start. allow-parallel-runners: false - -# output configuration options output: - # colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number" formats: - format: colored-line-number path: stdout - - # print lines of code with issue, default is true print-issued-lines: true - - # print linter name in the end of issue text, default is true print-linter-name: true - - # make issues output unique by line, default is true uniq-by-line: true + sort-results: true - -# all available settings of specific linters linters-settings: dogsled: - # checks assignments with too many blank identifiers; default is 2 max-blank-identifiers: 2 - dupl: - # tokens count to trigger issue, 150 by default - threshold: 100 errcheck: - # report about not checking of errors in type assertions: `a := b.(MyStruct)`; - # default is false: such cases aren't reported by default. + # TODO: enable them all check-type-assertions: false - - # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`; - # default is false: such cases aren't reported by default. check-blank: false - - # [deprecated] comma-separated list of pairs of the form pkg:regex - # the regex is used to ignore names within pkg. (default "fmt:.*"). - # see https://github.com/kisielk/errcheck#the-deprecated-method for details - # ignore: fmt:.*,io/ioutil:^Read.* - - # path to a file containing a list of functions to exclude from checking - # see https://github.com/kisielk/errcheck#excluding-functions for details - # exclude: /path/to/file.txt - exhaustive: - # indicates that switch statements are to be considered exhaustive if a - # 'default' case is present, even if all enum members aren't listed in the - # switch - default-signifies-exhaustive: false - funlen: - lines: 60 - statements: 40 - gocognit: - # minimal code complexity to report, 30 by default (but we recommend 10-20) - min-complexity: 10 - nestif: - # minimal complexity of if statements to report, 5 by default - min-complexity: 4 goconst: - # minimal length of string constant, 3 by default min-len: 3 - # minimal occurrences count to trigger, 3 by default min-occurrences: 5 - gocritic: - # Which checks should be enabled; can't be combined with 'disabled-checks'; - # See https://go-critic.github.io/overview#checks-overview - # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run` - # By default list of stable checks is used. - # enabled-checks: - # - rangeValCopy - - # Which checks should be disabled; can't be combined with 'enabled-checks'; default is empty - # disabled-checks: - # - regexpMust - - # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint run` to see all tags and checks. - # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags". - # enabled-tags: - # - performance - # disabled-tags: - # - experimental - - settings: # settings passed to gocritic - captLocal: # must be valid enabled check name - paramsOnly: true - # rangeValCopy: - # sizeThreshold: 32 - gocyclo: - # minimal code complexity to report, 30 by default (but we recommend 10-20) - min-complexity: 10 - godot: - # check all top-level comments, not only declarations - check-all: false - godox: - # report any comments starting with keywords, this is useful for TODO or FIXME comments that - # might be left in the code accidentally and should be resolved before merging - keywords: # default keywords are TODO, BUG, and FIXME, these can be overwritten by this setting - - NOTE - - OPTIMIZE # marks code that should be optimized before merging - - HACK # marks hack-arounds that should be removed before merging gofmt: - # simplify code: gofmt with `-s` option, true by default simplify: true goimports: - # put imports beginning with prefix after 3rd-party packages; - # it's a comma-separated list of prefixes - local-prefixes: github.com/org/project - golint: - # minimal confidence for issues, default is 0.8 - min-confidence: 0.8 - gomnd: - # the list of enabled checks, see https://github.com/tommy-muehle/go-mnd/#checks for description. - checks: argument,case,condition,operation,return,assign - gomodguard: - allowed: - modules: # List of allowed modules - # - gopkg.in/yaml.v2 - domains: # List of allowed module domains - # - golang.org - blocked: - modules: # List of blocked modules - # - github.com/uudashr/go-module: # Blocked module - # recommendations: # Recommended modules that should be used instead (Optional) - # - golang.org/x/mod - # reason: "`mod` is the official go.mod parser library." # Reason why the recommended module should be used (Optional) - versions: # List of blocked module version constraints - # - github.com/mitchellh/go-homedir: # Blocked module with version constraint - # version: "< 1.1.0" # Version constraint, see https://github.com/Masterminds/semver#basic-comparisons - # reason: "testing if blocked version constraint works." # Reason why the version constraint exists. (Optional) + local-prefixes: github.com/vmware-tanzu/velero govet: - # report about shadowed variables - # check-shadowing: true - - # settings per analyzer - settings: - printf: # analyzer name, run `go tool vet help` to see all analyzers - funcs: # run `go tool vet help printf` to see available settings for `printf` analyzer - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Infof - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Warnf - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Errorf - - (github.com/golangci/golangci-lint/pkg/logutils.Log).Fatalf - - # enable or disable analyzers by name + disable-all: false enable: - atomicalign enable-all: false - disable: - - shadow - disable-all: false - depguard: - list-type: blacklist # Velero.io word list : ignore - include-go-root: false - packages: - - github.com/sirupsen/logrus - packages-with-error-message: - # specify an error message to output when a denylisted package is used - - github.com/sirupsen/logrus: "logging is allowed only by logutils.Log" - lll: - # max line length, lines longer will be reported. Default is 120. - # '\t' is counted as 1 character by default, and can be changed with the tab-width option - line-length: 120 - # tab width in spaces. Default to 1. - tab-width: 1 - maligned: - # print struct with more effective memory layout or not, false by default - suggest-new: true misspell: - # Correct spellings using locale preferences for US or UK. - # Default is to use a neutral variety of English. - # Setting locale to US will correct the British spelling of 'colour' to 'color'. locale: US - ignore-words: - - someword nakedret: - # make an issue if func has more lines of code than this setting and it has naked returns; default is 30 max-func-lines: 30 - prealloc: - # XXX: we don't recommend using this linter before doing performance profiling. - # For most programs usage of prealloc will be a premature optimization. - - # Report preallocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them. - # True by default. - simple: true - range-loops: true # Report preallocation suggestions on range loops, true by default - for-loops: false # Report preallocation suggestions on for loops, false by default nolintlint: - # Enable to ensure that nolint directives are all used. Default is true. allow-unused: false - # Disable to ensure that nolint directives don't have a leading space. Default is true. - allow-leading-space: true - # Exclude following linters from requiring an explanation. Default is []. allow-no-explanation: [] - # Enable to require an explanation of nonzero length after each nolint directive. Default is false. require-explanation: true - # Enable to require nolint directives to mention the specific linter being suppressed. Default is false. require-specific: true revive: + # TODO: enable them all + # enable-all-rules: true rules: - name: unexported-return disabled: true - - rowserrcheck: - packages: - - github.com/jmoiron/sqlx testifylint: - # TODO: enable them all - disable: - - go-require - - float-compare - - require-error - enable-all: true - testpackage: - # regexp pattern to skip files - skip-regexp: (export|internal)_test\.go + # TODO: enable them all + disable: + - go-require + - float-compare + - require-error + enable-all: true unparam: - # Inspect exported functions, default is false. Set to true if no external program/library imports your code. - # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find external interfaces. All text editor integrations - # with golangci-lint call it on a directory with the changed file. - check-exported: false - unused: - # treat code as a program (not a library) and report unused exported identifiers; default is false. - # XXX: if you enable this setting, unused will report a lot of false-positives in text editors: - # if it's called for subdir of a project it can't find funcs usages. All text editor integrations - # with golangci-lint call it on a directory with the changed file. + # TODO: enable check-exported: false whitespace: - multi-if: false # Enforces newlines (or comments) after every multi-line if statement - multi-func: false # Enforces newlines (or comments) after every multi-line function signature - wsl: - # If true append is only allowed to be cuddled if appending value is - # matching variables, fields or types on line above. Default is true. - strict-append: true - # Allow calls and assignments to be cuddled as long as the lines have any - # matching variables, fields or types. Default is true. - allow-assign-and-call: true - # Allow multiline assignments to be cuddled. Default is true. - allow-multiline-assign: true - # Allow declarations (var) to be cuddled. - allow-cuddle-declarations: false - # Allow trailing comments in ending of blocks - allow-trailing-comment: false - # Force newlines in end of case at this limit (0 = never). - force-case-trailing-whitespace: 0 - # Force cuddling of err checks with err var assignment - force-err-cuddling: false - # Allow leading comments to be separated with empty liens - allow-separated-leading-comment: false + multi-if: false + multi-func: false linters: disable-all: true @@ -288,11 +69,12 @@ linters: - bidichk - bodyclose - dogsled - - durationcheck - dupword + - durationcheck - errcheck - - exportloopref - errchkjson + - exportloopref + - ginkgolinter - goconst - gofmt - goheader @@ -301,20 +83,18 @@ linters: - gosec - gosimple - govet - - ginkgolinter - importas - ineffassign - misspell - nakedret - - nosprintfhostport - nilerr - noctx - nolintlint + - nosprintfhostport - revive - staticcheck - stylecheck - testifylint - - typecheck - unconvert - unparam - unused @@ -322,12 +102,17 @@ linters: - whitespace fast: false - issues: exclude-rules: - linters: - staticcheck - text: "DefaultVolumesToRestic" # No need to report deprecate for DefaultVolumesToRestic. + # grpc-go still uses github.com/golang/protobuf/proto. + text: "github.com/golang/protobuf/proto" + - linters: + - staticcheck + # No need to report deprecate for DefaultVolumesToRestic. + text: "DefaultVolumesToRestic" + # TODO: remove all excludes for test files - path: ".*_test.go$" linters: - dupword @@ -350,50 +135,12 @@ issues: - stylecheck - unparam - unused - - # The list of ids of default excludes to include or disable. By default it's empty. - include: - - EXC0002 # disable excluding of issues about comments from golint - - # Maximum issues count per one linter. Set to 0 to disable. Default is 50. + exclude-dirs: + - third_party/* + exclude-dirs-use-default: false max-issues-per-linter: 0 - - # Maximum count of issues with the same text. Set to 0 to disable. Default is 3. max-same-issues: 0 - # Show only new issues created after git revision `REV` - # new-from-rev: origin/main - - # which dirs to skip: issues from them won't be reported; - # can use regexp here: generated.*, regexp is applied on full path; - # default value is empty list, but default dirs are skipped independently - # from this option's value (see skip-dirs-use-default). - # "/" will be replaced by current OS file path separator to properly work - # on Windows. - exclude-dirs: - - pkg/plugin/generated/* - severity: - # Default value is empty string. - # Set the default severity for issues. If severity rules are defined and the issues - # do not match or no severity is provided to the rule this will be the default - # severity applied. Severities should match the supported severity names of the - # selected out format. - # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity - # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity - # - Github: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message default-severity: error - - # The default value is false. - # If set to true severity-rules regular expressions become case sensitive. case-sensitive: false - - # Default value is empty list. - # When a list of severity rules are provided, severity information will be added to lint - # issues. Severity rules have the same filtering capability as exclude rules except you - # are allowed to specify one matcher per severity rule. - # Only affects out formats that support setting severity information. - rules: - - linters: - - dupl - severity: info diff --git a/Makefile b/Makefile index 401ee47d0c..803b235361 100644 --- a/Makefile +++ b/Makefile @@ -236,12 +236,14 @@ endif lint: ifneq ($(SKIP_TESTS), 1) + @$(MAKE) shell CMD="-c 'hack/verify-lint-config.sh'" @$(MAKE) shell CMD="-c 'hack/lint.sh'" endif -local-lint: +lint-fix: ifneq ($(SKIP_TESTS), 1) - @hack/lint.sh + @$(MAKE) shell CMD="-c 'hack/verify-lint-config.sh'" + @$(MAKE) shell CMD="-c 'hack/lint.sh --fix'" endif update: diff --git a/changelogs/unreleased/7194-mateusoliveira43 b/changelogs/unreleased/7194-mateusoliveira43 new file mode 100644 index 0000000000..c7dda6608f --- /dev/null +++ b/changelogs/unreleased/7194-mateusoliveira43 @@ -0,0 +1 @@ +Clean up golangci-lint config \ No newline at end of file diff --git a/hack/lint.sh b/hack/lint.sh index 737a6d6750..f0fcd776a1 100755 --- a/hack/lint.sh +++ b/hack/lint.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright 2020 the Velero contributors. +# Copyright the Velero contributors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ golangci-lint cache status # Enable GL_DEBUG line below for debug messages for golangci-lint # export GL_DEBUG=loader,gocritic,env -CMD="golangci-lint run" +CMD="golangci-lint run $@" echo "Running $CMD" -eval $CMD +exec $CMD diff --git a/hack/verify-fmt.sh b/hack/verify-lint-config.sh similarity index 82% rename from hack/verify-fmt.sh rename to hack/verify-lint-config.sh index f3858cf24b..376dc2b1c9 100755 --- a/hack/verify-fmt.sh +++ b/hack/verify-lint-config.sh @@ -1,6 +1,6 @@ #!/bin/bash # -# Copyright 2017 the Velero contributors. +# Copyright the Velero contributors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,5 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -HACK_DIR=$(dirname "${BASH_SOURCE[0]}") -"${HACK_DIR}"/update-1fmt.sh --verify +CMD="golangci-lint config verify" +echo "Running $CMD" + +exec $CMD diff --git a/site/content/docs/main/development.md b/site/content/docs/main/development.md index 37ed1e7007..ef4a3f988c 100644 --- a/site/content/docs/main/development.md +++ b/site/content/docs/main/development.md @@ -24,16 +24,20 @@ You can run `make verify` to ensure that all generated files (clientset, listers ## Linting -You can run `make lint` which executes golangci-lint inside the build image, or `make local-lint` which executes outside of the build image. -Both `make lint` and `make local-lint` will only run the linter against changes. +You can run `make lint` (which executes [`golangci-lint`](https://github.com/golangci/golangci-lint)) to run linters against the entire Go code base. -Use `lint-all` to run the linter against the entire code base. +You can run `make lint-fix` to fix fixable issues found by `make lint`. -The default linters are defined in the `Makefile` via the `LINTERS` variable. +The linters, and their settings, are defined in the `.golangci.yaml` file. -You can also override the default list of linters by running the command +Linting is enforced by the project CI through `.github/workflows/pr-linter-check.yml` job. -`$ make lint LINTERS=gosec` +Linters settings is verified by `hack/verify-lint-config.sh` and is enforced by the project CI through `.github/workflows/pr-ci-check.yml` job. + +To update `golangci-lint` used by the project, update: +- `with.version` of golangci/golangci-lint-action in [`.github/workflows/pr-linter-check.yml:19`](https://github.com/vmware-tanzu/velero/blob/main/.github/workflows/pr-linter-check.yml#L19) +- `golangci-lint` version installed in build-image in [`hack/build-image/Dockerfile:96`](https://github.com/vmware-tanzu/velero/blob/main/hack/build-image/Dockerfile#L96) +- documentation reference comment in [`.golangci.yaml:1`](https://github.com/vmware-tanzu/velero/blob/main/.golangci.yaml#L1) ## Test