summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-04-13 17:19:14 +0800
committerGitHub <[email protected]>2026-04-13 17:19:14 +0800
commit62bd0230864910e3f32a3de54ff628a41e1b9ff9 (patch)
tree3b2df367c166872968564dcb83594f2b486ec487
parentcb1a50055c9112bf18bec20f64026a3357c0d35b (diff)
downloadopencode-62bd0230864910e3f32a3de54ff628a41e1b9ff9.tar.gz
opencode-62bd0230864910e3f32a3de54ff628a41e1b9ff9.zip
app: replace parsePatchFiles with parseDiffFromFile (#22270)
-rw-r--r--packages/ui/src/components/session-diff.ts61
1 files changed, 42 insertions, 19 deletions
diff --git a/packages/ui/src/components/session-diff.ts b/packages/ui/src/components/session-diff.ts
index cc2b1ce52..d791c7fc1 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),
}
}