Prereview workflow changes for await #95
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PR Pre-review | |
| on: | |
| pull_request_target: | |
| branches: [ master ] | |
| types: [opened, synchronize, reopened] | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| issues: write | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| SKIP_REST: false | |
| jobs: | |
| pre-review: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| repository: ${{ github.event.pull_request.head.repo.full_name }} | |
| ref: ${{ github.event.pull_request.head.sha }} | |
| fetch-depth: 50 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20 | |
| cache: 'npm' | |
| - name: Fetch master branch | |
| run: git fetch origin master | |
| - name: Collect information | |
| run: | | |
| echo "Setting environment variables for preReview.js" | |
| setEnv() { | |
| echo "$1=${!1}" >> $GITHUB_ENV | |
| } | |
| # PR info | |
| PR_NUMBER=${{ github.event.pull_request.number }} | |
| setEnv "PR_NUMBER" | |
| # PR author (GitHub handle) | |
| CONTRIBUTOR=${{ github.event.pull_request.user.login }} | |
| setEnv "CONTRIBUTOR" | |
| echo "Contributor github handle: $CONTRIBUTOR" | |
| # Base repository for fork PRs | |
| BASE_REPO=${{ github.event.pull_request.base.repo.full_name }} | |
| setEnv "BASE_REPO" | |
| # PR head branch (contributor branch) | |
| HEAD_REF=${{ github.event.pull_request.head.ref }} | |
| setEnv "HEAD_REF" | |
| # Fetch base branch for git diff | |
| git fetch origin ${{ github.event.pull_request.base.ref }} | |
| # Merge base for calculating changed files | |
| MERGE_BASE=$(git merge-base origin/${{ github.event.pull_request.base.ref }} HEAD) | |
| setEnv "MERGE_BASE" | |
| # Changed files in the PR | |
| CHANGED_FILES=$(gh pr view $PR_NUMBER -R "$BASE_REPO" --json files -q '.files[].path') | |
| echo "CHANGED_FILES<<EOF" >> $GITHUB_ENV | |
| printf '%s\n' "$CHANGED_FILES" >> $GITHUB_ENV | |
| echo "EOF" >> $GITHUB_ENV | |
| # Contributor permission role (returns 'unknown' for non-collaborators) | |
| GITHUB_PERMISSION_ROLE=$(gh api "repos/$BASE_REPO/collaborators/$CONTRIBUTOR/permission" -q '.role_name' 2>/dev/null || echo 'unknown') | |
| setEnv "GITHUB_PERMISSION_ROLE" | |
| - name: Run "preReview" script | |
| id: pre-review | |
| run: | | |
| PR_NUMBER=${{ github.event.pull_request.number }}; | |
| REVIEW_MESSAGE=$(node ./generators/preReview.js "$CONTRIBUTOR" "$CHANGED_FILES" "$GITHUB_PERMISSION_ROLE"); | |
| # Save review message to env | |
| echo "REVIEW_MESSAGE<<EOF" >> $GITHUB_ENV; | |
| echo "$REVIEW_MESSAGE" >> $GITHUB_ENV; | |
| echo "EOF" >> $GITHUB_ENV; | |
| # Show review message in logs | |
| echo "===== REVIEW_MESSAGE =====" | |
| echo "$REVIEW_MESSAGE" | |
| echo "==========================" | |
| # Submit review comment | |
| echo "Submit review comment" | |
| gh pr comment "$PR_NUMBER" --body "$REVIEW_MESSAGE" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| # Handle "Changes Requested" label + assignee | |
| echo "Handle 'Changes Requested' label and contributor assignment" | |
| if echo "$REVIEW_MESSAGE" | grep -q '\- \[ \]'; then | |
| # Only assign if contributor is a collaborator | |
| if [[ "$GITHUB_PERMISSION_ROLE" != "unknown" ]]; then | |
| echo "Assigning contributor: $CONTRIBUTOR" | |
| gh pr edit "$PR_NUMBER" --add-assignee "$CONTRIBUTOR" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| fi | |
| # Add "Changes Requested" label | |
| echo "Adding 'Changes Requested' label" | |
| gh pr edit "$PR_NUMBER" --add-label "Changes Requested" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| # Remove "Awaiting Maintainer Validation" if previously added | |
| echo "Removing 'Awaiting Maintainer Validation' label if present" | |
| gh pr edit "$PR_NUMBER" --remove-label "Awaiting Maintainer Validation" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| else | |
| # No changes requested → add "Awaiting Maintainer Validation" | |
| echo "Adding 'Awaiting Maintainer Validation' label" | |
| gh pr edit "$PR_NUMBER" --add-label "Awaiting Maintainer Validation" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| # Remove "Changes Requested" label just in case | |
| echo "Removing 'Changes Requested' label if present" | |
| gh pr edit "$PR_NUMBER" --remove-label "Changes Requested" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| fi | |
| # Handle "invalid" label | |
| echo "Handle 'invalid' label" | |
| if echo "$REVIEW_MESSAGE" | grep -q -Eqi 'empty file'; then | |
| gh pr edit "$PR_NUMBER" --add-label "invalid" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| else | |
| gh pr edit "$PR_NUMBER" --remove-label "invalid" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| fi | |
| # Handle "Conflict present" label | |
| echo "Handle 'Conflict present' label" | |
| if echo "$REVIEW_MESSAGE" | grep -q -Eqi '/icon'; then | |
| gh pr edit "$PR_NUMBER" --add-label "Conflict present" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| else | |
| gh pr edit "$PR_NUMBER" --remove-label "Conflict present" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| fi | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| maintainer-review: | |
| needs: pre-review | |
| if: github.event_name == 'pull_request_review' | |
| runs-on: ubuntu-latest | |
| steps: | |
| # While reviewing on github, this automatically assign labels on review actions. | |
| # When submiting a review (reminder, this cannot run for maintainers reviewing their own PRs.) | |
| # - Label "Changes Requested" on "request changes" review action | |
| # - Label "hacktoberfest-accepted" on "aprove" review action only if current date is in October | |
| - name: Show previous review message | |
| run: | | |
| echo "Message from pre-review job:" | |
| echo "${{ needs.pre-review.outputs.review_message }}" | |
| - name: Add labels depending on maintainer review | |
| run: | | |
| PR_NUMBER=${{ github.event.pull_request.number }} | |
| REVIEW_STATE=${{ github.event.review.state }} | |
| CURRENT_MONTH=$(date +%m) | |
| if [[ "$REVIEW_STATE" == "changes_requested" ]]; then | |
| gh pr edit "$PR_NUMBER" --add-label "Changes Requested" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| echo "Maintainer requested changes — label added." | |
| fi | |
| # Add Hacktoberfest label only if current month is October (10) | |
| if [[ "$CURRENT_MONTH" == "10" && "$REVIEW_STATE" == "approved" ]]; then | |
| gh pr edit "$PR_NUMBER" --add-label "hacktoberfest-accepted" -R "${{ github.event.pull_request.base.repo.full_name }}" | |
| fi | |