generated from actions/typescript-action
-
Notifications
You must be signed in to change notification settings - Fork 1
/
utils.ts
99 lines (88 loc) · 2.56 KB
/
utils.ts
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
import minimatch from 'minimatch'
import {Condition, PullRequestInfo, RecordBody} from './type'
export function isPendingMergePr(
pr: PullRequestInfo,
condition: Condition
): boolean {
const check = pr.commits.nodes[0].commit.statusCheckRollup
if (!check) return false
const checkNodes = check.contexts.nodes
return (
isSatisfyBasicConditionPr(pr, condition) &&
(checkNodes.some(v => v.state === 'PENDING') || check.state === 'PENDING')
)
}
export function isStatusCheckPassPr(
pr: PullRequestInfo,
condition: Condition
): boolean {
return (
isSatisfyBasicConditionPr(pr, condition) &&
isStatusChecksSuccess(pr, condition)
)
}
export function stringify<T>(obj: T): string {
return JSON.stringify(obj, null, 2)
}
// Except status check
function isSatisfyBasicConditionPr(
pr: PullRequestInfo,
condition: Condition
): boolean {
return (
!pr.merged &&
pr.mergeable === 'MERGEABLE' &&
pr.reviews.totalCount >= condition.requiredApprovals &&
pr.reviewRequests.totalCount === 0 &&
hasLabels(pr, condition) &&
minimatch(pr.baseRefName, condition.branchNamePattern ?? '*')
)
}
function hasLabels(pr: PullRequestInfo, condition: Condition): boolean {
const labelNames = pr.labels.nodes.map(v => v.name)
return condition.requiredLabels.every(v => labelNames.includes(v))
}
function isStatusChecksSuccess(
pr: PullRequestInfo,
condition: Condition
): boolean {
const check = pr.commits.nodes[0].commit.statusCheckRollup
if (!check) return false
if (condition.requiredStatusChecks.length) {
const nodeChecks = new Map(
check.contexts.nodes.map(i => [i.name || i.context, i])
)
return condition.requiredStatusChecks.every(name => {
const check = nodeChecks.get(name)
return check?.conclusion === 'SUCCESS' || check?.state === 'SUCCESS'
})
} else {
return check.state === 'SUCCESS'
}
}
export function parseIssueBody(body: string): RecordBody {
try {
const json = body
.split(issueBodyStatusPrefix)
.filter(e => e)
.pop()
?.split(issueBodyStatusSuffix)
.filter(e => e)[0]
return JSON.parse(json ?? '')
} catch (e) {
return {}
}
}
export function createIssueBody(body: RecordBody): string {
return `
${issueBodyPrefix}
This issue provides [lcdsmao/update-branch](https://github.com/lcdsmao/update-branch) status.
Status:
${issueBodyStatusPrefix}
${stringify(body)}
${issueBodyStatusSuffix}
`
}
export const issueBodyPrefix = '<!-- lcdsmao/update-branch -->'
export const issueBodyStatusPrefix = '```json'
export const issueBodyStatusSuffix = '```'