forked from ChrisTitusTech/linutil
-
Notifications
You must be signed in to change notification settings - Fork 0
95 lines (82 loc) · 3.36 KB
/
pr-labels.yaml
File metadata and controls
95 lines (82 loc) · 3.36 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
name: Label PRs by Type of Change
on:
pull_request_target:
types: [opened, edited, synchronize]
jobs:
label-pr:
runs-on: ubuntu-latest
permissions:
pull-requests: write
issues: write
contents: read
steps:
- name: Check PR body for Type of Change
uses: actions/github-script@v7
with:
script: |
const prBody = context.payload.pull_request.body || '';
const labelsToAdd = [];
// Check for Type of Change checkboxes
if (/\[x\]\s*New feature/i.test(prBody)) {
labelsToAdd.push('new feature');
}
if (/\[x\]\s*Bug fix/i.test(prBody)) {
labelsToAdd.push('bug');
}
if (/\[x\]\s*Documentation update/i.test(prBody)) {
labelsToAdd.push('documentation');
}
if (/\[x\]\s*Hotfix/i.test(prBody)) {
labelsToAdd.push('hotfix');
}
if (/\[x\]\s*UI\/UX improvement/i.test(prBody)) {
labelsToAdd.push('UI update');
}
// Check changed files for automatic labeling
const { data: files } = await github.rest.pulls.listFiles({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: context.payload.pull_request.number
});
const hasRustFiles = files.some(file => file.filename.endsWith('.rs'));
const hasShellFiles = files.some(file => file.filename.endsWith('.sh'));
const hasMarkdownFiles = files.some(file => file.filename.endsWith('.md'));
if (hasRustFiles) {
labelsToAdd.push('rust');
}
if (hasShellFiles) {
labelsToAdd.push('script');
}
if (hasMarkdownFiles) {
labelsToAdd.push('documentation');
}
// Extract referenced issues and get their labels
const issueRegex = /(?:Fixes|Resolves|Closes):?\s*#(\d+)/gi;
const issueMatches = [...prBody.matchAll(issueRegex)];
const issueNumbers = [...new Set(issueMatches.map(match => parseInt(match[1])))];
for (const issueNumber of issueNumbers) {
try {
const issue = await github.rest.issues.get({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: issueNumber
});
// Add labels from referenced issues that contain a colon
const issueLabels = issue.data.labels
.map(label => typeof label === 'string' ? label : label.name)
.filter(name => name.includes(':'));
labelsToAdd.push(...issueLabels);
} catch (error) {
console.log(`Could not fetch issue #${issueNumber}: ${error.message}`);
}
}
// Remove duplicates and add labels
const uniqueLabels = [...new Set(labelsToAdd)];
if (uniqueLabels.length > 0) {
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: uniqueLabels
});
}