---
linters:
  disable-all: true
  enable:
    - asasalint
    - asciicheck
    - bidichk
    - bodyclose
    - depguard
    - dogsled
    - errcheck
    - errname
    - errorlint
    - exportloopref
    - gocheckcompilerdirectives
    - gocritic
    - goprintffuncname
    - gosec
    - gosimple
    - govet
    - ineffassign
    - interfacebloat
    - lll
    - makezero
    - nakedret
    - nilerr
    - nolintlint
    - perfsprint
    - prealloc
    - predeclared
    - revive
    - sqlclosecheck
    - staticcheck
    - tenv
    - testifylint
    - tparallel
    - typecheck
    - unconvert
    - unparam
    - unused

linters-settings:
  depguard:
    rules:
      # Name of a rule.
      main:
        # Packages that are not allowed where the value is a suggestion.
        deny:
          - pkg: log
            desc: 'Use injected telegraf.Logger instead'
        # List of file globs that will match this list of settings to compare against.
        # Default: $all
        files:
          - "!**/agent/**"
          - "!**/cmd/**"
          - "!**/config/**"
          - "!**/filter/**"
          - "!**/internal/**"
          - "!**/logger/**"
          - "!**/metric/**"
          - "!**/models/**"
          - "!**/plugins/serializers/**"
          - "!**/scripts/**"
          - "!**/selfstat/**"
          - "!**/testutil/**"
          - "!**/tools/**"
          - "!**/*_test.go"
  errcheck:
    # List of functions to exclude from checking, where each entry is a single function to exclude.
    # See https://github.com/kisielk/errcheck#excluding-functions for details.
    exclude-functions:
      - "(*hash/maphash.Hash).Write"
      - "(*hash/maphash.Hash).WriteByte"
      - "(*hash/maphash.Hash).WriteString"
  gocritic:
    # Which checks should be enabled; can't be combined with 'disabled-checks'.
    # See https://go-critic.github.io/overview#checks-overview.
    # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint run`.
    # By default, list of stable checks is used.
    enabled-checks:
      # diagnostic
      - argOrder
      - badCall
      - badCond
      - badLock
      - badRegexp
      - badSorting
      - builtinShadowDecl
      - caseOrder
      - codegenComment
      - commentedOutCode
      - deferInLoop
      - dupArg
      - deprecatedComment
      - dupBranchBody
      - dupCase
      - dupSubExpr
      - dynamicFmtString
      - emptyDecl
      - evalOrder
      - exitAfterDefer
      - externalErrorReassign
      - filepathJoin
      - flagName
      - mapKey
      - nilValReturn
      - offBy1
      - regexpPattern
      - sloppyTestFuncName
      - sloppyReassign
      - sloppyTypeAssert
      - sortSlice
      - sprintfQuotedString
      - sqlQuery
      - syncMapLoadAndDelete
      - truncateCmp
      - uncheckedInlineErr
      - unnecessaryDefer
      - weakCond
      # performance
      - appendCombine
      - equalFold
      - indexAlloc
      - hugeParam
      - preferDecodeRune
      - preferFprint
      - preferStringWriter
      - preferWriteByte
      - rangeExprCopy
      - rangeValCopy
      - sliceClear
      - stringXbytes

    # Settings passed to gocritic.
    # The settings key is the name of a supported gocritic checker.
    # The list of supported checkers can be find in https://go-critic.github.io/overview.
    settings:
      hugeParam:
        # Size in bytes that makes the warning trigger.
        # Default: 80
        sizeThreshold: 512
      rangeValCopy:
        # Size in bytes that makes the warning trigger.
        # Default: 128
        sizeThreshold: 512

  gosec:
    # To select a subset of rules to run.
    # Available rules: https://github.com/securego/gosec#available-rules
    # Default: [] - means include all rules
    includes:
      - G101
      - G102
      - G103
      - G106
      - G107
      - G108
      - G109
      - G110
      - G111
      - G112
      - G114
      - G201
      - G202
      - G203
      - G301
      - G302
      - G303
      - G305
      - G306
      - G401
      - G403
      - G404
      - G501
      - G502
      - G503
      - G505
      - G601
      # G104, G105, G113, G204, G304, G307, G402, G504 were not enabled intentionally
    # To specify the configuration of rules.
    config:
      # Maximum allowed permissions mode for os.OpenFile and os.Chmod
      # Default: "0600"
      G302: "0640"
      # Maximum allowed permissions mode for os.WriteFile and ioutil.WriteFile
      # Default: "0600"
      G306: "0640"
  govet:
    settings:
      ## Check the logging function like it would be a printf
      printf:
        funcs:
          - (github.com/influxdata/telegraf.Logger).Debugf
          - (github.com/influxdata/telegraf.Logger).Infof
          - (github.com/influxdata/telegraf.Logger).Warnf
          - (github.com/influxdata/telegraf.Logger).Errorf
          - (github.com/influxdata/telegraf.Logger).Debug
          - (github.com/influxdata/telegraf.Logger).Info
          - (github.com/influxdata/telegraf.Logger).Warn
          - (github.com/influxdata/telegraf.Logger).Error
  lll:
    # Max line length, lines longer will be reported.
    # '\t' is counted as 1 character by default, and can be changed with the tab-width option.
    # Default: 120.
    line-length: 160
    # Tab width in spaces.
    # Default: 1
    tab-width: 4
  nolintlint:
    # Enable to require an explanation of nonzero length after each nolint directive.
    # Default: false
    require-explanation: true
    # Enable to require nolint directives to mention the specific linter being suppressed.
    # Default: false
    require-specific: true
  prealloc:
    # Report pre-allocation suggestions only on simple loops that have no returns/breaks/continues/gotos in them.
    # Default: true
    simple: false
  revive:
    rules:
      - name: argument-limit
        arguments: [ 6 ]
      - name: atomic
      - name: bare-return
      - name: blank-imports
      - name: bool-literal-in-expr
      - name: call-to-gc
      - name: confusing-naming
      - name: confusing-results
      - name: constant-logical-expr
      - name: context-as-argument
      - name: context-keys-type
      - name: deep-exit
      - name: defer
      - name: dot-imports
      - name: duplicated-imports
      - name: early-return
      - name: empty-block
      - name: empty-lines
      - name: error-naming
      - name: error-return
      - name: error-strings
      - name: errorf
      - name: function-result-limit
        arguments: [ 3 ]
      - name: identical-branches
      - name: if-return
      - name: import-shadowing
      - name: increment-decrement
      - name: indent-error-flow
      - name: modifies-parameter
      - name: modifies-value-receiver
      - name: package-comments
      - name: range
      - name: range-val-address
      - name: range-val-in-closure
      - name: receiver-naming
      - name: redefines-builtin-id
      - name: string-of-int
      - name: struct-tag
      - name: superfluous-else
      - name: time-naming
      - name: unconditional-recursion
      - name: unexported-naming
      - name: unnecessary-stmt
      - name: unreachable-code
      - name: unused-parameter
      - name: var-declaration
      - name: var-naming
      - name: waitgroup-by-value
  nakedret:
    # make an issue if func has more lines of code than this setting and it has naked returns; default is 30
    max-func-lines: 1
  tenv:
    # The option `all` will run against whole test files (`_test.go`) regardless of method/function signatures.
    # Otherwise, only methods that take `*testing.T`, `*testing.B`, and `testing.TB` as arguments are checked.
    # Default: false
    all: true
  testifylint:
    # Enable specific checkers.
    # https://github.com/Antonboom/testifylint#checkers
    # Default: ["bool-compare", "compares", "empty", "error-is-as", "error-nil", "expected-actual", "float-compare", "len", "require-error", "suite-dont-use-pkg", "suite-extra-assert-call"]
    enable:
      - bool-compare
      - compares
      - empty
      - error-is-as
      - error-nil
      - expected-actual
      - len
      - require-error
      - suite-dont-use-pkg
      - suite-extra-assert-call
      - suite-thelper

