Skip to content

Commit f0e4f76

Browse files
committed
split patch to chunks
1 parent aeddba5 commit f0e4f76

2 files changed

Lines changed: 113 additions & 18 deletions

File tree

action/index.cjs

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150544,15 +150544,19 @@ const robot = (app) => {
150544150544
continue;
150545150545
}
150546150546
try {
150547-
const res = await chat?.codeReview(patch);
150548-
if (!res.lgtm && !!res.review_comment) {
150549-
const { line, side } = computeLineAndSideFromPatch(patch);
150550-
ress.push({
150551-
path: file.filename,
150552-
body: res.review_comment,
150553-
line,
150554-
side,
150555-
});
150547+
// Split patch into individual hunks (by @@ markers)
150548+
const hunks = splitPatchIntoHunks(patch);
150549+
for (const hunk of hunks) {
150550+
const res = await chat?.codeReview(hunk.content);
150551+
if (!res.lgtm && !!res.review_comment) {
150552+
const { line, side } = computeLineAndSideFromPatch(hunk.content);
150553+
ress.push({
150554+
path: file.filename,
150555+
body: res.review_comment,
150556+
line: hunk.newStart + line - 1,
150557+
side,
150558+
});
150559+
}
150556150560
}
150557150561
}
150558150562
catch (e) {
@@ -150659,6 +150663,47 @@ const computeLineAndSideFromPatch = (patch) => {
150659150663
return { line: firstDeleted, side: 'LEFT' };
150660150664
return { line: 1, side: 'RIGHT' };
150661150665
};
150666+
const splitPatchIntoHunks = (patch) => {
150667+
// Split patch into individual hunks by @@ markers
150668+
const hunks = [];
150669+
const lines = patch.split('\n');
150670+
let currentHunk = [];
150671+
let currentHeader = '';
150672+
let currentNewStart = 0;
150673+
const parseHunkHeader = (hdr) => {
150674+
const m = hdr.match(/@@\s+-\d+(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@/);
150675+
if (!m)
150676+
return 0;
150677+
return parseInt(m[1], 10);
150678+
};
150679+
for (const line of lines) {
150680+
if (line.startsWith('@@')) {
150681+
// Save previous hunk if it exists
150682+
if (currentHunk.length > 0) {
150683+
hunks.push({
150684+
header: currentHeader,
150685+
newStart: currentNewStart,
150686+
content: currentHunk.join('\n'),
150687+
});
150688+
}
150689+
currentHeader = line;
150690+
currentNewStart = parseHunkHeader(line);
150691+
currentHunk = [line];
150692+
}
150693+
else if (currentHunk.length > 0) {
150694+
currentHunk.push(line);
150695+
}
150696+
}
150697+
// Save the last hunk
150698+
if (currentHunk.length > 0) {
150699+
hunks.push({
150700+
header: currentHeader,
150701+
newStart: currentNewStart,
150702+
content: currentHunk.join('\n'),
150703+
});
150704+
}
150705+
return hunks;
150706+
};
150662150707

150663150708

150664150709
/***/ }),

src/bot.ts

Lines changed: 59 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,16 +204,22 @@ export const robot = (app: Probot) => {
204204
);
205205
continue;
206206
}
207+
207208
try {
208-
const res = await chat?.codeReview(patch);
209-
if (!res.lgtm && !!res.review_comment) {
210-
const { line, side } = computeLineAndSideFromPatch(patch);
211-
ress.push({
212-
path: file.filename,
213-
body: res.review_comment,
214-
line,
215-
side,
216-
})
209+
// Split patch into individual hunks (by @@ markers)
210+
const hunks = splitPatchIntoHunks(patch);
211+
212+
for (const hunk of hunks) {
213+
const res = await chat?.codeReview(hunk.content);
214+
if (!res.lgtm && !!res.review_comment) {
215+
const { line, side } = computeLineAndSideFromPatch(hunk.content);
216+
ress.push({
217+
path: file.filename,
218+
body: res.review_comment,
219+
line: hunk.newStart + line - 1,
220+
side,
221+
})
222+
}
217223
}
218224
} catch (e) {
219225
log.info(`review ${file.filename} failed`, e);
@@ -323,4 +329,48 @@ const computeLineAndSideFromPatch = (patch: string | undefined) => {
323329
if (firstDeleted !== null) return { line: firstDeleted, side: 'LEFT' as 'RIGHT' | 'LEFT' };
324330

325331
return { line: 1, side: 'RIGHT' as 'RIGHT' | 'LEFT' };
332+
}
333+
334+
const splitPatchIntoHunks = (patch: string): Array<{ header: string; newStart: number; content: string }> => {
335+
// Split patch into individual hunks by @@ markers
336+
const hunks: Array<{ header: string; newStart: number; content: string }> = [];
337+
const lines = patch.split('\n');
338+
let currentHunk: string[] = [];
339+
let currentHeader = '';
340+
let currentNewStart = 0;
341+
342+
const parseHunkHeader = (hdr: string) => {
343+
const m = hdr.match(/@@\s+-\d+(?:,\d+)?\s+\+(\d+)(?:,\d+)?\s+@@/);
344+
if (!m) return 0;
345+
return parseInt(m[1], 10);
346+
};
347+
348+
for (const line of lines) {
349+
if (line.startsWith('@@')) {
350+
// Save previous hunk if it exists
351+
if (currentHunk.length > 0) {
352+
hunks.push({
353+
header: currentHeader,
354+
newStart: currentNewStart,
355+
content: currentHunk.join('\n'),
356+
});
357+
}
358+
currentHeader = line;
359+
currentNewStart = parseHunkHeader(line);
360+
currentHunk = [line];
361+
} else if (currentHunk.length > 0) {
362+
currentHunk.push(line);
363+
}
364+
}
365+
366+
// Save the last hunk
367+
if (currentHunk.length > 0) {
368+
hunks.push({
369+
header: currentHeader,
370+
newStart: currentNewStart,
371+
content: currentHunk.join('\n'),
372+
});
373+
}
374+
375+
return hunks;
326376
}

0 commit comments

Comments
 (0)