run:
  timeout: 10m

linters-settings:
  errcheck:
    # report about not checking of errors in type assetions: `a := b.(MyStruct)`;
    # default is false: such cases aren't reported by default.
    check-type-assertions: false

    # report about assignment of errors to blank identifier: `num, _ := strconv.Atoi(numStr)`;
    # default is false: such cases aren't reported by default.
    check-blank: false

  exhaustive:
    # indicates that switch statements are to be considered exhaustive if a
    # 'default' case is present, even if all enum members aren't listed in the
    # switch
    default-signifies-exhaustive: true


  gofmt:
    # simplify code: gofmt with `-s` option, true by default
    simplify: true

  goimports:
    # put imports beginning with prefix after 3rd-party packages;
    # it's a comma-separated list of prefixes
    local-prefixes: github.com/oam-dev/kubevela

  gocyclo:
    # minimal code complexity to report, 30 by default (but we recommend 10-20)
    min-complexity: 30


  dupl:
    # tokens count to trigger issue, 150 by default
    threshold: 100

  goconst:
    # minimal length of string constant, 3 by default
    min-len: 3
    # minimal occurrences count to trigger, 3 by default
    min-occurrences: 5

  lll:
    # tab width in spaces. Default to 1.
    tab-width: 1

  unparam:
    # Inspect exported functions, default is false. Set to true if no external program/library imports your code.
    # XXX: if you enable this setting, unparam will report a lot of false-positives in text editors:
    # if it's called for subdir of a project it can't find external interfaces. All text editor integrations
    # with golangci-lint call it on a directory with the changed file.
    check-exported: false

  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: 30

  gocritic:
    # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint` run to see all tags and checks.
    # Empty list by default. See https://github.com/go-critic/go-critic#usage -> section "Tags".
    enabled-tags:
      - performance

    settings: # settings passed to gocritic
      captLocal: # must be valid enabled check name
        paramsOnly: true
      rangeValCopy:
        sizeThreshold: 32

  makezero:
    # Allow only slices initialized with a length of zero. Default is false.
    always: false

  revive:
    rules:
      - name: unused-parameter
        disabled: true

linters:
  enable:
    - govet
    - gocyclo
    - gocritic
    - goconst
    - goimports
    - gofmt  # We enable this as well as goimports for its simplify mode.
    - revive
    - unconvert
    - misspell
    - nakedret
    - exportloopref
    - unused
    - gosimple
    - staticcheck
  disable:
    - rowserrcheck
    - sqlclosecheck
    - errchkjson
    - contextcheck
  presets:
    - bugs
    - unused
  fast: false


issues:

  exclude-files:
    - "zz_generated\\..+\\.go$"
    - ".*_test.go$"

  exclude-dirs:
    - "hack"
    - "e2e"

  # Excluding configuration per-path and per-linter
  exclude-rules:
    - path: .*\.go
      linters:
        - errcheck
      text: "fmt\\."

    # Ignore unchecked errors from io/ioutil functions starting with Read
    - path: .*\.go
      linters:
        - errcheck
      text: "io/ioutil.*Read"
      
    # Exclude some linters from running on tests files.
    - path: _test(ing)?\.go
      linters:
        - gocyclo
        - errcheck
        - dupl
        - gosec
        - exportloopref
        - unparam

    # Ease some gocritic warnings on test files.
    - path: _test\.go
      text: "(unnamedResult|exitAfterDefer)"
      linters:
        - gocritic

    # Gosmopolitan complains of internationalization issues on the file that actually defines
    # the translation.
    - path: i18n\.go
      text: "Han"
      linters:
        - gosmopolitan

    # These are performance optimisations rather than style issues per se.
    # They warn when function arguments or range values copy a lot of memory
    # rather than using a pointer.
    - text: "(hugeParam|rangeValCopy):"
      linters:
        - gocritic

    # This "TestMain should call os.Exit to set exit code" warning is not clever
    # enough to notice that we call a helper method that calls os.Exit.
    - text: "SA3000:"
      linters:
        - staticcheck

    - text: "k8s.io/api/core/v1"
      linters:
        - goimports

    # This is a "potential hardcoded credentials" warning. It's triggered by
    # any variable with 'secret' in the same, and thus hits a lot of false
    # positives in Kubernetes land where a Secret is an object type.
    - text: "G101:"
      linters:
        - gosec
        - gas

    # This is an 'errors unhandled' warning that duplicates errcheck.
    - text: "G104:"
      linters:
        - gosec
        - gas

    # The Azure AddToUserAgent method appends to the existing user agent string.
    # It returns an error if you pass it an empty string lettinga you know the
    # user agent did not change, making it more of a warning.
    - text: \.AddToUserAgent
      linters:
        - errcheck

    - text: "don't use an underscore"
      linters:
        - revive

    - text: "package-comments: should have a package comment"
      linters:
        - revive

    - text: "error-strings: error strings should not be capitalized or end with punctuation or a newline"
      linters:
        - revive

  # Independently from 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 value for this option is true.
  exclude-use-default: false

  # Show only new issues: if there are unstaged changes or untracked files,
  # only those changes are analyzed, else only changes in HEAD~ are analyzed.
  # It's a super-useful option for integration of golangci-lint into existing
  # large codebase. It's not practical to fix all existing issues at the moment
  # of integration: much better don't allow issues in new code.
  # Default is false.
  new: false

  # 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