linters:
  # Don't enable any linters by default; just the ones that we explicitly
  # enable in the list below.
  disable-all: true
  enable:
    - bidichk
    - gofmt
    - goimports
    - misspell
    - revive

# Configuration for how we run golangci-lint
run:
  timeout: 5m

issues:
  # Excluding configuration per-path, per-linter, per-text and per-source
  exclude-rules:
    # These are forks of an upstream package and thus are exempt from stylistic
    # changes that would make pulling in upstream changes harder.
    - path: tempfork/.*\.go
      text: "File is not `gofmt`-ed with `-s` `-r 'interface{} -> any'`"
    - path: util/singleflight/.*\.go
      text: "File is not `gofmt`-ed with `-s` `-r 'interface{} -> any'`"

# Per-linter settings are contained in this top-level key
linters-settings:
  # Enable all rules by default; we don't use invisible unicode runes.
  bidichk:

  gofmt:
    rewrite-rules:
      - pattern: 'interface{}'
        replacement: 'any'

  goimports:

  misspell:

  revive:
    enable-all-rules: false
    ignore-generated-header: true
    rules:
      - name: atomic
      - name: context-keys-type
      - name: defer
        arguments: [[
          # Calling 'recover' at the time a defer is registered (i.e. "defer recover()") has no effect.
          "immediate-recover",
          # Calling 'recover' outside of a deferred function has no effect
          "recover",
          # Returning values from a deferred function has no effect
          "return",
        ]]
      - name: duplicated-imports
      - name: errorf
      - name: string-of-int
      - name: time-equal
      - name: unconditional-recursion
      - name: useless-break
      - name: waitgroup-by-value