linters:
  enable:
  - asciicheck
  - bidichk
  - bodyclose
  - contextcheck
  - decorder
  - depguard
  - dogsled
  - dupl
  - dupword
  - durationcheck
  - errcheck
  - errchkjson
  - errname
  - errorlint
  - execinquery
  - exportloopref
  - forbidigo
  - forcetypeassert
  - gci
  - gocritic
  - godot
  - goerr113
  - gofmt
  - gofumpt
  - goimports
  - gomodguard
  - goprintffuncname
  - gosec
  - gosimple
  - govet
  - importas
  - ineffassign
  - interfacebloat
  - ireturn
  - lll
  - loggercheck
  - makezero
  - misspell
  - nilerr
  - noctx
  - nolintlint
  - nosprintfhostport
  - prealloc
  - predeclared
  - promlinter
  - reassign
  - revive
  - staticcheck
  - stylecheck
  - tagliatelle
  - testableexamples
  - tenv
  - thelper
  - typecheck
  - unconvert
  - unparam
  - unused
  - whitespace
  disable:
  - asasalint
  - cyclop
  - exhaustive
  - exhaustivestruct
  - exhaustruct
  - funlen
  - gochecknoglobals
  - gochecknoinits
  - gocognit
  - goconst
  - gocyclo
  - godox
  - goheader
  - gomnd
  - gomoddirectives
  - maintidx
  - maligned
  - nakedret
  - nestif
  - nilnil
  - nlreturn
  - nonamedreturns
  - nosnakecase
  - paralleltest
  - rowserrcheck # https://github.com/golangci/golangci-lint/issues/2649
  - sqlclosecheck # https://github.com/golangci/golangci-lint/issues/2649
  - structcheck # https://github.com/golangci/golangci-lint/issues/2649
  - testpackage
  - tparallel
  - varnamelen
  - wastedassign # https://github.com/golangci/golangci-lint/issues/2649
  - wrapcheck
  - wsl

linters-settings:
  forbidigo:
    forbid:
    - ^fmt\.Print.*$
    - ^ioutil\..*$
    - ^os\.(DirEntry|FileInfo|FileMode|Is.*|Mode.*)$
  gci:
    sections:
    - standard
    - default
    - prefix(github.com/twpayne/chezmoi)
  gofumpt:
    extra-rules: true
    lang-version: '1.18'
    module-path: github.com/twpayne/chezmoi
  goimports:
    local-prefixes: github.com/twpayne/chezmoi
  ireturn:
    allow:
    - anon
    - empty
    - error
    - github\.com/charmbracelet/bubbletea\.Model
    - github\.com/charmbracelet/bubbletea\.Msg
    - github\.com/go-git/go-git/v5/plumbing/format/diff\.File
    - github\.com/go-git/go-git/v5/plumbing/format/diff\.Patch
    - github\.com/mitchellh/mapstructure\.DecodeHookFunc
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.ActualStateEntry
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.Encryption
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.Format
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.SourceStateOrigin
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.SourceStateEntry
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.System
    - github\.com/twpayne/chezmoi/v2/pkg/chezmoi\.TargetStateEntry
    - github\.com/twpayne/go-vfs/v4\.FS
    - stdlib
  misspell:
    locale: US
  stylecheck:
    checks:
    - all

issues:
  include:
  - EXC0011   # include issues about comments from `stylecheck`
  exclude-rules:
  - linters:
    - goerr113
    text: do not define dynamic errors, use wrapped static errors instead
  - linters:
    - forbidigo
    - gosec
    - lll
    path: ^internal/cmds/
  - linters:
    - gosec
    - lll
    path: _test\.go$
  - linters:
    - lll
    path: ^pkg/shell/shellcgo\.go$
