run:
  timeout: 5m

linters:
  enable-all: true

  disable:
    # Messages like "struct of size 104 bytes could be of size 96 bytes" from a package
    # that was last updated 2 years ago[1] are barely helpful.
    #
    # After all, we're writing the code for other people, so let's trust the compiler here (that's
    # constantly evolving compared to this linter) and revisit this if memory usage becomes a problem.
    #
    # [1]: https://github.com/mdempsky/maligned/commit/6e39bd26a8c8b58c5a22129593044655a9e25959
    - maligned

    # We don't have high-performance requirements at this moment, so sacrificing
    # the code readability for marginal performance gains is not worth it.
    - prealloc

    # New linters that require a lot of codebase churn and noise, but perhaps we can enable them in the future.
    - nlreturn
    - wrapcheck
    - errorlint

    # Unfortunately, we use globals due to how spf13/cobra works.
    - gochecknoglobals

    # That's fine that some Proto objects don't have all fields initialized
    - exhaustivestruct

    # Style linters that are total nuts.
    - wsl
    - gofumpt
    - goimports
    - funlen

    # This conflicts with the Protocol Buffers Version 3 design,
    # which is largely based on default values for struct fields.
    - exhaustivestruct

    # Enough parallelism for now.
    - paralleltest

    # Ill-based assumptions about identifiers like fmt.Println without taking context into account.
    - forbidigo

    # Advantages of using t.Helper() are too small to waste developer's cognitive stamina on it.
    - thelper

    # Too restrictive defaults, plus there's already a gocyclo linter in place.
    - cyclop

    # Gives false positives for textbook examples[1][2]
    # [1]: https://github.com/charithe/durationcheck/issues/7
    # [2]: https://golang.org/pkg/time/ (see "To convert an integer number of units to a Duration, multiply:")
    - durationcheck

    # No way to disable the "exported" check for the whole project[1]
    # [1]: https://github.com/mgechev/revive/issues/244#issuecomment-560512162
    - revive

    # Unfortunately too much false-positives, e.g. for a 0700 umask or number 10 when using strconv.FormatInt()
    - gomnd

    # Needs package whitelists
    - depguard

    # Generates absolutely useless errors, e.g.
    # "string `.yml` has 3 occurrences, make it a constant"
    - goconst

    # It's OK to not sort imports
    - gci

    # It's OK to not initialize some struct fields
    - exhaustruct

    # This is not a library, so it's OK to use dynamic errors
    - goerr113

    # fmt.Sprintf() looks a bit nicer than string addition
    - perfsprint

    # We can control this ourselves
    - varnamelen
    - contextcheck

issues:
  # Don't hide multiple issues that belong to one class since GitHub annotations can handle them all nicely.
  max-issues-per-linter: 0
  max-same-issues: 0
