run:
  timeout: 10m
  skip-files: []
  skip-dirs:
    - pkg/provider/kubernetes/crd/generated/

linters-settings:
  govet:
    enable-all: true
    disable:
      - shadow
      - fieldalignment
  gocyclo:
    min-complexity: 14
  goconst:
    min-len: 3
    min-occurrences: 4
  misspell:
    locale: US
  funlen:
    lines: -1
    statements: 120
  forbidigo:
    forbid:
      - ^print(ln)?$
      - ^spew\.Print(f|ln)?$
      - ^spew\.Dump$
  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
          - pkg: "k8s.io/api/networking/v1beta1"
            desc: This API is deprecated
          - pkg: "k8s.io/api/extensions/v1beta1"
            desc: This API is deprecated
  godox:
    keywords:
      - FIXME
  importas:
    no-unaliased: true
    alias:
      - alias: composeapi
        pkg: github.com/docker/compose/v2/pkg/api

      # Standard Kubernetes rewrites:
      - alias: corev1
        pkg: "k8s.io/api/core/v1"
      - alias: netv1
        pkg: "k8s.io/api/networking/v1"
      - alias: admv1
        pkg: "k8s.io/api/admission/v1"
      - alias: admv1beta1
        pkg: "k8s.io/api/admission/v1beta1"
      - alias: metav1
        pkg: "k8s.io/apimachinery/pkg/apis/meta/v1"
      - alias: ktypes
        pkg: "k8s.io/apimachinery/pkg/types"
      - alias: kerror
        pkg: "k8s.io/apimachinery/pkg/api/errors"
      - alias: kclientset
        pkg: "k8s.io/client-go/kubernetes"
      - alias: kinformers
        pkg: "k8s.io/client-go/informers"
      - alias: ktesting
        pkg: "k8s.io/client-go/testing"
      - alias: kschema
        pkg: "k8s.io/apimachinery/pkg/runtime/schema"
      - alias: kscheme
        pkg: "k8s.io/client-go/kubernetes/scheme"
      - alias: kversion
        pkg: "k8s.io/apimachinery/pkg/version"
      - alias: kubefake
        pkg: "k8s.io/client-go/kubernetes/fake"
      - alias: discoveryfake
        pkg: "k8s.io/client-go/discovery/fake"

      # Kubernetes Gateway rewrites:
      - alias: gateclientset
        pkg: "sigs.k8s.io/gateway-api/pkg/client/clientset/gateway/versioned"
      - alias: gateinformers
        pkg: "sigs.k8s.io/gateway-api/pkg/client/informers/gateway/externalversions"
      - alias: gatev1alpha2
        pkg: "sigs.k8s.io/gateway-api/apis/v1alpha2"

      # Traefik Kubernetes rewrites:
      - alias: traefikv1alpha1
        pkg: "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/traefikio/v1alpha1"
      - alias: traefikclientset
        pkg: "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned"
      - alias: traefikinformers
        pkg: "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/generated/informers/externalversions"
      - alias: traefikscheme
        pkg: "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned/scheme"
      - alias: traefikcrdfake
        pkg: "github.com/traefik/traefik/v3/pkg/provider/kubernetes/crd/generated/clientset/versioned/fake"
  tagalign:
    align: false
    sort: true
    order:
      - description
      - json
      - toml
      - yaml
      - yml
      - label
      - label-slice-as-struct
      - file
      - kv
      - export
  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
  gomoddirectives:
    replace-allow-list:
      - github.com/abbot/go-http-auth
      - github.com/gorilla/mux
      - github.com/mailgun/minheap
      - github.com/mailgun/multibuf
      - github.com/jaguilar/vt100
      - github.com/cucumber/godog
  testifylint:
    enable:
      - bool-compare
      - compares
      - empty
      - error-is-as
      - error-nil
      - expected-actual
      - float-compare
      - len
      - suite-extra-assert-call
      - suite-thelper
  staticcheck:
    checks:
      - all
      - -SA1019
