# All PRs except trivial ones should require 2 approvals, since this a global setting
# we cannot make this decision from github configuration alone. So we set the required
# approved in github to 1 and make this check required which will enforce 2 approvals
# unless overwritten or only CI files are touched.
name: PR Approval Check
"on":
  pull_request:
    types: [opened, synchronize, reopened, edited, auto_merge_enabled, auto_merge_disabled]
    branches: [main]
  pull_request_review:

jobs:
  check_approvals:
    name: Check for sufficient approvals
    runs-on: timescaledb-runner-arm64
    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Check for sufficient approvals
        shell: bash --norc --noprofile {0}
        env:
          GH_TOKEN: ${{ github.token }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
        run: |
          set -eu
          echo "PR number is $PR_NUMBER"
          BODY=$(gh pr view $PR_NUMBER -q .body --json body)
          if ! echo "$BODY" | egrep -qsi '^disable-check:.*\<approval-count\>'
          then
            # Get the list of modified files in this pull request
            echo "Modified files: "
            gh pr view $PR_NUMBER --json files
            # Get the number of modified files, but exclude those that
            # are workflow files. These require only a single
            # reviewer.
            files=$(gh pr view $PR_NUMBER --json files --jq '[.files.[].path | select(startswith(".github") | not)] | length')

            # Get the number of approvals in this pull request
            echo "Reviews: "
            gh pr view $PR_NUMBER --json reviews
            approvals=$(
                gh pr view $PR_NUMBER --json reviews --jq '
                    [
                        .reviews.[]
                        | select(.authorAssociation == "MEMBER" and .state == "APPROVED")
                    ] | length
                  '
            )
            echo "approvals: $approvals, files: $files"
            if [[ $approvals -lt 2 && $files -gt 0 ]] ; then
              echo "This pull request requires 2 approvals before merging."
              echo
              echo "For trivial changes, you may disable this check by adding this trailer to the pull request message:"
              echo
              echo "Disable-check: approval-count"
              echo
              exit 1
            fi
          fi

