run:
  timeout: 15m

output:
  sort-results: true

linters:
  # Keep this list sorted alphabetically
  enable:
    - depguard
    - errorlint
    - exptostd
    - gocritic
    - godot
    - gofumpt
    - goimports
    - loggercheck
    - misspell
    - nilnesserr
    - nolintlint
    - perfsprint
    - predeclared
    - revive
    - sloglint
    - testifylint
    - unconvert
    - unused
    - usestdlibvars
    - whitespace

issues:
  max-issues-per-linter: 0
  max-same-issues: 0
  # The default exclusions are too aggressive. For one, they
  # essentially disable any linting on doc comments. We disable
  # default exclusions here and add exclusions fitting our codebase
  # further down.
  exclude-use-default: false
  exclude-files:
    # Skip autogenerated files.
    - ^.*\.(pb|y)\.go$
  exclude-dirs:
    # Copied it from a different source.
    - storage/remote/otlptranslator/prometheusremotewrite
    - storage/remote/otlptranslator/prometheus
  exclude-rules:
    - linters:
        - errcheck
      # Taken from the default exclusions (that are otherwise disabled above).
      text: Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked
    - linters:
        - govet
      # We use many Seek methods that do not follow the usual pattern.
      text: "stdmethods: method Seek.* should have signature Seek"
    - linters:
        - revive
      # We have stopped at some point to write doc comments on exported symbols.
      # TODO(beorn7): Maybe we should enforce this again? There are ~500 offenders right now.
      text: exported (.+) should have comment( \(or a comment on this block\))? or be unexported
    - linters:
        - gocritic
      text: "appendAssign"
    - path: _test.go
      linters:
        - errcheck
    - path: "tsdb/head_wal.go"
      linters:
        - errorlint
    - linters:
        - godot
      source: "^// ==="
    - linters:
        - perfsprint
      text: "fmt.Sprintf can be replaced with string concatenation"
linters-settings:
  depguard:
    rules:
      main:
        deny:
          - pkg: "sync/atomic"
            desc: "Use go.uber.org/atomic instead of sync/atomic"
          - pkg: "github.com/stretchr/testify/assert"
            desc: "Use github.com/stretchr/testify/require instead of github.com/stretchr/testify/assert"
          - pkg: "github.com/go-kit/kit/log"
            desc: "Use github.com/go-kit/log instead of github.com/go-kit/kit/log"
          - pkg: "io/ioutil"
            desc: "Use corresponding 'os' or 'io' functions instead."
          - pkg: "regexp"
            desc: "Use github.com/grafana/regexp instead of regexp"
          - pkg: "github.com/pkg/errors"
            desc: "Use 'errors' or 'fmt' instead of github.com/pkg/errors"
          - pkg: "gzip"
            desc: "Use github.com/klauspost/compress instead of gzip"
          - pkg: "zlib"
            desc: "Use github.com/klauspost/compress instead of zlib"
          - pkg: "golang.org/x/exp/slices"
            desc: "Use 'slices' instead."
  errcheck:
    exclude-functions:
      # Don't flag lines such as "io.Copy(io.Discard, resp.Body)".
      - io.Copy
      # The next two are used in HTTP handlers, any error is handled by the server itself.
      - io.WriteString
      - (net/http.ResponseWriter).Write
      # No need to check for errors on server's shutdown.
      - (*net/http.Server).Shutdown
      # Never check for rollback errors as Rollback() is called when a previous error was detected.
      - (github.com/prometheus/prometheus/storage.Appender).Rollback
  goimports:
    local-prefixes: github.com/prometheus/prometheus
  gofumpt:
    extra-rules: true
  perfsprint:
     # Optimizes `fmt.Errorf`.
    errorf: true
  revive:
    # By default, revive will enable only the linting rules that are named in the configuration file.
    # So, it's needed to explicitly enable all required rules here.
    rules:
      # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
      - name: blank-imports
      - name: comment-spacings
      - name: context-as-argument
        arguments:
          # Allow functions with test or bench signatures.
          - allowTypesBefore: "*testing.T,testing.TB"
      - name: context-keys-type
      - name: dot-imports
      # A lot of false positives: incorrectly identifies channel draining as "empty code block".
      # See https://github.com/mgechev/revive/issues/386
      - name: empty-block
        disabled: true
      - name: error-naming
      - name: error-return
      - name: error-strings
      - name: errorf
      - name: exported
      - name: increment-decrement
      - name: indent-error-flow
      - name: package-comments
        # TODO(beorn7): Currently, we have a lot of missing package doc comments. Maybe we should have them.
        disabled: true
      - name: range
      - name: receiver-naming
      - name: redefines-builtin-id
      - name: superfluous-else
      - name: time-naming
      - name: unexported-return
      - name: unreachable-code
      - name: unused-parameter
        disabled: true
      - name: var-declaration
      - name: var-naming
  testifylint:
    disable:
      - float-compare
      - go-require
    enable-all: true
