@@ -13,6 +13,61 @@ export interface Config {
1313 useAssigneeGroups : boolean
1414 reviewGroups : { [ key : string ] : string [ ] }
1515 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 )
1671}
1772
1873export async function handlePullRequest ( context : Context ) : Promise < void > {
@@ -30,7 +85,8 @@ export async function handlePullRequest(context: Context): Promise<void> {
3085 useAssigneeGroups,
3186 assigneeGroups,
3287 addReviewers,
33- addAssignees
88+ addAssignees,
89+ reviewersInTeams
3490 } = config
3591
3692 if ( skipKeywords && includesSkipKeywords ( title , skipKeywords ) ) {
@@ -54,6 +110,24 @@ export async function handlePullRequest(context: Context): Promise<void> {
54110 )
55111 }
56112
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+
57131 const owner = context . payload . pull_request . user . login
58132
59133 if ( addReviewers ) {
0 commit comments