summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax <[email protected]>2026-04-16 22:25:43 -0400
committerGitHub <[email protected]>2026-04-16 22:25:43 -0400
commitee708040f6c21b6779ed3d0795928a56a78b8416 (patch)
treed3f20e21a0289b144181df6d8946bba146616247
parent61c4815a372e28518fb0761ea4e53849b94d20b0 (diff)
downloadopencode-ee708040f6c21b6779ed3d0795928a56a78b8416.tar.gz
opencode-ee708040f6c21b6779ed3d0795928a56a78b8416.zip
fix: prefer real undo filenames over /dev/null (#23006)
-rw-r--r--packages/opencode/src/cli/cmd/tui/routes/session/index.tsx28
-rw-r--r--packages/opencode/src/cli/cmd/tui/util/revert-diff.ts24
-rw-r--r--packages/opencode/test/cli/tui/revert-diff.test.ts35
3 files changed, 61 insertions, 26 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
index b0514bf1b..7c40e6c3c 100644
--- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
@@ -54,7 +54,6 @@ import { useSDK } from "@tui/context/sdk"
import { useCommandDialog } from "@tui/component/dialog-command"
import type { DialogContext } from "@tui/ui/dialog"
import { useKeybind } from "@tui/context/keybind"
-import { parsePatch } from "diff"
import { useDialog } from "../../ui/dialog"
import { TodoItem } from "../../component/todo-item"
import { DialogMessage } from "./dialog-message"
@@ -88,6 +87,7 @@ import { getScrollAcceleration } from "../../util/scroll"
import { TuiPluginRuntime } from "../../plugin"
import { DialogGoUpsell } from "../../component/dialog-go-upsell"
import { SessionRetry } from "@/session/retry"
+import { getRevertDiffFiles } from "../../util/revert-diff"
addDefaultParsers(parsers.parsers)
@@ -991,31 +991,7 @@ export function Session() {
const revertInfo = createMemo(() => session()?.revert)
const revertMessageID = createMemo(() => revertInfo()?.messageID)
- const revertDiffFiles = createMemo(() => {
- const diffText = revertInfo()?.diff ?? ""
- if (!diffText) return []
-
- try {
- const patches = parsePatch(diffText)
- return patches.map((patch) => {
- const filename = patch.newFileName || patch.oldFileName || "unknown"
- const cleanFilename = filename.replace(/^[ab]\//, "")
- return {
- filename: cleanFilename,
- additions: patch.hunks.reduce(
- (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
- 0,
- ),
- deletions: patch.hunks.reduce(
- (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
- 0,
- ),
- }
- })
- } catch {
- return []
- }
- })
+ const revertDiffFiles = createMemo(() => getRevertDiffFiles(revertInfo()?.diff ?? ""))
const revertRevertedMessages = createMemo(() => {
const messageID = revertMessageID()
diff --git a/packages/opencode/src/cli/cmd/tui/util/revert-diff.ts b/packages/opencode/src/cli/cmd/tui/util/revert-diff.ts
new file mode 100644
index 000000000..cd7be0c8d
--- /dev/null
+++ b/packages/opencode/src/cli/cmd/tui/util/revert-diff.ts
@@ -0,0 +1,24 @@
+import { parsePatch } from "diff"
+
+export function getRevertDiffFiles(diffText: string) {
+ if (!diffText) return []
+
+ try {
+ return parsePatch(diffText).map((patch) => {
+ const filename = [patch.newFileName, patch.oldFileName].find((item) => item && item !== "/dev/null") ?? "unknown"
+ return {
+ filename: filename.replace(/^[ab]\//, ""),
+ additions: patch.hunks.reduce(
+ (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
+ 0,
+ ),
+ deletions: patch.hunks.reduce(
+ (sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
+ 0,
+ ),
+ }
+ })
+ } catch {
+ return []
+ }
+}
diff --git a/packages/opencode/test/cli/tui/revert-diff.test.ts b/packages/opencode/test/cli/tui/revert-diff.test.ts
new file mode 100644
index 000000000..6d496396e
--- /dev/null
+++ b/packages/opencode/test/cli/tui/revert-diff.test.ts
@@ -0,0 +1,35 @@
+import { describe, expect, test } from "bun:test"
+import { getRevertDiffFiles } from "../../../src/cli/cmd/tui/util/revert-diff"
+
+describe("revert diff", () => {
+ test("prefers the actual file path over /dev/null for added and deleted files", () => {
+ const files = getRevertDiffFiles(`diff --git a/new.txt b/new.txt
+new file mode 100644
+index 0000000..3b18e51
+--- /dev/null
++++ b/new.txt
+@@ -0,0 +1 @@
++new content
+diff --git a/old.txt b/old.txt
+deleted file mode 100644
+index 3b18e51..0000000
+--- a/old.txt
++++ /dev/null
+@@ -1 +0,0 @@
+-old content
+`)
+
+ expect(files).toEqual([
+ {
+ filename: "new.txt",
+ additions: 1,
+ deletions: 0,
+ },
+ {
+ filename: "old.txt",
+ additions: 0,
+ deletions: 1,
+ },
+ ])
+ })
+})