linters-settings:
  errcheck:
    ignore: fmt:.*,go.uber.org/zap/zapcore:^Add.*
    ignoretests: true
  gci:
    sections:
      - standard # Standard section: captures all standard packages.
      - default # Default section: contains all imports that could not be matched to another section type.
      - prefix(github.com/caddyserver/caddy/v2/cmd) # ensure that this is always at the top and always has a line break.
      - prefix(github.com/caddyserver/caddy) # Custom section: groups all imports with the specified Prefix.
    # Skip generated files.
    # Default: true
    skip-generated: true
    # Enable custom order of sections.
    # If `true`, make the section order the same as the order of `sections`.
    # Default: false
    custom-order: true
  exhaustive:
    ignore-enum-types: reflect.Kind|svc.Cmd

linters:
  disable-all: true
  enable:
    - asasalint
    - asciicheck
    - bidichk
    - bodyclose
    - decorder
    - dogsled
    - dupl
    - dupword
    - durationcheck
    - errcheck
    - errname
    - exhaustive
    - exportloopref
    - gci
    - gofmt
    - goimports
    - gofumpt
    - gosec
    - gosimple
    - govet
    - ineffassign
    - importas
    - misspell
    - prealloc
    - promlinter
    - sloglint
    - sqlclosecheck
    - staticcheck
    - tenv
    - testableexamples
    - testifylint
    - tparallel
    - typecheck
    - unconvert
    - unused
    - wastedassign
    - whitespace
    - zerologlint
  # these are implicitly disabled:
  # - containedctx
  # - contextcheck
  # - cyclop
  # - depguard
  # - errchkjson
  # - errorlint
  # - exhaustruct
  # - execinquery
  # - exhaustruct
  # - forbidigo
  # - forcetypeassert
  # - funlen
  # - ginkgolinter
  # - gocheckcompilerdirectives
  # - gochecknoglobals
  # - gochecknoinits
  # - gochecksumtype
  # - gocognit
  # - goconst
  # - gocritic
  # - gocyclo
  # - godot
  # - godox
  # - goerr113
  # - goheader
  # - gomnd
  # - gomoddirectives
  # - gomodguard
  # - goprintffuncname
  # - gosmopolitan
  # - grouper
  # - inamedparam
  # - interfacebloat
  # - ireturn
  # - lll
  # - loggercheck
  # - maintidx
  # - makezero
  # - mirror
  # - musttag
  # - nakedret
  # - nestif
  # - nilerr
  # - nilnil
  # - nlreturn
  # - noctx
  # - nolintlint
  # - nonamedreturns
  # - nosprintfhostport
  # - paralleltest
  # - perfsprint
  # - predeclared
  # - protogetter
  # - reassign
  # - revive
  # - rowserrcheck
  # - stylecheck
  # - tagalign
  # - tagliatelle
  # - testpackage
  # - thelper
  # - unparam
  # - usestdlibvars
  # - varnamelen
  # - wrapcheck
  # - wsl

run:
  # default concurrency is a available CPU number.
  # concurrency: 4 # explicitly omit this value to fully utilize available resources.
  deadline: 5m
  issues-exit-code: 1
  tests: false

# output configuration options
output:
  format: 'colored-line-number'
  print-issued-lines: true
  print-linter-name: true

issues:
  exclude-rules:
    # we aren't calling unknown URL
    - text: 'G107' # G107: Url provided to HTTP request as taint input
      linters:
        - gosec
    # as a web server that's expected to handle any template, this is totally in the hands of the user.
    - text: 'G203' # G203: Use of unescaped data in HTML templates
      linters:
        - gosec
    # we're shelling out to known commands, not relying on user-defined input.
    - text: 'G204' # G204: Audit use of command execution
      linters:
        - gosec
    # the choice of weakrand is deliberate, hence the named import "weakrand"
    - path: modules/caddyhttp/reverseproxy/selectionpolicies.go
      text: 'G404' # G404: Insecure random number source (rand)
      linters:
        - gosec
    - path: modules/caddyhttp/reverseproxy/streaming.go
      text: 'G404' # G404: Insecure random number source (rand)
      linters:
        - gosec
    - path: modules/logging/filters.go
      linters:
        - dupl
