From d5d2e5b58e8cc5f1e89c7e0b1c4682cd563e2cb6 Mon Sep 17 00:00:00 2001 From: wolfy Date: Sun, 31 May 2026 01:59:28 -0500 Subject: [PATCH] fix: get diffs properly --- mcp/checkout.ts | 37 +++++++++++++++++++++++++++++-------- mcp/review.ts | 18 +++++++++--------- 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/mcp/checkout.ts b/mcp/checkout.ts index 97829f2..1851595 100644 --- a/mcp/checkout.ts +++ b/mcp/checkout.ts @@ -27,6 +27,28 @@ export type DiffFile = { patch?: string | undefined; }; +/** + * Parse raw `git diff` output into per-file DiffFile objects. + * Used as a fallback when the Gitea API doesn't return patch data. + */ +export function parseDiffToFiles(rawDiff: string): DiffFile[] { + const files: DiffFile[] = []; + const parts = rawDiff.split(/^(?=diff --git )/m); + for (const part of parts) { + if (!part.trim()) continue; + const headerMatch = part.match(/^diff --git a\/.+ b\/(.+)\n/); + if (!headerMatch) continue; + const filename = headerMatch[1].trim(); + const patchStart = part.indexOf("\n@@"); + if (patchStart === -1) { + files.push({ filename }); + } else { + files.push({ filename, patch: part.slice(patchStart + 1) }); + } + } + return files; +} + export function formatFilesWithLineNumbers(files: DiffFile[]): FormatFilesResult { const output: string[] = []; const tocEntries: Array<{ filename: string; startLine: number; endLine: number }> = []; @@ -136,14 +158,13 @@ export async function fetchAndFormatPrDiff( ctx: ToolContext, pullNumber: number ): Promise { - const r = await ctx.gitea.request( - "GET /repos/{owner}/{repo}/pulls/{index}/files", - { owner: ctx.repo.owner, repo: ctx.repo.name, index: pullNumber, limit: 50 } - ); - const files: DiffFile[] = (r.data as Array<{ filename?: string; patch?: string }>).map((f) => ({ - filename: f.filename, - patch: f.patch, - })); + const r = await ctx.gitea.rest.repository.repoDownloadPullDiffOrPatch({ + owner: ctx.repo.owner, + repo: ctx.repo.name, + index: pullNumber, + diffType: "diff", + }); + const files = parseDiffToFiles(r.data); return { ...formatFilesWithLineNumbers(files), files }; } diff --git a/mcp/review.ts b/mcp/review.ts index 244f276..42983cd 100644 --- a/mcp/review.ts +++ b/mcp/review.ts @@ -11,6 +11,7 @@ import { import { fixDoubleEscapedString } from "../utils/fixDoubleEscapedString.ts"; import type { ChangedFileWithPatch } from "../utils/gitea.ts"; import { retry } from "../utils/retry.ts"; +import { parseDiffToFiles } from "./checkout.ts"; import { deleteProgressComment } from "./comment.ts"; import type { ToolContext } from "./server.ts"; import { execute, tool } from "./shared.ts"; @@ -62,17 +63,16 @@ export async function buildCommentableMap( const currentSha = ctx.toolState.checkoutSha; if (cached && cachedFor === pullNumber && cachedSha && cachedSha === currentSha) return cached; - const r = await ctx.gitea.request( - "GET /repos/{owner}/{repo}/pulls/{index}/files", - { owner: ctx.repo.owner, repo: ctx.repo.name, index: pullNumber, limit: 50 } - ); - const files = r.data as ChangedFileWithPatch[]; - + const r = await ctx.gitea.rest.repository.repoDownloadPullDiffOrPatch({ + owner: ctx.repo.owner, + repo: ctx.repo.name, + index: pullNumber, + diffType: "diff", + }); + const files = parseDiffToFiles(r.data); const map = new Map(); for (const file of files) { - if (file.filename) { - map.set(file.filename, commentableLinesForFile(file.patch)); - } + if (file.filename) map.set(file.filename, commentableLinesForFile(file.patch)); } return map; }