linters:
  enable-all: true
  disable:
    - deadcode # deprecated
    - exhaustivestruct # deprecated
    - golint # deprecated
    - ifshort # deprecated
    - interfacer # deprecated
    - maligned # deprecated
    - nosnakecase # deprecated
    - scopelint # deprecated
    - scopelint # deprecated
    - structcheck # deprecated
    - varcheck # deprecated
    - sqlclosecheck # not relevant (SQL)
    - rowserrcheck # not relevant (SQL)
    - execinquery # not relevant (SQL)
    - cyclop # duplicate of gocyclo
    - lll # Not relevant
    - gocyclo # FIXME must be fixed
    - gocognit # Too strict
    - nestif # Too many false-positive.
    - prealloc # Too many false-positive.
    - makezero # Not relevant
    - dupl # Too strict
    - gosec # Too strict
    - gochecknoinits
    - gochecknoglobals
    - wsl # Too strict
    - nlreturn # Not relevant
    - gomnd # Too strict
    - stylecheck # skip because report issues related to some generated files.
    - testpackage # Too strict
    - tparallel # Not relevant
    - paralleltest # Not relevant
    - exhaustive # Not relevant
    - exhaustruct # Not relevant
    - goerr113 # Too strict
    - wrapcheck # Too strict
    - noctx # Too strict
    - bodyclose # too many false-positive
    - forcetypeassert # Too strict
    - tagliatelle # Too strict
    - varnamelen # Not relevant
    - nilnil # Not relevant
    - ireturn # Not relevant
    - contextcheck # too many false-positive
    - containedctx # too many false-positive
    - maintidx # kind of duplicate of gocyclo
    - nonamedreturns # Too strict
    - gosmopolitan  # not relevant

issues:
  exclude-use-default: false
  max-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'
    - "should have a package comment, unless it's in another file for this package"
  exclude-rules:
    - path: '(.+)_test.go'
      linters:
        - goconst
        - funlen
        - godot
    - path: '(.+)_test.go'
      text: ' always receives '
      linters:
        - unparam
    - path: '(.+)\.go'
      text: 'struct-tag: unknown option ''inline'' in JSON tag'
      linters:
        - revive
    - path: pkg/server/service/bufferpool.go
      text: 'SA6002: argument should be pointer-like to avoid allocations'
    - path: pkg/server/middleware/middlewares.go
      text: "Function 'buildConstructor' has too many statements"
      linters:
        - funlen
    - path: pkg/logs/haystack.go
      linters:
        - goprintffuncname
    - path: pkg/tracing/tracing.go
      text: "printf-like formatting function 'SetErrorWithEvent' should be named 'SetErrorWithEventf'"
      linters:
        - goprintffuncname
    - path: pkg/tls/tlsmanager_test.go
      text: 'SA1019: config.ClientCAs.Subjects has been deprecated since Go 1.18'
    - path: pkg/types/tls_test.go
      text: 'SA1019: tlsConfig.RootCAs.Subjects has been deprecated since Go 1.18'
    - path: pkg/provider/kubernetes/crd/kubernetes.go
      text: 'SA1019: middleware.Spec.IPWhiteList is deprecated: please use IPAllowList instead.'
    - path: pkg/server/middleware/tcp/middlewares.go
      text: 'SA1019: config.IPWhiteList is deprecated: please use IPAllowList instead.'
    - path: pkg/server/middleware/middlewares.go
      text: 'SA1019: config.IPWhiteList is deprecated: please use IPAllowList instead.'
    - path: pkg/provider/kubernetes/(crd|gateway)/client.go
      linters:
        - interfacebloat
    - path: pkg/metrics/metrics.go
      linters:
        - interfacebloat
    - path: integration/healthcheck_test.go
      text: 'Duplicate words \(wsp2,\) found'
      linters:
        - dupword
    - path: pkg/types/domain_test.go
      text: 'Duplicate words \(sub\) found'
      linters:
        - dupword
    - path: pkg/provider/kubernetes/crd/kubernetes.go
      text: "Function 'loadConfigurationFromCRD' has too many statements"
      linters:
        - funlen
    - path: pkg/provider/kubernetes/gateway/client_mock_test.go
      text: 'unusedwrite: unused write to field'
      linters:
        - govet
    - path: pkg/cli/deprecation.go
      linters:
        - goconst
    - path: pkg/cli/loader_file.go
      linters:
        - goconst
