aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron <51387595+AzureAaron@users.noreply.github.com>2024-02-28 21:04:28 +0000
committerGitHub <noreply@github.com>2024-02-28 21:04:28 +0000
commit71babf9f4da46bbefa038516da696425fe406793 (patch)
treed990e05b563bf087fbbf82a28d58eaa670da92f3
parent6f16df3f8049e27fa0d52a335c152d47aaf10428 (diff)
parentc8fa9df0f1b85d1c3f2ddf8c678df668ee125f40 (diff)
downloadSkyblocker-71babf9f4da46bbefa038516da696425fe406793.tar.gz
Skyblocker-71babf9f4da46bbefa038516da696425fe406793.tar.bz2
Skyblocker-71babf9f4da46bbefa038516da696425fe406793.zip
Merge pull request #574 from LifeIsAParadox/labeler
Automatic Labeling
-rw-r--r--.github/workflows/labeler.yml77
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..f1ec8445
--- /dev/null
+++ b/.github/workflows/labeler.yml
@@ -0,0 +1,77 @@
+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]
+ });
+ }
+ } \ No newline at end of file