Skip to content
This repository was archived by the owner on Mar 6, 2024. It is now read-only.

Commit 4272915

Browse files
authored
Use GitHub Review API for comments (#373)
<!-- This is an auto-generated comment: release notes by openai --> ### Summary by OpenAI ``` **New Feature** - Added support for GitHub Review API in comments. - Introduced a new method `deletePendingReview` to delete pending reviews. - Enhanced `submitReview` method to handle review comments and create reviews. - Updated logic for deleting and updating review comments. - Reduced `maxRetries` value from 10 to 3 for improved performance. > 🎉 Here's to the code that now gleams, > With reviews flowing like streams. > Deleting, updating, no more waiting, > For our efficiency, it seems. 🚀 > Max retries cut down in size, > Oh, how time flies! 🕰️ > Celebrate this PR's rise, > To the occasion, it truly ties. 🎈 ``` <!-- end of auto-generated comment: release notes by openai -->
1 parent e7d9633 commit 4272915

File tree

3 files changed

+185
-59
lines changed

3 files changed

+185
-59
lines changed

dist/index.js

Lines changed: 83 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/commenter.ts

Lines changed: 101 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,43 @@ ${COMMENT_TAG}`
190190
})
191191
}
192192

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+
193228
async submitReview(pullNumber: number, commitId: string) {
194-
info(
195-
`Submitting review for PR #${pullNumber}, total comments: ${this.reviewCommentsBuffer.length}`
196-
)
197-
let commentCounter = 0
198229
for (const comment of this.reviewCommentsBuffer) {
199-
info(`Posting comment: ${comment.message}`)
200-
let found = false
201230
const comments = await this.getCommentsAtRange(
202231
pullNumber,
203232
comment.path,
@@ -207,25 +236,74 @@ ${COMMENT_TAG}`
207236
for (const c of comments) {
208237
if (c.body.includes(COMMENT_TAG)) {
209238
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}`
211240
)
212241
try {
213-
await octokit.pulls.updateReviewComment({
242+
await octokit.pulls.deleteReviewComment({
214243
owner: repo.owner,
215244
repo: repo.repo,
216245
// eslint-disable-next-line camelcase
217-
comment_id: c.id,
218-
body: comment.message
246+
comment_id: c.id
219247
})
220248
} catch (e) {
221-
warning(`Failed to update review comment: ${e}`)
249+
warning(`Failed to delete review comment: ${e}`)
222250
}
223-
found = true
224-
break
225251
}
226252
}
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+
}
227273

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) {
229307
info(
230308
`Creating new review comment for ${comment.path}:${comment.startLine}-${comment.endLine}: ${comment.message}`
231309
)
@@ -236,28 +314,20 @@ ${COMMENT_TAG}`
236314
pull_number: pullNumber,
237315
// eslint-disable-next-line camelcase
238316
commit_id: commitId,
239-
body: comment.message,
240-
path: comment.path,
241-
line: comment.endLine
317+
...generateCommentData(comment)
242318
}
243319

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-
}
250320
try {
251321
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}`)
254324
}
255-
}
256325

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+
}
261331
}
262332
}
263333

@@ -483,7 +553,7 @@ ${chain}
483553

484554
async create(body: string, target: number) {
485555
try {
486-
// get commend ID from the response
556+
// get comment ID from the response
487557
await octokit.issues.createComment({
488558
owner: repo.owner,
489559
repo: repo.repo,

src/octokit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,6 @@ Retry count: ${retryCount}
3333
},
3434
retry: {
3535
doNotRetry: ['429'],
36-
maxRetries: 10
36+
maxRetries: 3
3737
}
3838
})

0 commit comments

Comments
 (0)