diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 000000000..b3bd8a73a --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,22 @@ +name: lint + +on: + pull_request: + +jobs: + run-linters: + name: Run linters + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3 + + - name: Set up Go + uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4.0.1 + with: + go-version-file: 'go.mod' + + - name: Run linters + uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3.6.0 + with: + version: latest diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000..c65ac6295 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,77 @@ +# Copyright (c) HashiCorp, Inc. +# SPDX-License-Identifier: MPL-2.0 + +linters: + disable-all: true + enable: + - gofmt + - govet + - unconvert + - staticcheck + - ineffassign + - unparam + - forbidigo + - gomodguard + +issues: + # Disable the default exclude list so that all excludes are explicitly + # defined in this file. + exclude-use-default: false + + exclude-rules: + # Temp Ignore SA9004: only the first constant in this group has an explicit type + # https://staticcheck.io/docs/checks#SA9004 + - linters: [staticcheck] + text: "SA9004:" + + - linters: [staticcheck] + text: 'SA1019: "io/ioutil" has been deprecated since Go 1.16' + + # An argument that always receives the same value is often not a problem. + - linters: [unparam] + text: "always receives" + + # Often functions will implement an interface that returns an error without + # needing to return an error. Sometimes the error return value is unnecessary + # but a linter can not tell the difference. + - linters: [unparam] + text: 'result \d+ \(error\) is always nil' + + # Allow unused parameters to start with an underscore. Arguments with a name + # of '_' are already ignored. + # Ignoring longer names that start with underscore allow for better + # self-documentation than a single underscore by itself. Underscore arguments + # should generally only be used when a function is implementing an interface. + - linters: [unparam] + text: "`_[^`]*` is unused" + + # Temp ignore some common unused parameters so that unparam can be added + # incrementally. + - linters: [unparam] + text: "`(t|resp|req|entMeta)` is unused" + +linters-settings: + govet: + check-shadowing: true + enable-all: true + disable: + - fieldalignment + - nilness + - shadow + - unusedwrite + forbidigo: + # Forbid the following identifiers (list of regexp). + forbid: + - '\bioutil\b(# Use io and os packages instead of ioutil)?' + - '\brequire\.New\b(# Use package-level functions with explicit TestingT)?' + - '\bassert\.New\b(# Use package-level functions with explicit TestingT)?' + # Exclude godoc examples from forbidigo checks. + # Default: true + exclude_godoc_examples: false + gofmt: + simplify: true + +run: + timeout: 10m + concurrency: 4 + skip-dirs-use-default: false