name: PR code coverage (generate)

on:
  # This workflow does not have access to secrets because it runs on top of
  # potentially unsafe changes.
  pull_request:
    types: [ opened, reopened, synchronize ]
    branches: [ master ]

jobs:
  # The results of this job are uploaded as artifacts. A separate job will
  # download the artifacts and upload them to a GCS bucket.
  code-cover-gen:
    runs-on: ubuntu-latest
    env:
      PR: ${{ github.event.pull_request.number }}
      HEAD_SHA: ${{ github.event.pull_request.head.sha }}
      GH_TOKEN: ${{ github.token }}
    steps:
      - uses: actions/checkout@v3
        with:
          # By default, checkout merges the PR into the current master.
          # Instead, we want to check out the PR as-is.
          ref: ${{ github.event.pull_request.head.sha }}
          # Fetch all branches and history (we'll need the origin/master ref and
          # the base commit).
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: "1.21"

      - name: Get list of changed packages
        shell: bash
        run: |
          set -euxo pipefail
          # To get the base commit, we get the number of commits in the PR.
          # Note that github.event.pull_request.base.sha is not what we want,
          # that is the tip of master and not necessarily the PR fork point.
          NUM_COMMITS=$(gh pr view $PR --json commits --jq '.commits | length')
          BASE_SHA=$(git rev-parse HEAD~${NUM_COMMITS})
          CHANGED_PKGS=$(scripts/changed-go-pkgs.sh ${BASE_SHA} ${HEAD_SHA})
          echo "BASE_SHA=${BASE_SHA}" >> "${GITHUB_ENV}"
          echo "CHANGED_PKGS=${CHANGED_PKGS}" >> "${GITHUB_ENV}"

      - name: Generate "after" coverage
        shell: bash
        run: |
          set -euxo pipefail
          CHANGED_PKGS='${{ env.CHANGED_PKGS }}'
          mkdir -p artifacts
          # Make a copy of the script so that the "before" run below uses the
          # same version.
          cp scripts/pr-codecov-run-tests.sh ${RUNNER_TEMP}/
          ${RUNNER_TEMP}/pr-codecov-run-tests.sh artifacts/cover-${PR}-${HEAD_SHA}.json "${CHANGED_PKGS}"

      - name: Generate "before" coverage
        shell: bash
        run: |
          set -euxo pipefail
          BASE_SHA='${{ env.BASE_SHA }}'
          CHANGED_PKGS='${{ env.CHANGED_PKGS }}'
          git checkout -f ${BASE_SHA}
          ${RUNNER_TEMP}/pr-codecov-run-tests.sh artifacts/cover-${PR}-${BASE_SHA}.json "${CHANGED_PKGS}"

      - name: Upload artifacts
        uses: actions/upload-artifact@v2
        with:
          name: cover
          path: artifacts/cover-*.json