@@ -27,6 +27,7 @@ const WAIT_TIME_SINGLE_APPROVAL = 24 * 7;
27
27
const GITHUB_SUCCESS_CONCLUSIONS = [ 'SUCCESS' , 'NEUTRAL' , 'SKIPPED' ] ;
28
28
29
29
const FAST_TRACK_RE = / ^ F a s t - t r a c k h a s b e e n r e q u e s t e d b y @ ( .+ ?) \. P l e a s e 👍 t o a p p r o v e \. $ / ;
30
+ const FAST_TRACK_MIN_APPROVALS = 2 ;
30
31
const GIT_CONFIG_GUIDE_URL = 'https://github.com/nodejs/node/blob/99b1ada/doc/guides/contributing/pull-requests.md#step-1-fork' ;
31
32
32
33
export default class PRChecker {
@@ -138,7 +139,7 @@ export default class PRChecker {
138
139
const { requestedChanges, approved } = reviewers ;
139
140
const labels = pr . labels . nodes . map ( ( l ) => l . name ) ;
140
141
141
- const isFastTracked = labels . includes ( 'fast-track' ) ;
142
+ let isFastTracked = labels . includes ( 'fast-track' ) ;
142
143
const isCodeAndLearn = labels . includes ( 'code-and-learn' ) ;
143
144
const isSemverMajor = labels . includes ( 'semver-major' ) ;
144
145
@@ -168,6 +169,7 @@ export default class PRChecker {
168
169
}
169
170
}
170
171
172
+ let fastTrackAppendix = '' ;
171
173
if ( isFastTracked ) {
172
174
const comment = [ ...this . comments ] . reverse ( ) . find ( ( c ) =>
173
175
FAST_TRACK_RE . test ( c . bodyText ) ) ;
@@ -183,14 +185,15 @@ export default class PRChecker {
183
185
r . user . login !== pr . author . login &&
184
186
collaborators . includes ( r . user . login . toLowerCase ( ) ) ) . length ;
185
187
186
- if ( requester === pr . author . login && approvals < 2 ) {
187
- cli . error ( 'The fast-track request requires' +
188
- " at least two collaborators' approvals (👍)." ) ;
189
- return false ;
190
- } else if ( approvals === 0 ) {
191
- cli . error ( 'The fast-track request requires' +
192
- " at least one collaborator's approval (👍)." ) ;
193
- return false ;
188
+ const missingFastTrackApprovals = FAST_TRACK_MIN_APPROVALS - approvals -
189
+ ( requester === pr . author . login ? 0 : 1 ) ;
190
+ if ( missingFastTrackApprovals > 0 ) {
191
+ isFastTracked = false ;
192
+ fastTrackAppendix = ' (or 0 hours if there ' +
193
+ `${ missingFastTrackApprovals === 1 ? 'is' : 'are' } ` +
194
+ `${ missingFastTrackApprovals } more approval` +
195
+ `${ missingFastTrackApprovals === 1 ? '' : 's' } (👍) of ` +
196
+ 'the fast-track request from collaborators).' ;
194
197
}
195
198
}
196
199
@@ -211,10 +214,12 @@ export default class PRChecker {
211
214
if ( timeLeftMulti === 0 ) {
212
215
const timeLeftMins =
213
216
this . waitTimeMultiApproval * 60 - minutesFromCreateTime ;
214
- cli . error ( `This PR needs to wait ${ timeLeftMins } more minutes to land` ) ;
217
+ cli . error ( `This PR needs to wait ${ timeLeftMins } ` +
218
+ `more minutes to land${ fastTrackAppendix } ` ) ;
215
219
return false ;
216
220
}
217
- cli . error ( `This PR needs to wait ${ timeLeftMulti } more hours to land` ) ;
221
+ cli . error ( `This PR needs to wait ${ timeLeftMulti } more ` +
222
+ `hours to land${ fastTrackAppendix } ` ) ;
218
223
return false ;
219
224
}
220
225
@@ -224,7 +229,8 @@ export default class PRChecker {
224
229
}
225
230
timeLeftMulti = timeLeftMulti < 0 || isFastTracked ? 0 : timeLeftMulti ;
226
231
cli . error ( `This PR needs to wait ${ timeLeftSingle } more hours to land ` +
227
- `(or ${ timeLeftMulti } hours if there is one more approval)` ) ;
232
+ `(or ${ timeLeftMulti } hours if there is one more approval)` +
233
+ fastTrackAppendix ) ;
228
234
return false ;
229
235
}
230
236
}
0 commit comments