run:
  # timeout for analysis
  deadline: 10m

  # Skip autogenerated files for mobile and gRPC as well as copied code for
  # internal use.
  skip-files:
    - "mobile\\/.*generated\\.go"
    - "\\.pb\\.go$"
    - "\\.pb\\.gw\\.go$"
    - "internal\\/musig2v040"

  skip-dirs:
    - channeldb/migration_01_to_11
    - channeldb/migration/lnwire21

  build-tags:
    - autopilotrpc
    - chainrpc
    - dev
    - invoicesrpc
    - neutrinorpc
    - peersrpc
    - signrpc
    - walletrpc
    - watchtowerrpc
    - kvdb_etcd
    - kvdb_postgres
    - kvdb_sqlite
    - integration

linters-settings:
  errorlint:
    # Check for incorrect fmt.Errorf error wrapping.
    errorf: true

  govet:
    # Don't report about shadowed variables
    check-shadowing: false

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

  tagliatelle:
    case:
      rules:
        json: snake

  whitespace:
    multi-func: true
    multi-if: true

  gosec:
    excludes:
      - G402 # Look for bad TLS connection settings.
      - G306 # Poor file permissions used when writing to a new file.

  staticcheck:
    go: "1.21"
    checks: ["-SA1019"]

  lll:
    # Max line length, lines longer will be reported.
    line-length: 80
    # Tab width in spaces.
    tab-width: 8

  funlen:
    # Checks the number of lines in a function.
    # If lower than 0, disable the check.
    lines: 200
    # Checks the number of statements in a function.
    statements: 80

  dupl:
    # Tokens count to trigger issue.
    threshold: 200

  nestif:
    # Minimal complexity of if statements to report.
    min-complexity: 10

  nlreturn:
    # Size of the block (including return statement that is still "OK")
    # so no return split required.
    block-size: 3

  gomnd:
    # List of numbers to exclude from analysis.
    # The numbers should be written as string.
    # Values always ignored: "1", "1.0", "0" and "0.0"
    # Default: []
    ignored-numbers:
      - '0666'
      - '0755'

    # List of function patterns to exclude from analysis.
    # Values always ignored: `time.Date`
    # Default: []
    ignored-functions:
      - 'math.*'
      - 'strconv.ParseInt'
      - 'errors.Wrap'
  
  gomoddirectives:
    replace-allow-list:
      # See go.mod for the explanation why these are needed.
      - github.com/ulikunitz/xz
      - github.com/gogo/protobuf
      - google.golang.org/protobuf


linters:
  enable-all: true
  disable:
    # Global variables are used in many places throughout the code base.
    - gochecknoglobals

    # We want to allow short variable names.
    - varnamelen

    # We want to allow TODOs.
    - godox

    # Instances of table driven tests that don't pre-allocate shouldn't trigger
    # the linter.
    - prealloc

    # Init functions are used by loggers throughout the codebase.
    - gochecknoinits

    # Deprecated linters. See https://golangci-lint.run/usage/linters/.
    - interfacer
    - golint
    - maligned
    - scopelint
    - exhaustivestruct
    - bodyclose
    - contextcheck
    - nilerr
    - noctx
    - rowserrcheck
    - sqlclosecheck
    - structcheck
    - tparallel
    - unparam
    - wastedassign
    - ifshort
    - varcheck
    - deadcode
    - nosnakecase


    # Disable gofumpt as it has weird behavior regarding formatting multiple
    # lines for a function which is in conflict with our contribution
    # guidelines. See https://github.com/mvdan/gofumpt/issues/235.
    - gofumpt

    # Disable whitespace linter as it has conflict rules against our
    # contribution guidelines. See https://github.com/bombsimon/wsl/issues/109.
    #
    # TODO(yy): bring it back when the above issue is fixed.
    - wsl

    # Allow using default empty values.
    - exhaustruct

    # Allow exiting case select faster by putting everything in default.
    - exhaustive

    # Allow tests to be put in the same package.
    - testpackage

    # Don't run the cognitive related linters.
    - gocognit
    - gocyclo
    - maintidx
    - cyclop

    # Allow customized interfaces to be returned from functions.
    - ireturn

    # Disable too many blank identifiers check. We won't be able to run this
    # unless a large refactor has been applied to old code.
    - dogsled

    # We don't wrap errors.
    - wrapcheck

    # Allow dynamic errors.
    - goerr113

    # We use ErrXXX instead.
    - errname

    # Disable nil check to allow returning multiple nil values.
    - nilnil
    
    # We often split tests into separate test functions. If we are forced to
    # call t.Helper() within those functions, we lose the information where
    # exactly a test failed in the generated failure stack trace.
    - thelper
    
    # The linter is too aggressive and doesn't add much value since reviewers
    # will also catch magic numbers that make sense to extract.
    - gomnd

      # Some of the tests cannot be parallelized. On the other hand, we don't
      # gain much performance with this check so we disable it for now until
      # unit tests become our CI bottleneck.
    - paralleltest

issues:
  # Only show newly introduced problems.
  new-from-rev: 8c66353e4c02329abdacb5a8df29998035ec2e24

  exclude-rules:
    # Exclude gosec from running for tests so that tests with weak randomness
    # (math/rand) will pass the linter.
    - path: _test\.go
      linters:
        - gosec
        - funlen
        - revive
        # Allow duplications in tests so it's easier to follow a single unit
        # test.
        - dupl

    - path: mock*
      linters:
        - revive
        # forcetypeassert is skipped for the mock because the test would fail
        # if the returned value doesn't match the type, so there's no need to
        # check the convert.
        - forcetypeassert

    - path: test*
      linters:
        - gosec
        - funlen

    # Allow duplicated code and fmt.Printf() in DB migrations.
    - path: channeldb/migration*
      linters:
        - dupl
        - forbidigo
        - godot

    # Allow duplicated code and fmt.Printf() in DB migration tests.
    - path: channeldb/migtest
      linters:
        - dupl
        - forbidigo
        - godot

    # Allow fmt.Printf() in lncli.
    - path: cmd/lncli/*
      linters:
        - forbidigo

    # Allow fmt.Printf() in config parsing.
    - path: config\.go
      linters:
        - forbidigo
    - path: lnd\.go
      linters:
        - forbidigo

    - path: lnmock/*
      linters:
        # forcetypeassert is skipped for the mock because the test would fail
        # if the returned value doesn't match the type, so there's no need to
        # check the convert.
        - forcetypeassert

    - path: mock*
      linters:
        # forcetypeassert is skipped for the mock because the test would fail
        # if the returned value doesn't match the type, so there's no need to
        # check the convert.
        - forcetypeassert