Skip to content

Commit ee70804

Browse files
authored
fix: prefer real undo filenames over /dev/null (#23006)
1 parent 61c4815 commit ee70804

3 files changed

Lines changed: 61 additions & 26 deletions

File tree

packages/opencode/src/cli/cmd/tui/routes/session/index.tsx

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ import { useSDK } from "@tui/context/sdk"
5454
import { useCommandDialog } from "@tui/component/dialog-command"
5555
import type { DialogContext } from "@tui/ui/dialog"
5656
import { useKeybind } from "@tui/context/keybind"
57-
import { parsePatch } from "diff"
5857
import { useDialog } from "../../ui/dialog"
5958
import { TodoItem } from "../../component/todo-item"
6059
import { DialogMessage } from "./dialog-message"
@@ -88,6 +87,7 @@ import { getScrollAcceleration } from "../../util/scroll"
8887
import { TuiPluginRuntime } from "../../plugin"
8988
import { DialogGoUpsell } from "../../component/dialog-go-upsell"
9089
import { SessionRetry } from "@/session/retry"
90+
import { getRevertDiffFiles } from "../../util/revert-diff"
9191

9292
addDefaultParsers(parsers.parsers)
9393

@@ -991,31 +991,7 @@ export function Session() {
991991
const revertInfo = createMemo(() => session()?.revert)
992992
const revertMessageID = createMemo(() => revertInfo()?.messageID)
993993

994-
const revertDiffFiles = createMemo(() => {
995-
const diffText = revertInfo()?.diff ?? ""
996-
if (!diffText) return []
997-
998-
try {
999-
const patches = parsePatch(diffText)
1000-
return patches.map((patch) => {
1001-
const filename = patch.newFileName || patch.oldFileName || "unknown"
1002-
const cleanFilename = filename.replace(/^[ab]\//, "")
1003-
return {
1004-
filename: cleanFilename,
1005-
additions: patch.hunks.reduce(
1006-
(sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
1007-
0,
1008-
),
1009-
deletions: patch.hunks.reduce(
1010-
(sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
1011-
0,
1012-
),
1013-
}
1014-
})
1015-
} catch {
1016-
return []
1017-
}
1018-
})
994+
const revertDiffFiles = createMemo(() => getRevertDiffFiles(revertInfo()?.diff ?? ""))
1019995

1020996
const revertRevertedMessages = createMemo(() => {
1021997
const messageID = revertMessageID()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { parsePatch } from "diff"
2+
3+
export function getRevertDiffFiles(diffText: string) {
4+
if (!diffText) return []
5+
6+
try {
7+
return parsePatch(diffText).map((patch) => {
8+
const filename = [patch.newFileName, patch.oldFileName].find((item) => item && item !== "/dev/null") ?? "unknown"
9+
return {
10+
filename: filename.replace(/^[ab]\//, ""),
11+
additions: patch.hunks.reduce(
12+
(sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("+")).length,
13+
0,
14+
),
15+
deletions: patch.hunks.reduce(
16+
(sum, hunk) => sum + hunk.lines.filter((line) => line.startsWith("-")).length,
17+
0,
18+
),
19+
}
20+
})
21+
} catch {
22+
return []
23+
}
24+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { describe, expect, test } from "bun:test"
2+
import { getRevertDiffFiles } from "../../../src/cli/cmd/tui/util/revert-diff"
3+
4+
describe("revert diff", () => {
5+
test("prefers the actual file path over /dev/null for added and deleted files", () => {
6+
const files = getRevertDiffFiles(`diff --git a/new.txt b/new.txt
7+
new file mode 100644
8+
index 0000000..3b18e51
9+
--- /dev/null
10+
+++ b/new.txt
11+
@@ -0,0 +1 @@
12+
+new content
13+
diff --git a/old.txt b/old.txt
14+
deleted file mode 100644
15+
index 3b18e51..0000000
16+
--- a/old.txt
17+
+++ /dev/null
18+
@@ -1 +0,0 @@
19+
-old content
20+
`)
21+
22+
expect(files).toEqual([
23+
{
24+
filename: "new.txt",
25+
additions: 1,
26+
deletions: 0,
27+
},
28+
{
29+
filename: "old.txt",
30+
additions: 0,
31+
deletions: 1,
32+
},
33+
])
34+
})
35+
})

0 commit comments

Comments
 (0)