diff options
author | Yasin <a.piri@hotmail.de> | 2024-02-26 23:56:06 +0100 |
---|---|---|
committer | Yasin <a.piri@hotmail.de> | 2024-02-26 23:56:06 +0100 |
commit | 336801ade2835666e7b9527e8da1db265258a5b5 (patch) | |
tree | 63bf32ca7a2207a6ede600d651fe61ea14318628 /.github/workflows | |
parent | ecb507502c3278408571e94095e1f9c24c7b2a40 (diff) | |
download | Skyblocker-336801ade2835666e7b9527e8da1db265258a5b5.tar.gz Skyblocker-336801ade2835666e7b9527e8da1db265258a5b5.tar.bz2 Skyblocker-336801ade2835666e7b9527e8da1db265258a5b5.zip |
Create labeler.yml
Diffstat (limited to '.github/workflows')
-rw-r--r-- | .github/workflows/labeler.yml | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml new file mode 100644 index 00000000..0a004528 --- /dev/null +++ b/.github/workflows/labeler.yml @@ -0,0 +1,77 @@ +name: Automatic Labeling + +on: + pull_request: + 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] + }); + } + }
\ No newline at end of file |