name: Run mypy_primer

permissions: {}

on:
  pull_request:
    paths:
      - "crates/red_knot*/**"
      - "crates/ruff_db"
      - "crates/ruff_python_ast"
      - "crates/ruff_python_parser"
      - ".github/workflows/mypy_primer.yaml"
      - ".github/workflows/mypy_primer_comment.yaml"

concurrency:
  group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

env:
  CARGO_INCREMENTAL: 0
  CARGO_NET_RETRY: 10
  CARGO_TERM_COLOR: always
  RUSTUP_MAX_RETRIES: 10

jobs:
  mypy_primer:
    name: Run mypy_primer
    runs-on: depot-ubuntu-22.04-16
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          path: ruff
          fetch-depth: 0
          persist-credentials: false

      - name: Install the latest version of uv
        uses: astral-sh/setup-uv@0c5e2b8115b80b4c7c5ddf6ffdd634974642d182 # v5.4.1

      - uses: Swatinem/rust-cache@9d47c6ad4b02e050fd481d890b2ea34778fd09d6 # v2.7.8
        with:
          workspaces: "ruff"
      - name: Install Rust toolchain
        run: rustup show

      - name: Install mypy_primer
        run: |
          uv tool install "git+https://github.com/astral-sh/mypy_primer.git@add-red-knot-support-v5"

      - name: Run mypy_primer
        shell: bash
        run: |
          cd ruff

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

          MERGE_BASE="$(git merge-base "$GITHUB_SHA" "origin/$GITHUB_BASE_REF")"
          git checkout -b base_commit "$MERGE_BASE"
          echo "base commit"
          git rev-list --format=%s --max-count=1 base_commit

          cd ..

          # Allow the exit code to be 0 or 1, only fail for actual mypy_primer crashes/bugs
          uvx mypy_primer \
            --repo ruff \
            --type-checker knot \
            --old base_commit \
            --new "$GITHUB_SHA" \
            --project-selector '/(mypy_primer|black|pyp|git-revise|zipp|arrow|isort|itsdangerous|rich|packaging|pybind11|pyinstrument|typeshed-stats|scrapy|werkzeug|bidict|async-utils|python-chess|dacite|python-htmlgen|paroxython|porcupine|psycopg)$' \
            --output concise \
            --debug > mypy_primer.diff || [ $? -eq 1 ]

          # Output diff with ANSI color codes
          cat mypy_primer.diff

          # Remove ANSI color codes before uploading
          sed -ie 's/\x1b\[[0-9;]*m//g' mypy_primer.diff

          echo ${{ github.event.number }} > pr-number

      - name: Upload diff
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: mypy_primer_diff
          path: mypy_primer.diff

      - name: Upload pr-number
        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
        with:
          name: pr-number
          path: pr-number
