diff --git a/packages/ui/src/components/session-diff.ts b/packages/ui/src/components/session-diff.ts index cc2b1ce527..d791c7fc10 100644 --- a/packages/ui/src/components/session-diff.ts +++ b/packages/ui/src/components/session-diff.ts @@ -1,6 +1,5 @@ -import { parsePatchFiles, type FileDiffMetadata } from "@pierre/diffs" -import { sampledChecksum } from "@opencode-ai/util/encode" -import { formatPatch, structuredPatch } from "diff" +import { parseDiffFromFile, type FileDiffMetadata } from "@pierre/diffs" +import { formatPatch, parsePatch, structuredPatch } from "diff" import type { SnapshotFileDiff, VcsFileDiff } from "@opencode-ai/sdk/v2" type LegacyDiff = { @@ -41,26 +40,50 @@ function empty(file: string, key: string) { } function patch(diff: ReviewDiff) { - if (typeof diff.patch === "string") return diff.patch - return formatPatch( - structuredPatch( - diff.file, - diff.file, - "before" in diff && typeof diff.before === "string" ? diff.before : "", - "after" in diff && typeof diff.after === "string" ? diff.after : "", - "", - "", - { context: Number.MAX_SAFE_INTEGER }, + if (typeof diff.patch === "string") { + const [patch] = parsePatch(diff.patch) + + const beforeLines = [] + const afterLines = [] + + for (const hunk of patch.hunks) { + for (const line of hunk.lines) { + if (line.startsWith("-")) { + beforeLines.push(line.slice(1)) + } else if (line.startsWith("+")) { + afterLines.push(line.slice(1)) + } else { + // context line (starts with ' ') + beforeLines.push(line.slice(1)) + afterLines.push(line.slice(1)) + } + } + } + + return { before: beforeLines.join("\n"), after: afterLines.join("\n"), patch: diff.patch } + } + return { + before: "before" in diff && typeof diff.before === "string" ? diff.before : "", + after: "after" in diff && typeof diff.after === "string" ? diff.after : "", + patch: formatPatch( + structuredPatch( + diff.file, + diff.file, + "before" in diff && typeof diff.before === "string" ? diff.before : "", + "after" in diff && typeof diff.after === "string" ? diff.after : "", + "", + "", + { context: Number.MAX_SAFE_INTEGER }, + ), ), - ) + } } -function file(file: string, patch: string) { +function file(file: string, patch: string, before: string, after: string) { const hit = cache.get(patch) if (hit) return hit - const key = sampledChecksum(patch) ?? file - const value = parsePatchFiles(patch, key).flatMap((item) => item.files)[0] ?? empty(file, key) + const value = parseDiffFromFile({ name: file, contents: before }, { name: file, contents: after }) cache.set(patch, value) return value } @@ -69,11 +92,11 @@ export function normalize(diff: ReviewDiff): ViewDiff { const next = patch(diff) return { file: diff.file, - patch: next, + patch: next.patch, additions: diff.additions, deletions: diff.deletions, status: diff.status, - fileDiff: file(diff.file, next), + fileDiff: file(diff.file, next.patch, next.before, next.after), } }