name: Check mergeability

on: pull_request

permissions:
  pull-requests: write
  checks: write
  statuses: write

jobs:
  check:
    runs-on: ubuntu-latest
    steps:
      - name: Check if there is already a block on this PR
        id: blocked
        uses: actions/github-script@v6
        env:
          issue_number:  ${{ github.event.number }}
        with:
          script: |
            const { data: reviews } = await github.rest.pulls.listReviews({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: process.env.issue_number,
            });

            for (const review of reviews) {
              if (review.user.login === 'github-actions[bot]' && review.state === 'CHANGES_REQUESTED') {
                return 'true'
              }
            }
            return 'false'
          result-encoding: string

      - uses: actions/checkout@v3
        if: steps.blocked.outputs.result != 'true'
        with:
          fetch-depth: 0

      - name: Get changed files in the .changeset folder
        id: changed-files
        uses: tj-actions/changed-files@v35
        if: steps.blocked.outputs.result != 'true'
        with:
          files: |
            .changeset/**/*.md

      - name: Check if any changesets contain minor changes
        id: minor
        if: steps.blocked.outputs.result != 'true'
        run: |
          echo "Checking for changesets marked as minor"
          echo '::set-output name=found::false'
          for file in ${{ steps.changed-files.outputs.all_changed_files }}; do
            if grep -q "'astro': minor" "$file"; then
              echo '::set-output name=found::true'
              echo "$file has a minor release tag"
            fi
          done

      - name: Add label
        uses: actions/github-script@v6
        if: steps.minor.outputs.found == 'true'
        env:
          issue_number: ${{ github.event.number }}
        with:
          script: |
            github.rest.issues.addLabels({
              issue_number: process.env.issue_number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              labels: ['semver: minor']
            });

      - name: Change PR Status
        uses: actions/github-script@v6
        if: steps.minor.outputs.found == 'true'
        env:
          issue_number: ${{ github.event.number }}
        with:
          script: |
            github.rest.pulls.createReview({
              owner: context.repo.owner,
              repo: context.repo.repo,
              pull_number: process.env.issue_number,
              event: 'REQUEST_CHANGES',
              body: 'This PR is blocked because it contains a `minor` changeset. A reviewer will merge this at the next release if approved.'
            });