-
-
Notifications
You must be signed in to change notification settings - Fork 86
/
utils.ts
126 lines (108 loc) · 3.04 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
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
import _ from 'lodash'
import * as yaml from 'js-yaml'
import { Config } from './handler'
import { Client } from './types'
export function chooseReviewers(owner: string, config: Config): string[] {
const { useReviewGroups, reviewGroups, numberOfReviewers, reviewers } = config
let chosenReviewers: string[] = []
const useGroups: boolean =
useReviewGroups && Object.keys(reviewGroups).length > 0
if (useGroups) {
chosenReviewers = chooseUsersFromGroups(
owner,
reviewGroups,
numberOfReviewers
)
} else {
chosenReviewers = chooseUsers(reviewers, numberOfReviewers, owner)
}
return chosenReviewers
}
export function chooseAssignees(owner: string, config: Config): string[] {
const {
useAssigneeGroups,
assigneeGroups,
addAssignees,
numberOfAssignees,
numberOfReviewers,
assignees,
reviewers,
} = config
let chosenAssignees: string[] = []
const useGroups: boolean =
useAssigneeGroups && Object.keys(assigneeGroups).length > 0
if (typeof addAssignees === 'string') {
if (addAssignees !== 'author') {
throw new Error(
"Error in configuration file to do with using addAssignees. Expected 'addAssignees' variable to be either boolean or 'author'"
)
}
chosenAssignees = [owner]
} else if (useGroups) {
chosenAssignees = chooseUsersFromGroups(
owner,
assigneeGroups,
numberOfAssignees || numberOfReviewers
)
} else {
const candidates = assignees ? assignees : reviewers
chosenAssignees = chooseUsers(
candidates,
numberOfAssignees || numberOfReviewers,
owner
)
}
return chosenAssignees
}
export function chooseUsers(
candidates: string[],
desiredNumber: number,
filterUser: string = ''
): string[] {
const filteredCandidates = candidates.filter((reviewer: string): boolean => {
return reviewer.toLowerCase() !== filterUser.toLowerCase()
})
// all-assign
if (desiredNumber === 0) {
return filteredCandidates
}
return _.sampleSize(filteredCandidates, desiredNumber)
}
export function includesSkipKeywords(
title: string,
skipKeywords: string[]
): boolean {
for (const skipKeyword of skipKeywords) {
if (title.toLowerCase().includes(skipKeyword.toLowerCase()) === true) {
return true
}
}
return false
}
export function chooseUsersFromGroups(
owner: string,
groups: { [key: string]: string[] } | undefined,
desiredNumber: number
): string[] {
let users: string[] = []
for (const group in groups) {
users = users.concat(chooseUsers(groups[group], desiredNumber, owner))
}
return users
}
export async function fetchConfigurationFile(client: Client, options) {
const { owner, repo, path, ref } = options
const result = await client.rest.repos.getContent({
owner,
repo,
path,
ref,
})
const data: any = result.data
if (!data.content) {
throw new Error('the configuration file is not found')
}
const configString = Buffer.from(data.content, 'base64').toString()
const config = yaml.safeLoad(configString)
return config
}