version: "2"

run:
  build-tags:
    - admin
    - functional
    - integration
  tests: true

linters:
  enable:
    - errorlint # error wrapping (eg, not using `errors.Is`, using `%s` instead of `%w` in `fmt.Errorf`)
    - nolintlint # ill-formed or insufficient nolint directives
    - thelper #  test helpers without t.Helper()

  settings:
    govet:
      disable:
        # struct order is often for Win32 compat
        # also, ignore pointer bytes/GC issues for now until performance becomes an issue
        - fieldalignment
      enable-all: true

    staticcheck:
      # https://staticcheck.io/docs/checks
      checks:
        - all

  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    rules:
      # err is very often shadowed in nested scopes
      - linters:
          - govet
        text: '^shadow: declaration of "err" shadows declaration'

      # path is relative to module root, which is ./test/
      - linters:
          - staticcheck
        path: cri-containerd
        text: "^ST1003: should not use underscores in package names$"
        source: ^package cri_containerd$

      # don't bother with propper error wrapping in test code
      - linters:
          - errorlint
        path: cri-containerd
        text: non-wrapping format verb for fmt.Errorf

      # static check doesn't recognize `t.Fatal[f]?` when checking for potential `nil` pointer dereference
      - linters:
          - staticcheck
        path: ".*_test.go$"
        text: "^SA5011"

      # This repo has a LOT of generated schema files, operating system bindings, and other
      # things that ST1003 from stylecheck won't like (screaming case Windows api constants for example).
      # There's also some structs that we *could* change the initialisms to be Go friendly
      # (Id -> ID) but they're exported and it would be a breaking change.
      # This makes it so that most new code, code that isn't supposed to be a pretty faithful
      # mapping to an OS call/constants, or non-generated code still checks if we're following idioms,
      # while ignoring the things that are just noise or would be more of a hassle than it'd be worth to change.
      - linters:
          - staticcheck
        path: layer.go
        text: "ST1003:"
      - linters:
          - staticcheck
        path: hcsshim.go
        text: "ST1003:"
      - linters:
          - staticcheck
        path: cmd/ncproxy/nodenetsvc/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: cmd/ncproxy_mock/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/hcs/schema2/
      - linters:
          - staticcheck
        path: internal/wclayer/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: hcn/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/hcs/schema1/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/hns/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: ext4/internal/compactext4/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: ext4/internal/format/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/guestrequest/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/guest/prot/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/windevice/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/winapi/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/vmcompute/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/regstate/
        text: "ST1003:"
      - linters:
          - staticcheck
        path: internal/hcserror/
        text: "ST1003:"

      # v0 APIs are deprecated, but still retained for backwards compatability
      - linters:
          - staticcheck
        path: cmd/ncproxy/
        text: "^SA1019: .*(ncproxygrpc|nodenetsvc)[/]?v0"
      - linters:
          - staticcheck
        path: internal/tools/networkagent
        text: "^SA1019: .*nodenetsvc[/]?v0"
      - linters:
          - staticcheck
        path: internal/vhdx/info
        text: "ST1003:"

    paths:
      # paths are relative to module root
      - cri-containerd/test-images

formatters:
  enable:
    - gofmt
  exclusions:
    generated: lax
    paths:
      - cri-containerd/test-images
      - internal/hcs/schema2/
