@@ -239,13 +239,23 @@ class Actor {
239
239
function getFilesNotOwnedByCodeOwner ( owner , files , cwd ) {
240
240
const filesWhichArentOwned = [ ]
241
241
const codeowners = new Codeowners ( cwd ) ;
242
+ const octokit = getOctokit ( process . env . GITHUB_TOKEN )
242
243
243
244
for ( const file of files ) {
244
245
const relative = file . startsWith ( "/" ) ? file . slice ( 1 ) : file
245
246
let owners = codeowners . getOwner ( relative ) ;
246
- if ( ! owners . includes ( owner ) ) {
247
- filesWhichArentOwned . push ( file )
247
+ if ( owners . includes ( owner ) ) {
248
+ continue
249
+ }
250
+
251
+ if ( owners
252
+ . filter ( owner => owner . startsWith ( "@" ) )
253
+ . some ( teamowner => getTeamMembers ( octokit , teamowner ) . then ( result => result . includes ( owner ) ) )
254
+ ) {
255
+ continue
248
256
}
257
+
258
+ filesWhichArentOwned . push ( file )
249
259
}
250
260
251
261
return filesWhichArentOwned
@@ -263,7 +273,21 @@ function getFilesNotOwnedByCodeOwner(owner, files, cwd) {
263
273
const codeowners = new Codeowners ( cwd ) ;
264
274
const contents = readFileSync ( codeowners . codeownersFilePath , "utf8" ) . toLowerCase ( )
265
275
266
- return contents . includes ( "@" + login . toLowerCase ( ) + " " ) || contents . includes ( "@" + login . toLowerCase ( ) + "\n" )
276
+ if ( contents . includes ( "@" + login . toLowerCase ( ) + " " ) || contents . includes ( "@" + login . toLowerCase ( ) + "\n" ) ) {
277
+ return true
278
+ }
279
+
280
+ const regex = / \@ [ a - z A - Z 0 - 9 ] + \/ [ a - z A - Z 0 - 9 ] + / g;
281
+ const potentialTeams = contents . match ( regex ) ;
282
+ if ( potentialTeams == null || potentialTeams . length == 0 ) {
283
+ return false
284
+ }
285
+
286
+ const octokit = getOctokit ( process . env . GITHUB_TOKEN )
287
+
288
+ return potentialTeams . some ( team =>
289
+ getTeamMembers ( octokit , team . replace ( " " , "" ) ) . then ( result => result . includes ( login . toLowerCase ( ) ) )
290
+ )
267
291
}
268
292
269
293
@@ -314,6 +338,12 @@ async function getPRChangedFiles(octokit, repoDeets, prNumber) {
314
338
return fileStrings
315
339
}
316
340
341
+ async function getTeamMembers ( octokit , teamname ) {
342
+ const components = teamname . replace ( "@" , "" ) . split ( "/" )
343
+ const teamMembers = await octokit . paginate ( 'GET /orgs/:org/teams/:team/members' , { org : components [ 0 ] , team : components [ 1 ] } )
344
+ return teamMembers . map ( teammember => teammember . login )
345
+ }
346
+
317
347
async function createOrAddLabel ( octokit , repoDeets , labelConfig ) {
318
348
let label = null
319
349
const existingLabels = await octokit . paginate ( 'GET /repos/:owner/:repo/labels' , { owner : repoDeets . owner , repo : repoDeets . repo } )
0 commit comments