This repository has been archived by the owner on Mar 28, 2023. It is now read-only.
forked from danielchabr/pr-labels-checker
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
124 lines (102 loc) · 3.33 KB
/
index.js
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
const core = require('@actions/core')
const github = require('@actions/github')
// check if this is running on a pull request
if (!github.context.payload.pull_request) {
return core.setOutput('passed', true)
}
const token = core.getInput('githubToken');
const context = github.context
const octokit = github.getOctokit(token)
const hasSomeInput = core.getInput('hasSome')
const hasAllInput = core.getInput('hasAll')
const hasNoneInput = core.getInput('hasNone')
const hasNotAllInput = core.getInput('hasNotAll')
const forceMergeLabel = core.getInput('forceMerge')
const hasSomeLabels = hasSomeInput.split(',')
const hasAllLabels = hasAllInput.split(',')
const hasNoneLabels = hasNoneInput.split(',')
const hasNotAllLabels = hasNotAllInput.split(',')
const failMessages = []
const prLabels = context.payload.pull_request.labels.map(item => item.name)
const hasSomeResult = !hasSomeInput || hasSomeLabels.some((label) =>
prLabels.includes(label)
)
const hasAllResult = !hasAllInput || hasAllLabels.every((label) =>
prLabels.includes(label)
)
const hasNoneResult = !hasNoneInput || hasNoneLabels.every((label) =>
!prLabels.includes(label)
)
const hasNotAllResult = !hasNotAllInput || hasNotAllLabels.some((label) =>
!prLabels.includes(label)
)
if (!hasSomeResult) {
failMessages.push(`The PR needs to have at least one of the following labels to pass this check: ${hasSomeLabels.join(
', '
)}`)
}
if (!hasAllResult) {
failMessages.push(`The PR needs to have all of the following labels to pass this check: ${hasAllLabels.join(
', '
)}`)
}
if (!hasNoneResult) {
failMessages.push(`The PR needs to have none of the following labels to pass this check: ${hasNoneLabels.join(
', '
)}`)
}
if (!hasNotAllResult) {
failMessages.push(`The PR needs to not have at least one of the following labels to pass this check: ${hasNotAllLabels.join(
', '
)}`)
}
async function run () {
if (forceMergeLabel && !prLabels.includes(forceMergeLabel)) {
const repoTopics = await octokit.repos.getAllTopics({
owner: context.repo.owner,
repo: context.repo.repo,
})
const baseBranchName = context.payload.pull_request.base.ref
if (repoTopics.data.names.includes(`lock-${baseBranchName}`)) {
failMessages.push(
`The base branch ${baseBranchName} is locked, and the PR does not have label` +
` ${forceMergeLabel}`,
)
}
}
const checks = await octokit.checks.listForRef({
...context.repo,
ref: context.payload.pull_request.head.ref,
});
const checkRunIds = checks.data.check_runs.filter(check => check.name === context.job).map(check => check.id)
if (failMessages.length) {
// update old checks
for (const id of checkRunIds) {
await octokit.checks.update({
...context.repo,
check_run_id: id,
conclusion: 'failure',
output: {
title: 'Labels did not pass provided rules',
summary: failMessages.join('. ')
}
})
}
core.setFailed(failMessages.join('. '))
} else {
// update old checks
for (const id of checkRunIds) {
await octokit.checks.update({
...context.repo,
check_run_id: id,
conclusion: 'success',
output: {
title: 'Labels follow all the provided rules',
summary: ''
}
})
}
core.setOutput('passed', true)
}
}
run()