Jelajahi Sumber

app: replace parsePatchFiles with parseDiffFromFile (#22270)

Brendan Allan 5 hari lalu
induk
melakukan
62bd023086
1 mengubah file dengan 42 tambahan dan 19 penghapusan
  1. 42 19
      packages/ui/src/components/session-diff.ts

+ 42 - 19
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),
   }
 }