name: Automatic Labeling on: pull_request_target: types: [opened, synchronize, reopened, ready_for_review, converted_to_draft, closed] pull_request_review: types: [submitted, dismissed] jobs: labeler: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set Labels uses: actions/github-script@v7 with: github-token: ${{ secrets.GH_LABELER }} script: | const { owner, repo, number: pull_number } = context.issue; const { data: pullRequest } = await github.rest.pulls.get({ owner, repo, pull_number }); const labels = pullRequest.labels.map(label => label.name); let label = ''; if (pullRequest.draft) { label = 'wip'; } else if (pullRequest.mergeable_state === 'dirty') { label = 'merge conflicts'; } else if (pullRequest.merged) { label = '' } else { const { data: reviews } = await github.rest.pulls.listReviews({ owner, repo, pull_number }); const { data: commits } = await github.rest.pulls.listCommits({ owner, repo, pull_number }); const filteredReviews = reviews.filter(review => review.state === 'CHANGES_REQUESTED' || review.state === 'APPROVED'); const lastReview = filteredReviews.sort((a, b) => new Date(b.submitted_at) - new Date(a.submitted_at))[0]; const lastCommit = commits.sort((a, b) => new Date(b.commit.committer.date) - new Date(a.commit.committer.date))[0]; if (!lastReview || new Date(lastReview.submitted_at) < new Date(lastCommit.commit.committer.date)) { label = 'reviews needed'; } else if (lastReview.state === 'CHANGES_REQUESTED') { label = 'changes requested'; } else if (lastReview.state === 'APPROVED') { label = 'merge me please'; } } // if label is not set change the label if (!labels.includes(label)) { // list of labels to be removed const labelsToRemove = ['merge me please', 'reviews needed', 'merge conflicts', 'wip', 'changes requested']; // remove all label from list const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ owner, repo, issue_number: pull_number }); for (const { name } of currentLabels) { if (labelsToRemove.includes(name)) { await github.rest.issues.removeLabel({ owner, repo, issue_number: pull_number, name }); } } // add label if (label) { await github.rest.issues.addLabels({ owner, repo, issue_number: pull_number, labels: [label] }); } }