linters:
  enable-all: true
  disable:
    - gomnd # deprecated
    - cyclop # duplicate of gocyclo
    - sqlclosecheck # not relevant (SQL)
    - rowserrcheck # not relevant (SQL)
    - execinquery # not relevant (SQL)
    - lll
    - gosec
    - dupl # not relevant
    - prealloc # too many false-positive
    - bodyclose # too many false-positive
    - mnd
    - testpackage # not relevant
    - tparallel # not relevant
    - paralleltest # not relevant
    - nestif # too many false-positive
    - wrapcheck
    - err113 # not relevant
    - nlreturn # not relevant
    - wsl # not relevant
    - exhaustive # not relevant
    - exhaustruct # not relevant
    - makezero # not relevant
    - forbidigo
    - varnamelen # not relevant
    - nilnil # not relevant
    - ireturn # not relevant
    - contextcheck # too many false-positive
    - tenv # we already have a test "framework" to handle env vars
    - noctx
    - forcetypeassert
    - tagliatelle
    - errname
    - errchkjson
    - nonamedreturns
    - musttag # false-positive https://github.com/junk1tm/musttag/issues/17
    - gosmopolitan  # not relevant
    - exportloopref # Useless with go1.22
    - canonicalheader # Can create side effects in the context of API clients
    - usestdlibvars # false-positive https://github.com/sashamelentyev/usestdlibvars/issues/96

linters-settings:
  govet:
    enable:
      - shadow
  gocyclo:
    min-complexity: 12
  goconst:
    min-len: 3
    min-occurrences: 3
  funlen:
    lines: -1
    statements: 50
  misspell:
    locale: US
    ignore-words:
      - internetbs
  depguard:
    rules:
      main:
        deny:
          - pkg: "github.com/instana/testify"
            desc: not allowed
          - pkg: "github.com/pkg/errors"
            desc: Should be replaced by standard lib errors package
  tagalign:
    align: false
    order:
      - xml
      - json
      - yaml
      - yml
      - toml
      - mapstructure
      - url
  godox:
    keywords:
      - FIXME
  gocritic:
    enabled-tags:
      - diagnostic
      - style
      - performance
    disabled-checks:
      - paramTypeCombine # already handle by gofumpt.extra-rules
      - whyNoLint # already handle by nonolint
      - unnamedResult
      - hugeParam
      - sloppyReassign
      - rangeValCopy
      - octalLiteral
      - ptrToRefParam
      - appendAssign
      - ruleguard
      - httpNoBody
      - exposedSyncMutex
  revive:
    rules:
      - name: struct-tag
      - name: blank-imports
      - name: context-as-argument
      - name: context-keys-type
      - name: dot-imports
      - name: error-return
      - name: error-strings
      - name: error-naming
      - name: exported
        disabled: true
      - name: if-return
      - name: increment-decrement
      - name: var-naming
      - name: var-declaration
      - name: package-comments
        disabled: true
      - name: range
      - name: receiver-naming
      - name: time-naming
      - name: unexported-return
      - name: indent-error-flow
      - name: errorf
      - name: empty-block
      - name: superfluous-else
      - name: unused-parameter
        disabled: true
      - name: unreachable-code
      - name: redefines-builtin-id
  testifylint:
    disable:
      - require-error
      - go-require
  perfsprint:
    err-error: true
    errorf: true
    sprintf1: true
    strconcat: false

run:
  timeout: 10m

output:
  show-stats: true
  sort-results: true
  sort-order:
    - linter
    - file

issues:
  exclude-generated: strict
  exclude-use-default: false
  max-issues-per-linter: 0
  max-same-issues: 0
  exclude:
    - 'Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked'
    - 'exported (type|method|function) (.+) should have comment or be unexported'
    - 'ST1000: at least one file in a package should have a package comment'
  exclude-rules:
    - path: (.+)_test.go
      linters:
        - funlen
        - goconst
        - maintidx
    - path: (.+)_test.go
      text: 'Error return value of `fmt.Fprintln` is not checked'
      linters:
        - errcheck
    - path: providers/dns/dns_providers.go
      linters:
        - gocyclo
    - path: certcrypto/crypto.go
      text: '(tlsFeatureExtensionOID|ocspMustStapleFeature) is a global variable'
      linters:
        - gochecknoglobals
    - path: challenge/dns01/nameserver.go
      text: '(defaultNameservers|recursiveNameservers|fqdnSoaCache|muFqdnSoaCache) is a global variable'
      linters:
        - gochecknoglobals
    - path: challenge/dns01/nameserver_.+.go
      text: 'dnsTimeout is a global variable'
      linters:
        - gochecknoglobals
    - path: challenge/dns01/nameserver_test.go
      text: 'findXByFqdnTestCases is a global variable'
      linters:
        - gochecknoglobals
    - path: challenge/http01/domain_matcher.go
      text: 'string `Host` has \d occurrences, make it a constant'
      linters:
        - goconst
    - path: challenge/http01/domain_matcher.go
      text: 'cyclomatic complexity \d+ of func `parseForwardedHeader` is high'
      linters:
        - gocyclo
    - path: challenge/http01/domain_matcher.go
      text: "Function 'parseForwardedHeader' has too many statements"
      linters:
        - funlen
    - path: challenge/tlsalpn01/tls_alpn_challenge.go
      text: 'idPeAcmeIdentifierV1 is a global variable'
      linters:
        - gochecknoglobals
    - path: log/logger.go
      text: 'Logger is a global variable'
      linters:
        - gochecknoglobals
    - path: 'e2e/(dnschallenge/)?[\d\w]+_test.go'
      text: load is a global variable
      linters:
        - gochecknoglobals
    - path: 'providers/dns/([\d\w]+/)*[\d\w]+_test.go'
      text: 'envTest is a global variable'
      linters:
        - gochecknoglobals
    - path: 'providers/http/([\d\w]+/)*[\d\w]+_test.go'
      text: 'envTest is a global variable'
      linters:
        - gochecknoglobals
    - path: providers/dns/namecheap/namecheap_test.go
      text: 'testCases is a global variable'
      linters:
        - gochecknoglobals
    - path: providers/dns/acmedns/acmedns_test.go
      text: 'egTestAccount is a global variable'
      linters:
        - gochecknoglobals
    - path: providers/http/memcached/memcached_test.go
      text: 'memcachedHosts is a global variable'
      linters:
        - gochecknoglobals
    - path: cmd/zz_gen_cmd_dnshelp.go
      linters:
        - gocyclo
        - funlen
    - path: providers/dns/checkdomain/internal/types.go
      text: '`payed` is a misspelling of `paid`'
      linters:
        - misspell
    - path: platform/tester/env_test.go
      linters:
        - thelper
    - path: providers/dns/oraclecloud/oraclecloud_test.go
      text: 'SA1019: x509.EncryptPEMBlock has been deprecated since Go 1.16'
      linters:
        - staticcheck
    - path: providers/dns/sakuracloud/wrapper.go
      text: 'mu is a global variable'
      linters:
        - gochecknoglobals
    - path: cmd/cmd_renew.go
      text: 'cyclomatic complexity \d+ of func `(renewForDomains|renewForCSR)` is high'
      linters:
        - gocyclo
    - path: providers/dns/cpanel/cpanel.go
      text: 'cyclomatic complexity 13 of func `\(\*DNSProvider\)\.CleanUp` is high'
      linters:
        - gocyclo

    # Those elements have been replaced by non-exposed structures.
    - path: providers/dns/linode/linode_test.go
      linters:
        - staticcheck
      text: "SA1019: linodego\\.(DomainsPagedResponse|DomainRecordsPagedResponse) is deprecated"
