run:
  go: "1.21"
  skip-dirs:
    - build
    - configs
    - deployments
    - docs
    - scripts
    - internal/core
    - cmake_build
    - mmap
    - data
    - ci
  skip-files:
    - partial_search_test.go
  build-tags:
    - dynamic
    - test

linters:
  disable-all: true
  enable:
    - gosimple
    - govet
    - ineffassign
    - staticcheck
    - decorder
    - depguard
    - gofmt
    - goimports
    - gosec
    - revive
    - unconvert
    - misspell
    - typecheck
    - durationcheck
    - forbidigo
    - gci
    - whitespace
    - gofumpt
    - gocritic

linters-settings:
  gci:
    sections:
      - standard
      - default
      - prefix(github.com/milvus-io)
    custom-order: true
  gofumpt:
    lang-version: "1.18"
    module-path: github.com/milvus-io
  goimports:
    local-prefixes: github.com/milvus-io
  revive:
    rules:
      - name: unused-parameter
        disabled: true
      - name: var-naming
        severity: warning
        disabled: false
        arguments:
          - ["ID"] # Allow list
      - name: context-as-argument
        severity: warning
        disabled: false
        arguments:
          - allowTypesBefore: "*testing.T"
      - name: datarace
        severity: warning
        disabled: false
      - name: duplicated-imports
        severity: warning
        disabled: false
      - name: waitgroup-by-value
        severity: warning
        disabled: false
      - name: indent-error-flow
        severity: warning
        disabled: false
        arguments:
          - "preserveScope"
      - name: range-val-in-closure
        severity: warning
        disabled: false
      - name: range-val-address
        severity: warning
        disabled: false
      - name: string-of-int
        severity: warning
        disabled: false
  misspell:
    locale: US
  gocritic:
    enabled-checks:
      - ruleguard
    settings:
      ruleguard:
        failOnError: true
        rules: "rules.go"
  depguard:
    rules:
      main:
        deny:
          - pkg: "errors"
            desc: not allowed, use github.com/cockroachdb/errors
          - pkg: "github.com/pkg/errors"
            desc: not allowed, use github.com/cockroachdb/errors
          - pkg: "github.com/pingcap/errors"
            desc: not allowed, use github.com/cockroachdb/errors
          - pkg: "golang.org/x/xerrors"
            desc: not allowed, use github.com/cockroachdb/errors
          - pkg: "github.com/go-errors/errors"
            desc: not allowed, use github.com/cockroachdb/errors
          - pkg: "io/ioutil"
            desc: ioutil is deprecated after 1.16, 1.17, use os and io package instead
          - pkg: "github.com/tikv/client-go/rawkv"
            desc: not allowed, use github.com/tikv/client-go/v2/txnkv
          - pkg: "github.com/tikv/client-go/v2/rawkv"
            desc: not allowed, use github.com/tikv/client-go/v2/txnkv
          - pkg: "github.com/gogo/protobuf"
            desc: "not allowed, gogo protobuf is deprecated"
          - pkg: "github.com/golang/protobuf/proto"
            desc: "not allowed, protobuf v1 is deprecated, use google.golang.org/protobuf/proto instead"
  forbidigo:
    forbid:
      - '^time\.Tick$'
      - 'return merr\.Err[a-zA-Z]+'
      - 'merr\.Wrap\w+\(\)\.Error\(\)'
      - '\.(ErrorCode|Reason) = '
      - 'Reason:\s+\w+\.Error\(\)'
      - 'errors.New\((.+)\.GetReason\(\)\)'
      - 'commonpb\.Status\{[\s\n]*ErrorCode:[\s\n]*.+[\s\S\n]*?\}'
      - 'os\.Open\(.+\)'
      - 'os\.ReadFile\(.+\)'
      - 'os\.WriteFile\(.+\)'
      - "runtime.NumCPU"
      - "runtime.GOMAXPROCS(0)"
      #- 'fmt\.Print.*' WIP

issues:
  exclude-use-default: false
  exclude-rules:
    - path: .+_test\.go
      linters:
        - forbidigo
  exclude:
    - should have a package comment
    - should have comment
    - should be of the form
    - should not use dot imports
    - which can be annoying to use
    # Binds to all network interfaces
    - G102
    # Use of unsafe calls should be audited
    - G103
    # Errors unhandled
    - G104
    # file/folder Permission
    - G301
    - G302
    # Potential file inclusion via variable
    - G304
    # Deferring unsafe method like *os.File Close
    - G307
    # TLS MinVersion too low
    - G402
    # Use of weak random number generator math/rand
    - G404
    # Unused parameters
    - SA1019
    # defer return errors
    - SA5001

  # 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

service:
  # use the fixed version to not introduce new linters unexpectedly
  golangci-lint-version: 1.55.2
