@@ -13,6 +13,61 @@ export interface Config {
13
13
useAssigneeGroups : boolean
14
14
reviewGroups : { [ key : string ] : string [ ] }
15
15
assigneeGroups : { [ key : string ] : string [ ] }
16
+ reviewersInTeams : string [ ]
17
+ }
18
+
19
+ export async function getTeamMembers (
20
+ context : Context ,
21
+ { org, teamSlug } : { org : string ; teamSlug : string }
22
+ ) : Promise < string [ ] > {
23
+ let members : { login : string } [ ] = [ ]
24
+
25
+ try {
26
+ members = (
27
+ await context . github . teams . listMembersInOrg ( {
28
+ org,
29
+ // eslint-disable-next-line @typescript-eslint/camelcase
30
+ team_slug : teamSlug
31
+ } )
32
+ ) . data
33
+ } catch ( error ) {
34
+ context . log ( error )
35
+ }
36
+
37
+ if ( members . length === 0 ) {
38
+ let team
39
+
40
+ try {
41
+ team = (
42
+ await context . github . teams . getByName ( {
43
+ org,
44
+ // eslint-disable-next-line @typescript-eslint/camelcase
45
+ team_slug : teamSlug
46
+ } )
47
+ ) . data
48
+ } catch ( error ) {
49
+ context . log ( error )
50
+ throw new Error (
51
+ `Cannot fetch team id for team ${ teamSlug } under organisation ${ org } .`
52
+ )
53
+ }
54
+
55
+ try {
56
+ members = (
57
+ await context . github . teams . listMembersLegacy ( {
58
+ // eslint-disable-next-line @typescript-eslint/camelcase
59
+ team_id : team . id
60
+ } )
61
+ ) . data
62
+ } catch ( error ) {
63
+ context . log ( error )
64
+ throw new Error (
65
+ `Cannot fetch list of members in team ${ teamSlug } under organisation ${ org } .`
66
+ )
67
+ }
68
+ }
69
+
70
+ return members . map ( ( member ) : string => member . login )
16
71
}
17
72
18
73
export async function handlePullRequest ( context : Context ) : Promise < void > {
@@ -30,7 +85,8 @@ export async function handlePullRequest(context: Context): Promise<void> {
30
85
useAssigneeGroups,
31
86
assigneeGroups,
32
87
addReviewers,
33
- addAssignees
88
+ addAssignees,
89
+ reviewersInTeams
34
90
} = config
35
91
36
92
if ( skipKeywords && includesSkipKeywords ( title , skipKeywords ) ) {
@@ -54,6 +110,24 @@ export async function handlePullRequest(context: Context): Promise<void> {
54
110
)
55
111
}
56
112
113
+ if ( reviewersInTeams && reviewersInTeams . length > 0 ) {
114
+ for ( const team of reviewersInTeams ) {
115
+ const result = / ^ ( [ \w \- ] + ) \/ ( [ \w \- ] + ) $ / . exec ( team )
116
+ if ( result === null ) {
117
+ throw new Error (
118
+ 'Error in configuration file to expand a team reviewersInTeams must be a list of org/team_slug.'
119
+ )
120
+ }
121
+ const reviewers = await getTeamMembers ( context , {
122
+ org : result [ 1 ] ,
123
+ teamSlug : result [ 2 ]
124
+ } )
125
+ config . reviewers = Array . from (
126
+ new Set ( ( config . reviewers || [ ] ) . concat ( reviewers ) )
127
+ )
128
+ }
129
+ }
130
+
57
131
const owner = context . payload . pull_request . user . login
58
132
59
133
if ( addReviewers ) {
0 commit comments