| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  | import {GithubPullRequests, PullRequest} from '../common/github-pull-requests'; | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | import {GithubTeams} from '../common/github-teams'; | 
					
						
							|  |  |  | import {assertNotMissingOrEmpty} from '../common/utils'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  | /** | 
					
						
							|  |  |  |  * A helper to verify whether builds are trusted. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | export class BuildVerifier { | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Construct a new BuildVerifier instance. | 
					
						
							|  |  |  |    * @param prs A helper to access PR information. | 
					
						
							|  |  |  |    * @param teams A helper to access Github team information. | 
					
						
							|  |  |  |    * @param allowedTeamSlugs The teams that are trusted. | 
					
						
							|  |  |  |    * @param trustedPrLabel The github label that indicates that a PR is trusted. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   constructor(protected prs: GithubPullRequests, protected teams: GithubTeams, | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |               protected allowedTeamSlugs: string[], protected trustedPrLabel: string) { | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |     assertNotMissingOrEmpty('allowedTeamSlugs', allowedTeamSlugs && allowedTeamSlugs.join('')); | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     assertNotMissingOrEmpty('trustedPrLabel', trustedPrLabel); | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Check whether a PR contains files that are significant to the build. | 
					
						
							|  |  |  |    * @param pr The number of the PR to check | 
					
						
							|  |  |  |    * @param significantFilePattern A regex that selects files that are significant. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-08-10 11:10:22 +01:00
										 |  |  |   public async getSignificantFilesChanged(pr: number, significantFilePattern: RegExp): Promise<boolean> { | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |     const files = await this.prs.fetchFiles(pr); | 
					
						
							|  |  |  |     return files.some(file => significantFilePattern.test(file.filename)); | 
					
						
							| 
									
										
										
										
											2017-03-07 11:39:37 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-10 13:56:07 +01:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Check whether a PR is trusted. | 
					
						
							|  |  |  |    * @param pr The number of the PR to check. | 
					
						
							|  |  |  |    * @returns true if the PR is trusted. | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   public async getPrIsTrusted(pr: number): Promise<boolean> { | 
					
						
							|  |  |  |     const prInfo = await this.prs.fetch(pr); | 
					
						
							|  |  |  |     return this.hasLabel(prInfo, this.trustedPrLabel) || | 
					
						
							|  |  |  |            (await this.teams.isMemberBySlug(prInfo.user.login, this.allowedTeamSlugs)); | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-10 11:10:22 +01:00
										 |  |  |   protected hasLabel(prInfo: PullRequest, label: string): boolean { | 
					
						
							| 
									
										
										
										
											2017-06-19 01:15:07 +03:00
										 |  |  |     return prInfo.labels.some(labelObj => labelObj.name === label); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-02-28 21:02:56 +02:00
										 |  |  | } |