-
-
Notifications
You must be signed in to change notification settings - Fork 80
154 lines (140 loc) · 5.69 KB
/
Copy pathstatus-label.yml
File metadata and controls
154 lines (140 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
name: 🛠️ Status Labels
on:
pull_request:
types:
- opened
- reopened
- closed
permissions:
contents: read
issues: write
pull-requests: write
jobs:
update-labels:
name: Update Status Labels
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set PR status to review
if: ${{ github.event.action == 'opened' || github.event.action == 'reopened' }}
uses: actions/github-script@v7
with:
script: |
console.log('PR opened event triggered');
const prNumber = context.payload.pull_request?.number;
if (!prNumber) {
console.log('Error: PR number is undefined');
return;
}
console.log(`PR Number: ${prNumber}`);
// Print current labels on the PR
const prLabels = context.payload.pull_request.labels || [];
console.log('Current PR Labels:', prLabels.map(label => label.name));
// Remove all labels starting with 'status:' from the PR, except 'status:review'
let alreadyInReview = false;
for (const label of prLabels) {
if (label.name === 'status:review') {
alreadyInReview = true;
} else if (label.name.startsWith('status:')) {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
name: label.name
});
}
}
// Add 'status:review' label to the PR if not already present
if (!alreadyInReview) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
labels: ['status:review']
});
}
// Process linked issues
const linkedIssues = context.payload.pull_request.body?.match(/(?:Fixes|Closes) #\d+/g) || [];
console.log(`Linked Issues: ${linkedIssues}`);
for (const issueRef of linkedIssues) {
const issueNumber = parseInt(issueRef.split('#')[1]);
console.log(`Processing linked issue: ${issueNumber}`);
// Print current labels on the linked issue
const issueLabels = (await github.rest.issues.listLabelsOnIssue({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
})).data;
console.log(`Current Labels on Issue #${issueNumber}:`, issueLabels.map(label => label.name));
// Check if 'status:review' is already present
let alreadyInReview = false;
for (const label of issueLabels) {
if (label.name === 'status:review') {
alreadyInReview = true;
} else if (label.name.startsWith('status:')) {
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: label.name
});
}
}
// Add 'status:review' label to the linked issue if not already present
if (!alreadyInReview) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: ['status:review']
});
console.log(`Added status:review label to issue: ${issueNumber}`);
} else {
console.log(`status:review label already present on issue: ${issueNumber}`);
}
}
- name: Set PR and linked issues to done
if: ${{ github.event.action == 'closed' && github.event.pull_request.merged == true }}
uses: actions/github-script@v7
with:
script: |
console.log('PR closed and merged event triggered');
const prNumber = context.payload.pull_request?.number;
if (!prNumber) {
console.log('Error: PR number is undefined');
return;
}
console.log(`PR Number: ${prNumber}`);
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
name: 'status:review'
}).catch(() => console.log('status:review label not found on PR'));
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: prNumber,
labels: ['status:done']
});
console.log('Added status:done label to PR');
const linkedIssues = context.payload.pull_request.body?.match(/(?:Fixes|Closes|Implements|Resolves) #\d+/g) || [];
console.log(`Linked Issues: ${linkedIssues}`);
for (const issueRef of linkedIssues) {
const issueNumber = parseInt(issueRef.split('#')[1]);
console.log(`Processing linked issue: ${issueNumber}`);
await github.rest.issues.removeLabel({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
name: 'status:review'
}).catch(() => console.log('status:review label not found on issue'));
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber,
labels: ['status:done']
});
console.log(`Added status:done label to issue: ${issueNumber}`);
}