# https://golangci-lint.run/usage/configuration/
run:
  timeout: 1m

linters:
  disable-all: true
  enable:
    # default linters
    - errcheck
    - gosimple
    - govet
    - ineffassign
    - staticcheck
    - typecheck
    - unused

    # additional linters for this project (we should disable these if they get annoying).
    - asciicheck
    - bodyclose
    # - depguard
    - dogsled
    - exhaustive
    - exportloopref
    - funlen
    - gochecknoglobals
    - gochecknoinits
    - gocritic
    - gocyclo
    - godot
    - goheader
    - goimports
    - revive
    - goprintffuncname
    - gosec
    - misspell
    - nakedret
    - nestif
    - noctx
    - nolintlint
    - prealloc
    - rowserrcheck
    - exportloopref
    - sqlclosecheck
    - unconvert
    - whitespace
    - copyloopvar
    - intrange
    - fatcontext
    # - canonicalheader Can't do this one since it alerts on valid headers such as X-XSS-Protection
    - spancheck
    - importas
    - makezero
    - prealloc
    - gofmt

issues:
  exclude-dirs:
    - generated
  exclude-rules:
    # exclude tests from some rules for things that are useful in a testing context.
    - path: _test\.go
      linters:
        - funlen
        - gochecknoglobals
        - revive
    - path: internal/testutil/
      linters:
      - revive

linters-settings:
  funlen:
    lines: 150
    statements: 50
  goheader:
    values:
      regexp:
        # YYYY or YYYY-YYYY
        YEARS: \d\d\d\d(-\d\d\d\d)?
    template: |-
      Copyright {{YEARS}} the Pinniped contributors. All Rights Reserved.
      SPDX-License-Identifier: Apache-2.0
  goimports:
    local-prefixes: go.pinniped.dev
  revive:
    max-open-files: 2048
    rules:
      - name: unused-parameter
        arguments:
          # Allow unused params that start with underscore. It can be nice to keep unused param names when implementing
          # an interface sometimes, to help readers understand why it is unused in that particular implementation.
          - allowRegex: "^_"
  spancheck:
    # https://golangci-lint.run/usage/linters/#spancheck
    checks:
    - end
    - record-error
    - set-status
  importas:
    no-unaliased: true # All packages explicitly listed below must be aliased
    no-extra-aliases: false # Allow other aliases than the ones explicitly listed below
    alias:
    # k8s.io/apimachinery
    - pkg: k8s.io/apimachinery/pkg/util/errors
      alias: utilerrors
    - pkg: k8s.io/apimachinery/pkg/api/errors
      alias: apierrors
    - pkg: k8s.io/apimachinery/pkg/apis/meta/v1
      alias: metav1
    # k8s.io
    - pkg: k8s.io/api/core/v1
      alias: corev1
    # OAuth2/OIDC/Fosite/JOSE
    - pkg: github.com/coreos/go-oidc/v3/oidc
      alias: coreosoidc
    - pkg: github.com/ory/fosite/handler/oauth2
      alias: fositeoauth2
    - pkg: github.com/ory/fosite/token/jwt
      alias: fositejwt
    - pkg: github.com/go-jose/go-jose/v4/jwt
      alias: josejwt
    - pkg: github.com/go-jose/go-jose/v3
      alias: oldjosev3
    # Generated Pinniped
    - pkg: go.pinniped.dev/generated/latest/apis/concierge/authentication/v1alpha1
      alias: authenticationv1alpha1
    - pkg: go.pinniped.dev/generated/latest/apis/supervisor/clientsecret/v1alpha1
      alias: clientsecretv1alpha1
    - pkg: go.pinniped.dev/generated/latest/apis/supervisor/config/v1alpha1
      alias: supervisorconfigv1alpha1
    - pkg: go.pinniped.dev/generated/latest/apis/concierge/config/v1alpha1
      alias: conciergeconfigv1alpha1
    - pkg: go.pinniped.dev/generated/latest/client/concierge/clientset/versioned
      alias: conciergeclientset
    - pkg: go.pinniped.dev/generated/latest/client/concierge/clientset/versioned/scheme
      alias: conciergeclientsetscheme
    - pkg: go.pinniped.dev/generated/latest/client/concierge/clientset/versioned/fake
      alias: conciergefake
    - pkg: go.pinniped.dev/generated/latest/client/supervisor/clientset/versioned
      alias: supervisorclientset
    - pkg: go.pinniped.dev/generated/latest/client/supervisor/clientset/versioned/scheme
      alias: supervisorclientsetscheme
    - pkg: go.pinniped.dev/generated/latest/client/supervisor/clientset/versioned/fake
      alias: supervisorfake
    - pkg: go.pinniped.dev/generated/latest/apis/supervisor/idp/v1alpha1
      alias: idpv1alpha1
    - pkg: go.pinniped.dev/generated/latest/client/concierge/informers/externalversions
      alias: conciergeinformers
    - pkg: go.pinniped.dev/generated/latest/client/supervisor/informers/externalversions
      alias: supervisorinformers
    # Pinniped internal
    - pkg: go.pinniped.dev/internal/concierge/scheme
      alias: conciergescheme
  gofmt:
    # Simplify code: gofmt with `-s` option.
    # Default: true
    simplify: false
    # Apply the rewrite rules to the source before reformatting.
    # https://pkg.go.dev/cmd/gofmt
    # Default: []
    rewrite-rules:
    - pattern: 'interface{}'
      replacement: 'any'
    - pattern: 'a[b:len(a)]'
      replacement: 'a[b:]'