run:
  # timeout for analysis, e.g. 30s, 5m, default is 1m
  timeout: 10m

  # which dirs to skip: issues from them won't be reported;
  # can use regexp here: generated.*, regexp is applied on full path;
  # default value is empty list, but default dirs are skipped independently
  # from this option's value (see skip-dirs-use-default).
  # "/" will be replaced by current OS file path separator to properly work
  # on Windows.
  skip-dirs:
    - assets
    - docs
    - etc

  # which files to skip: they will be analyzed, but issues from them
  # won't be reported. Default value is empty list, but there is
  # no need to include all autogenerated files, we confidently recognize
  # autogenerated files. If it's not please let us know.
  # "/" will be replaced by current OS file path separator to properly work
  # on Windows.
  skip-files:
    - plugins/parsers/influx/machine.go*

issues:
  # Maximum issues count per one linter. Set to 0 to disable. Default is 50.
  max-issues-per-linter: 0

  # Maximum count of issues with the same text. Set to 0 to disable. Default is 3.
  max-same-issues: 0

  # List of regexps of issue texts to exclude.
  #
  # But independently of this option we use default exclude patterns,
  # it can be disabled by `exclude-use-default: false`.
  # To list all excluded by default patterns execute `golangci-lint run --help`
  #
  # Default: https://golangci-lint.run/usage/false-positives/#default-exclusions
  exclude:
    # revive:var-naming
    - don't use an underscore in package name
    # EXC0001 errcheck: Almost all programs ignore errors on these functions and in most cases it's ok
    - Error return value of .((os\.)?std(out|err)\..*|.*Close.*|.*Flush|.*Disconnect|.*Clear|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked
    # EXC0013 revive: Annoying issue about not having a comment. The rare codebase has such comments
    - package comment should be of the form "(.+)...
    # EXC0015 revive: Annoying issue about not having a comment. The rare codebase has such comments
    - should have a package comment

  # Excluding configuration per-path, per-linter, per-text and per-source
  exclude-rules:
    - path: plugins/parsers/influx
      linters:
        - govet

    - path: cmd/telegraf/(main|printer|cmd_plugins).go
      text: "Error return value of `outputBuffer.Write` is not checked" #errcheck

    - path: _test\.go
      text: "Potential hardcoded credentials" #gosec:G101

    - path: _test\.go
      text: "Use of weak random number generator" #gosec:G404

  # Independently of option `exclude` we use default exclude patterns,
  # it can be disabled by this option.
  # To list all excluded by default patterns execute `golangci-lint run --help`.
  # Default: true.
  exclude-use-default: false

# output configuration options
output:
  # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions
  #
  # Multiple can be specified by separating them by comma, output can be provided
  # for each of them by separating format name and path by colon symbol.
  # Output path can be either `stdout`, `stderr` or path to the file to write to.
  # Example: "checkstyle:report.json,colored-line-number"
  #
  # Default: colored-line-number
  format: tab
  # Make issues output unique by line.
  # Default: true
  uniq-by-line: false
  # Sort results by: filepath, line and column.
  sort-results: true
