name: Run mypy_primer

on:
  # Only run on PR, since we diff against main
  pull_request:
    paths:
      - "**/*.pyi"
      - ".github/workflows/mypy_primer.yml"
      - ".github/workflows/mypy_primer_comment.yml"

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  mypy_primer:
    name: Run
    runs-on: ubuntu-latest
    strategy:
      matrix:
        shard-index: [0]  # e.g. change this to [0, 1, 2] and --num-shards below to 3
      fail-fast: false
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          path: numpy_to_test
          fetch-depth: 0
      - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
        with:
          python-version: "3.12"
      - name: Install dependencies
        run: pip install git+https://github.com/hauntsaninja/mypy_primer.git
      - name: Run mypy_primer
        shell: bash
        run: |
          cd numpy_to_test
          MYPY_VERSION=$(grep mypy== requirements/test_requirements.txt | sed -n 's/mypy==\([^;]*\).*/\1/p')

          echo "new commit"
          git checkout $GITHUB_SHA
          git rev-list --format=%s --max-count=1 HEAD

          MERGE_BASE=$(git merge-base $GITHUB_SHA origin/$GITHUB_BASE_REF)
          git worktree add ../numpy_base $MERGE_BASE
          cd ../numpy_base

          echo "base commit"
          git rev-list --format=%s --max-count=1 HEAD

          echo ''
          cd ..
          # fail action if exit code isn't zero or one
          # TODO: note that we don't build numpy, so if a project attempts to use the
          # numpy mypy plugin, we may see some issues involving version skew.
          (
            mypy_primer \
            --new v${MYPY_VERSION} --old v${MYPY_VERSION} \
            --known-dependency-selector numpy \
            --old-prepend-path numpy_base --new-prepend-path numpy_to_test \
            --num-shards 1 --shard-index ${{ matrix.shard-index }} \
            --debug \
            --output concise \
            | tee diff_${{ matrix.shard-index }}.txt
          ) || [ $? -eq 1 ]
      - if: ${{ matrix.shard-index == 0 }}
        name: Save PR number
        run: |
          echo ${{ github.event.pull_request.number }} | tee pr_number.txt
      - name: Upload mypy_primer diff + PR number
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        if: ${{ matrix.shard-index == 0 }}
        with:
          name: mypy_primer_diffs-${{ matrix.shard-index }}
          path: |
            diff_${{ matrix.shard-index }}.txt
            pr_number.txt
      - name: Upload mypy_primer diff
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        if: ${{ matrix.shard-index != 0 }}
        with:
          name: mypy_primer_diffs-${{ matrix.shard-index }}
          path: diff_${{ matrix.shard-index }}.txt

  join_artifacts:
    name: Join artifacts
    runs-on: ubuntu-latest
    needs: [mypy_primer]
    permissions:
      contents: read
    steps:
      - name: Merge artifacts
        uses: actions/upload-artifact/merge@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: mypy_primer_diffs
          pattern: mypy_primer_diffs-*
          delete-merged: true
