run:
  # The default runtime timeout is 1m, which doesn't work well on Github Actions.
  timeout: 4m

# NOTE: This file is populated by the lint-install tool. Local adjustments may be overwritten.
linters-settings:
  cyclop:
    # NOTE: This is a very high transitional threshold
    max-complexity: 37
    package-average: 34.0
    skip-tests: true

  gocognit:
    # NOTE: This is a very high transitional threshold
    min-complexity: 98

  dupl:
    threshold: 200

  goconst:
    min-len: 4
    min-occurrences: 5
    ignore-tests: true

  gosec:
    excludes:
      - G107 # Potential HTTP request made with variable url
      - G204 # Subprocess launched with function call as argument or cmd arguments
      - G404 # Use of weak random number generator (math/rand instead of crypto/rand

  errorlint:
    # these are still common in Go: for instance, exit errors.
    asserts: false

  exhaustive:
    default-signifies-exhaustive: true

  nestif:
    min-complexity: 8

  nolintlint:
    require-explanation: true
    allow-unused: false
    require-specific: true

  revive:
    ignore-generated-header: true
    severity: warning
    rules:
      - name: atomic
      - name: blank-imports
      - name: bool-literal-in-expr
      - name: confusing-naming
      - name: constant-logical-expr
      - name: context-as-argument
      - name: context-keys-type
      - name: deep-exit
      - name: defer
      - name: range-val-in-closure
      - name: range-val-address
      - name: dot-imports
      - name: error-naming
      - name: error-return
      - name: error-strings
      - name: errorf
      - name: exported
      - name: identical-branches
      - name: if-return
      - name: import-shadowing
      - name: increment-decrement
      - name: indent-error-flow
      - name: indent-error-flow
      - name: package-comments
      - name: range
      - name: receiver-naming
      - name: redefines-builtin-id
      - name: superfluous-else
      - name: struct-tag
      - name: time-naming
      - name: unexported-naming
      - name: unexported-return
      - name: unnecessary-stmt
      - name: unreachable-code
      - name: unused-parameter
      - name: var-declaration
      - name: var-naming
      - name: unconditional-recursion
      - name: waitgroup-by-value

  staticcheck:
    go: "1.16"

  unused:
    go: "1.16"

output:
  sort-results: true

linters:
  disable-all: true
  enable:
    - asciicheck
    - bodyclose
    - cyclop
    - deadcode
    - dogsled
    - dupl
    - durationcheck
    - errcheck
    - errname
    - errorlint
    - exhaustive
    - exportloopref
    - forcetypeassert
    - gocognit
    - goconst
    - gocritic
    - godot
    - gofmt
    - gofumpt
    - gosec
    - goheader
    - goimports
    - goprintffuncname
    - gosimple
    - govet
    - ifshort
    - importas
    - ineffassign
    - makezero
    - misspell
    - nakedret
    - nestif
    - nilerr
    - noctx
    - nolintlint
    - predeclared
    # disabling for the initial iteration of the linting tool
    # - promlinter
    - revive
    - rowserrcheck
    - sqlclosecheck
    - staticcheck
    - structcheck
    - stylecheck
    - thelper
    - tparallel
    - typecheck
    - unconvert
    - unparam
    - unused
    - varcheck
    - wastedassign
    - whitespace

  # Disabled linters, due to being misaligned with Go practices
  # - exhaustivestruct
  # - gochecknoglobals
  # - gochecknoinits
  # - goconst
  # - godox
  # - goerr113
  # - gomnd
  # - lll
  # - nlreturn
  # - testpackage
  # - wsl
  # Disabled linters, due to not being relevant to our code base:
  # - maligned
  # - prealloc "For most programs usage of prealloc will be a premature optimization."
  # Disabled linters due to bad error messages or bugs
  # - tagliatelle

issues:
  # Excluding configuration per-path, per-linter, per-text and per-source
  exclude-rules:
    - path: _test\.go
      linters:
        - dupl
        - errcheck
        - forcetypeassert
        - gocyclo
        - gosec
        - noctx

    - path: .*cmd.*
      linters:
        - noctx

    - path: main\.go
      linters:
        - noctx

    - path: .*cmd.*
      text: "deep-exit"

    - path: main\.go
      text: "deep-exit"

    # This check is of questionable value
    - linters:
        - tparallel
      text: "call t.Parallel on the top level as well as its subtests"

  # Don't hide lint issues just because there are many of them
  max-same-issues: 0
  max-issues-per-linter: 0
