name: Check PR Template on: pull_request_target: # zizmor: ignore[dangerous-triggers] types: [opened, edited] permissions: {} jobs: parse: runs-on: ubuntu-latest if: ${{ github.event.pull_request.head.repo.fork == true }} permissions: contents: read outputs: uses_template: ${{ steps.check.outputs.uses_template }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: sparse-checkout: .github/pull_request_template.md sparse-checkout-cone-mode: false persist-credentials: false - name: Check required sections id: check env: BODY: ${{ github.event.pull_request.body }} run: | OK=true while IFS= read -r header; do printf '%s\n' "$BODY" | grep -qF "$header" || OK=false done < <(sed '//d' .github/pull_request_template.md | grep "^## ") echo "uses_template=$OK" >> "$GITHUB_OUTPUT" act: runs-on: ubuntu-latest needs: parse permissions: pull-requests: write steps: - name: Close PR if: ${{ needs.parse.outputs.uses_template == 'false' && github.event.pull_request.state != 'closed' }} env: GH_TOKEN: ${{ github.token }} NODE_ID: ${{ github.event.pull_request.node_id }} run: | gh api graphql \ -f prId="$NODE_ID" \ -f body="This PR has been automatically closed as the description doesn't follow our template. After you edit it to match the template, the PR will automatically be reopened." \ -f query=' mutation CommentAndClosePR($prId: ID!, $body: String!) { addComment(input: { subjectId: $prId, body: $body }) { __typename } closePullRequest(input: { pullRequestId: $prId }) { __typename } }' - name: Reopen PR (sections now present, PR closed) if: ${{ needs.parse.outputs.uses_template == 'true' && github.event.pull_request.state == 'closed' }} env: GH_TOKEN: ${{ github.token }} NODE_ID: ${{ github.event.pull_request.node_id }} run: | gh api graphql \ -f prId="$NODE_ID" \ -f query=' mutation ReopenPR($prId: ID!) { reopenPullRequest(input: { pullRequestId: $prId }) { __typename } }'