on: [push, pull_request]

jobs:
  check:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: "1.24.x"
      - name: Check for //go:build ignore in .go files
        run: |
          IGNORED_FILES=$(grep -rl '//go:build ignore' . --include='*.go') || true
          if [ -n "$IGNORED_FILES" ]; then
            echo "::error::Found ignored Go files: $IGNORED_FILES"
            exit 1
          fi
      - name: Check that go.mod is tidied
        if: success() || failure() # run this step even if the previous one failed
        run: |
          cp go.mod go.mod.orig
          cp go.sum go.sum.orig
          go mod tidy
          diff go.mod go.mod.orig
          diff go.sum go.sum.orig
      - name: Run code generators
        if: success() || failure() # run this step even if the previous one failed
        run: .github/workflows/go-generate.sh
      - name: Check that go mod vendor works
        if: success() || failure() # run this step even if the previous one failed
        run: |
          cd integrationtests/gomodvendor
          go mod vendor
  golangci-lint:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        go: [  "1.23.x", "1.24.x", "1.25.0-rc.1" ]
    env:
      GOLANGCI_LINT_VERSION: v2.1.6
    name: golangci-lint (Go ${{ matrix.go }})
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: ${{ matrix.go }}
      - name: golangci-lint (Linux)
        uses: golangci/golangci-lint-action@v8
        with:
          args: --timeout=3m
          version: ${{ env.GOLANGCI_LINT_VERSION }}
      - name: golangci-lint (Windows)
        if: success() || failure() # run this step even if the previous one failed
        uses: golangci/golangci-lint-action@v8
        env:
          GOOS: "windows"
        with:
          args: --timeout=3m
          version: ${{ env.GOLANGCI_LINT_VERSION }}
      - name: golangci-lint (OSX)
        if: success() || failure() # run this step even if the previous one failed
        uses: golangci/golangci-lint-action@v8
        env:
          GOOS: "darwin"
        with:
          args: --timeout=3m
          version: ${{ env.GOLANGCI_LINT_VERSION }}
      - name: golangci-lint (FreeBSD)
        if: success() || failure() # run this step even if the previous one failed
        uses: golangci/golangci-lint-action@v8
        env:
          GOOS: "freebsd"
        with:
          args: --timeout=3m
          version: ${{ env.GOLANGCI_LINT_VERSION }}
      - name: golangci-lint (others)
        if: success() || failure() # run this step even if the previous one failed
        uses: golangci/golangci-lint-action@v8
        env:
          GOOS: "solaris" # some OS that we don't have any build tags for
        with:
          args: --timeout=3m
          version: ${{ env.GOLANGCI_LINT_VERSION }}
