fix: get diffs properly

This commit is contained in:
2026-05-31 01:59:28 -05:00
parent 0438688e32
commit d5d2e5b58e
2 changed files with 38 additions and 17 deletions
+29 -8
View File
@@ -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<FetchAndFormatPrDiffResult> {
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 };
}