@@ -190,14 +190,43 @@ ${COMMENT_TAG}`
190
190
} )
191
191
}
192
192
193
+ async deletePendingReview ( pullNumber : number ) {
194
+ try {
195
+ const reviews = await octokit . pulls . listReviews ( {
196
+ owner : repo . owner ,
197
+ repo : repo . repo ,
198
+ // eslint-disable-next-line camelcase
199
+ pull_number : pullNumber
200
+ } )
201
+
202
+ const pendingReview = reviews . data . find (
203
+ review => review . state === 'PENDING'
204
+ )
205
+
206
+ if ( pendingReview ) {
207
+ info (
208
+ `Deleting pending review for PR #${ pullNumber } id: ${ pendingReview . id } `
209
+ )
210
+ try {
211
+ await octokit . pulls . deletePendingReview ( {
212
+ owner : repo . owner ,
213
+ repo : repo . repo ,
214
+ // eslint-disable-next-line camelcase
215
+ pull_number : pullNumber ,
216
+ // eslint-disable-next-line camelcase
217
+ review_id : pendingReview . id
218
+ } )
219
+ } catch ( e ) {
220
+ warning ( `Failed to delete pending review: ${ e } ` )
221
+ }
222
+ }
223
+ } catch ( e ) {
224
+ warning ( `Failed to list reviews: ${ e } ` )
225
+ }
226
+ }
227
+
193
228
async submitReview ( pullNumber : number , commitId : string ) {
194
- info (
195
- `Submitting review for PR #${ pullNumber } , total comments: ${ this . reviewCommentsBuffer . length } `
196
- )
197
- let commentCounter = 0
198
229
for ( const comment of this . reviewCommentsBuffer ) {
199
- info ( `Posting comment: ${ comment . message } ` )
200
- let found = false
201
230
const comments = await this . getCommentsAtRange (
202
231
pullNumber ,
203
232
comment . path ,
@@ -207,25 +236,74 @@ ${COMMENT_TAG}`
207
236
for ( const c of comments ) {
208
237
if ( c . body . includes ( COMMENT_TAG ) ) {
209
238
info (
210
- `Updating review comment for ${ comment . path } :${ comment . startLine } -${ comment . endLine } : ${ comment . message } `
239
+ `Deleting review comment for ${ comment . path } :${ comment . startLine } -${ comment . endLine } : ${ comment . message } `
211
240
)
212
241
try {
213
- await octokit . pulls . updateReviewComment ( {
242
+ await octokit . pulls . deleteReviewComment ( {
214
243
owner : repo . owner ,
215
244
repo : repo . repo ,
216
245
// eslint-disable-next-line camelcase
217
- comment_id : c . id ,
218
- body : comment . message
246
+ comment_id : c . id
219
247
} )
220
248
} catch ( e ) {
221
- warning ( `Failed to update review comment: ${ e } ` )
249
+ warning ( `Failed to delete review comment: ${ e } ` )
222
250
}
223
- found = true
224
- break
225
251
}
226
252
}
253
+ }
254
+
255
+ await this . deletePendingReview ( pullNumber )
256
+
257
+ const generateCommentData = ( comment : any ) => {
258
+ const commentData : any = {
259
+ path : comment . path ,
260
+ body : comment . message ,
261
+ line : comment . endLine
262
+ }
263
+
264
+ if ( comment . startLine !== comment . endLine ) {
265
+ // eslint-disable-next-line camelcase
266
+ commentData . start_line = comment . startLine
267
+ // eslint-disable-next-line camelcase
268
+ commentData . start_side = 'RIGHT'
269
+ }
270
+
271
+ return commentData
272
+ }
227
273
228
- if ( ! found ) {
274
+ try {
275
+ const review = await octokit . pulls . createReview ( {
276
+ owner : repo . owner ,
277
+ repo : repo . repo ,
278
+ // eslint-disable-next-line camelcase
279
+ pull_number : pullNumber ,
280
+ // eslint-disable-next-line camelcase
281
+ commit_id : commitId ,
282
+ comments : this . reviewCommentsBuffer . map ( comment =>
283
+ generateCommentData ( comment )
284
+ )
285
+ } )
286
+
287
+ info (
288
+ `Submitting review for PR #${ pullNumber } , total comments: ${ this . reviewCommentsBuffer . length } , review id: ${ review . data . id } `
289
+ )
290
+
291
+ await octokit . pulls . submitReview ( {
292
+ owner : repo . owner ,
293
+ repo : repo . repo ,
294
+ // eslint-disable-next-line camelcase
295
+ pull_number : pullNumber ,
296
+ // eslint-disable-next-line camelcase
297
+ review_id : review . data . id ,
298
+ event : 'COMMENT'
299
+ } )
300
+ } catch ( e ) {
301
+ warning (
302
+ `Failed to create review: ${ e } . Falling back to individual comments.`
303
+ )
304
+ await this . deletePendingReview ( pullNumber )
305
+ let commentCounter = 0
306
+ for ( const comment of this . reviewCommentsBuffer ) {
229
307
info (
230
308
`Creating new review comment for ${ comment . path } :${ comment . startLine } -${ comment . endLine } : ${ comment . message } `
231
309
)
@@ -236,28 +314,20 @@ ${COMMENT_TAG}`
236
314
pull_number : pullNumber ,
237
315
// eslint-disable-next-line camelcase
238
316
commit_id : commitId ,
239
- body : comment . message ,
240
- path : comment . path ,
241
- line : comment . endLine
317
+ ...generateCommentData ( comment )
242
318
}
243
319
244
- if ( comment . startLine !== comment . endLine ) {
245
- // eslint-disable-next-line camelcase
246
- commentData . start_side = 'RIGHT'
247
- // eslint-disable-next-line camelcase
248
- commentData . start_line = comment . startLine
249
- }
250
320
try {
251
321
await octokit . pulls . createReviewComment ( commentData )
252
- } catch ( e ) {
253
- warning ( `Failed to create review comment: ${ e } ` )
322
+ } catch ( ee ) {
323
+ warning ( `Failed to create review comment: ${ ee } ` )
254
324
}
255
- }
256
325
257
- commentCounter ++
258
- info (
259
- `Comment ${ commentCounter } /${ this . reviewCommentsBuffer . length } posted`
260
- )
326
+ commentCounter ++
327
+ info (
328
+ `Comment ${ commentCounter } /${ this . reviewCommentsBuffer . length } posted`
329
+ )
330
+ }
261
331
}
262
332
}
263
333
@@ -483,7 +553,7 @@ ${chain}
483
553
484
554
async create ( body : string , target : number ) {
485
555
try {
486
- // get commend ID from the response
556
+ // get comment ID from the response
487
557
await octokit . issues . createComment ( {
488
558
owner : repo . owner ,
489
559
repo : repo . repo ,
0 commit comments