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

[linters-settings]

  [linters-settings.govet]
    check-shadowing = false

  [linters-settings.golint]
    min-confidence = 0.0

  [linters-settings.gocyclo]
    min-complexity = 14.0

  [linters-settings.goconst]
    min-len = 3.0
    min-occurrences = 4.0

  [linters-settings.misspell]
    locale = "US"

  [linters-settings.funlen]
    lines = 230 # default 60
    statements = 120 # default 40

  [linters-settings.forbidigo]
    forbid = [
      '^print(ln)?$',
      '^spew\.Print(f|ln)?$',
      '^spew\.Dump$',
    ]

  [linters-settings.depguard]
    list-type = "blacklist"
    include-go-root = false
    packages = ["github.com/pkg/errors"]

  [linters-settings.godox]
    keywords = ["FIXME"]

  [linters-settings.importas]
    corev1 = "k8s.io/api/core/v1"
    networkingv1beta1 = "k8s.io/api/networking/v1beta1"
    extensionsv1beta1 = "k8s.io/api/extensions/v1beta1"
    metav1 = "k8s.io/apimachinery/pkg/apis/meta/v1"
    kubeerror = "k8s.io/apimachinery/pkg/api/errors"
    composeapi = "github.com/docker/compose/v2/pkg/api"

  [linters-settings.revive]
    [[linters-settings.revive.rules]]
      name = "struct-tag"
    [[linters-settings.rules]]
      name = "blank-imports"
    [[linters-settings.rules]]
      name = "context-as-argument"
    [[linters-settings.rules]]
      name = "context-keys-type"
    [[linters-settings.rules]]
      name = "dot-imports"
    [[linters-settings.rules]]
      name = "error-return"
    [[linters-settings.rules]]
      name = "error-strings"
    [[linters-settings.rules]]
      name = "error-naming"
    [[linters-settings.rules]]
      name = "exported"
    [[linters-settings.rules]]
      name = "if-return"
    [[linters-settings.rules]]
      name = "increment-decrement"
    [[linters-settings.rules]]
      name = "var-naming"
    [[linters-settings.rules]]
      name = "var-declaration"
    [[linters-settings.rules]]
      name = "package-comments"
    [[linters-settings.rules]]
      name = "range"
    [[linters-settings.rules]]
      name = "receiver-naming"
    [[linters-settings.rules]]
      name = "time-naming"
    [[linters-settings.rules]]
      name = "unexported-return"
    [[linters-settings.rules]]
      name = "indent-error-flow"
    [[linters-settings.rules]]
      name = "errorf"
    [[linters-settings.rules]]
      name = "empty-block"
    [[linters-settings.rules]]
      name = "superfluous-else"
    [[linters-settings.rules]]
      name = "unused-parameter"
    [[linters-settings.rules]]
      name = "unreachable-code"
    [[linters-settings.rules]]
      name = "redefines-builtin-id"

  [linters-settings.gomoddirectives]
    replace-allow-list = [
      "github.com/abbot/go-http-auth",
      "github.com/go-check/check",
      "github.com/gorilla/mux",
      "github.com/mailgun/minheap",
      "github.com/mailgun/multibuf",
      "github.com/jaguilar/vt100",
    ]

[linters]
  enable-all = true
  disable = [
    "scopelint", # Deprecated
    "interfacer", # Deprecated
    "maligned", # Deprecated
    "golint", # Deprecated
    "execinquery", # Not relevant (SQL)
    "sqlclosecheck", # Not relevant (SQL)
    "rowserrcheck", # Not relevant (SQL)
    "lll", # Not relevant
    "gocyclo", # FIXME must be fixed
    "cyclop", # Duplicate of gocyclo
    "gocognit", # Too strict
    "nestif", # Too many false-positive.
    "prealloc", # Too many false-positive.
    "makezero", # Not relevant
    "ifshort", # 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
    "exhaustivestruct", # Not relevant
    "exhaustruct", # duplicate of exhaustivestruct
    "goerr113", # Too strict
    "wrapcheck", # Too strict
    "noctx", # Too strict
    "bodyclose", # Too many false-positive and panics.
    "unparam", # Too strict
    "godox", # Too strict
    "forcetypeassert", # Too strict
    "tagliatelle", # Not compatible with current tags.
    "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", # 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",
    "SA1019: http.CloseNotifier has been deprecated",  # FIXME must be fixed
    "SA1019: cfg.SSLRedirect is deprecated",
    "SA1019: cfg.SSLTemporaryRedirect is deprecated",
    "SA1019: cfg.SSLHost is deprecated",
    "SA1019: cfg.SSLForceHost is deprecated",
    "SA1019: cfg.FeaturePolicy is deprecated",
    "SA1019: c.Providers.ConsulCatalog.Namespace is deprecated",
    "SA1019: c.Providers.Consul.Namespace is deprecated",
  ]
 [[issues.exclude-rules]]
    path = "(.+)_test.go"
    linters = ["goconst", "funlen", "godot"]
 [[issues.exclude-rules]]
    path = "integration/.+_test.go"
    text = "Error return value of `cmd\\.Process\\.Kill` is not checked"
 [[issues.exclude-rules]]
    path = "integration/(consul_catalog_test|constraint_test).go"
    text = "Error return value of `(s.deregisterService|s.deregisterAgentService)` is not checked"
 [[issues.exclude-rules]]
    path = "integration/grpc_test.go"
    text = "Error return value of `closer` is not checked"
 [[issues.exclude-rules]]
    path = "pkg/h2c/h2c.go"
    text = "Error return value of `rw.Write` is not checked"
 [[issues.exclude-rules]]
    path = "pkg/provider/docker/builder_test.go"
    text = "(U1000: func )?`(.+)` is unused"
 [[issues.exclude-rules]]
    path = "pkg/provider/kubernetes/builder_(endpoint|service)_test.go"
    text = "(U1000: func )?`(.+)` is unused"
 [[issues.exclude-rules]]
    path = "pkg/server/service/bufferpool.go"
    text = "SA6002: argument should be pointer-like to avoid allocations"
 [[issues.exclude-rules]]
    path = "cmd/configuration.go"
    text = "string `traefik` has (\\d) occurrences, make it a constant"
 [[issues.exclude-rules]]
    path = "pkg/server/middleware/middlewares.go"
    text = "Function 'buildConstructor' has too many statements"
 [[issues.exclude-rules]]
    path = "pkg/tracing/haystack/logger.go"
    linters = ["goprintffuncname"]
 [[issues.exclude-rules]]
    path = "pkg/tracing/tracing.go"
    text = "printf-like formatting function 'SetErrorWithEvent' should be named 'SetErrorWithEventf'"
 [[issues.exclude-rules]]
    path = "pkg/log/deprecated.go"
    linters = ["godot"]
 [[issues.exclude-rules]]
    path = "(.+)\\.go"
    text = "struct-tag: unknown option 'inline' in JSON tag"
 [[issues.exclude-rules]]
    path = "pkg/server/router/tcp/manager.go"
    text = "Function 'buildEntryPointHandler' is too long (.+)"
