[Pull Request] Review Labeler #29
Workflow file for this run
This file contains 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: "[Pull Request] Review Labeler" | |
on: | |
pull_request_review: | |
types: [submitted, edited, dismissed] | |
pull_request_target: | |
types: [synchronize, reopened] | |
jobs: | |
update-labels: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Add or remove labels based on review state | |
uses: actions/github-script@v6 | |
with: | |
script: | | |
const prNumber = context.payload.pull_request.number; | |
const owner = context.repo.owner; | |
const repo = context.repo.repo; | |
const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ | |
owner, | |
repo, | |
issue_number: prNumber | |
}); | |
const hasPendingReview = currentLabels.some(label => label.name === 'pending/review'); | |
let reviewState = context.payload.review?.state | |
// If there is no review object, it might be a different event type | |
if (!reviewState) { | |
// Fetch the latest review state from the PR | |
const reviews = await github.rest.pulls.listReviews({ | |
owner, | |
repo, | |
pull_number: prNumber | |
}); | |
// If there are any reviews, get the state of the latest one | |
if (reviews.data.length > 0) { | |
const latestReview = reviews.data[reviews.data.length - 1]; | |
reviewState = latestReview.state.toLowerCase(); | |
} | |
} | |
// Remove 'pending/review' label if it exists and the review state is not 'pending' | |
if (hasPendingReview && reviewState !== 'pending') { | |
await github.rest.issues.removeLabel({ | |
owner, | |
repo, | |
issue_number: prNumber, | |
name: 'pending/review' | |
}); | |
} | |
// Add 'approved/review' or 'changes_requested/review' label based on review state | |
if (reviewState === 'approved' || reviewState === 'changes_requested') { | |
const labelToAdd = reviewState === 'approved' ? 'approved/review' : 'changes_requested/review'; | |
await github.rest.issues.addLabels({ | |
owner, | |
repo, | |
issue_number: prNumber, | |
labels: [labelToAdd] | |
}); | |
} | |
// Re-add 'pending/review' label if PR is synchronized and no reviews are pending | |
if (context.eventName === 'pull_request_target' && !hasPendingReview) { | |
await github.rest.issues.addLabels({ | |
owner, | |
repo, | |
issue_number: prNumber, | |
labels: ['pending/review'] | |
}); | |
} | |