diff --git a/.github/workflows/remove-needs-review-on-review.yml b/.github/workflows/remove-needs-review-on-review.yml new file mode 100644 index 000000000..4c8d2d29a --- /dev/null +++ b/.github/workflows/remove-needs-review-on-review.yml @@ -0,0 +1,69 @@ +name: remove-needs-review-on-review + +on: + pull_request_review: + types: + - submitted + +jobs: + remove-needs-review: + name: 🏷️ Remove needs review label + if: github.repository == 'npmx-dev/npmx.dev' + runs-on: ubuntu-slim + permissions: + contents: read + issues: write + pull-requests: write + steps: + - name: 🏷️ Remove needs review label + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const pr = context.payload.pull_request; + const review = context.payload.review; + const LABEL = 'needs review'; + const reviewer = review?.user?.login; + const author = pr.user?.login; + const reviewerType = review?.user?.type; + + if (!reviewer) { + console.log('No reviewer login found in payload, skipping.'); + return; + } + + if (reviewerType === 'Bot') { + console.log(`Skipping bot review from @${reviewer} on PR #${pr.number}.`); + return; + } + + if (reviewer === author) { + console.log(`Skipping self-review from @${reviewer} on PR #${pr.number}.`); + return; + } + + if (!pr.labels.some(({ name }) => name === LABEL)) { + console.log(`PR #${pr.number} does not have the "${LABEL}" label.`); + return; + } + + const { data: permission } = await github.rest.repos.getCollaboratorPermissionLevel({ + owner: context.repo.owner, + repo: context.repo.repo, + username: reviewer, + }); + + console.log(`Reviewer @${reviewer} permission is "${permission.permission}".`); + + if (!['admin', 'maintain', 'write'].includes(permission.permission)) { + console.log(`Reviewer @${reviewer} is not a maintainer, skipping.`); + return; + } + + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + name: LABEL, + }); + + console.log(`Removed "${LABEL}" from PR #${pr.number}.`);