Skip to content

Commit 97786af

Browse files
refactor(core): share file diff construction (#39586)
Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com>
1 parent b1a5e8a commit 97786af

3 files changed

Lines changed: 30 additions & 31 deletions

File tree

packages/core/src/tool/plugin/edit.ts

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin
1010
import { ToolFailure } from "@opencode-ai/ai"
1111
import { FileDiff } from "@opencode-ai/schema/file-diff"
1212
import { Bom } from "@opencode-ai/util/bom"
13-
import { createTwoFilesPatch, diffLines } from "diff"
1413
import { Effect, Schema } from "effect"
1514
import { FileMutation } from "../../file-mutation"
1615
import { Formatter } from "../../formatter"
1716
import { FSUtil } from "@opencode-ai/util/fs-util"
1817
import { LocationMutation } from "../../location-mutation"
1918
import { Permission } from "../../permission"
19+
import { fileDiff } from "./file-diff"
2020

2121
export const name = "edit"
2222

@@ -238,19 +238,3 @@ export const Plugin = {
238238
.pipe(Effect.orDie)
239239
}),
240240
}
241-
242-
function fileDiff(file: string, before: string, after: string): typeof FileDiff.Info.Type {
243-
const counts = diffLines(before, after).reduce(
244-
(result, item) => ({
245-
additions: result.additions + (item.added ? (item.count ?? 0) : 0),
246-
deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0),
247-
}),
248-
{ additions: 0, deletions: 0 },
249-
)
250-
return {
251-
file,
252-
patch: createTwoFilesPatch(file, file, before, after),
253-
status: "modified",
254-
...counts,
255-
}
256-
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { FileDiff } from "@opencode-ai/schema/file-diff"
2+
import { createTwoFilesPatch, diffLines } from "diff"
3+
4+
export function fileDiff(
5+
file: string,
6+
before: string,
7+
after: string,
8+
status: typeof FileDiff.Info.Type.status = "modified",
9+
): typeof FileDiff.Info.Type {
10+
const counts = diffLines(before, after).reduce(
11+
(result, item) => ({
12+
additions: result.additions + (item.added ? (item.count ?? 0) : 0),
13+
deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0),
14+
}),
15+
{ additions: 0, deletions: 0 },
16+
)
17+
return {
18+
file,
19+
patch: createTwoFilesPatch(file, file, before, after),
20+
status,
21+
...counts,
22+
}
23+
}

packages/core/src/tool/plugin/write.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,14 @@ export * as WriteTool from "./write"
88

99
import type { Context as PluginContext } from "@opencode-ai/plugin/effect/plugin"
1010
import { ToolFailure } from "@opencode-ai/ai"
11-
import { FileDiff } from "@opencode-ai/schema/file-diff"
1211
import { Effect, Schema } from "effect"
13-
import { createTwoFilesPatch, diffLines } from "diff"
1412
import { Bom } from "@opencode-ai/util/bom"
1513
import { FSUtil } from "@opencode-ai/util/fs-util"
1614
import { FileMutation } from "../../file-mutation"
1715
import { Formatter } from "../../formatter"
1816
import { LocationMutation } from "../../location-mutation"
1917
import { Permission } from "../../permission"
18+
import { fileDiff } from "./file-diff"
2019

2120
export const name = "write"
2221

@@ -83,19 +82,12 @@ export const Plugin = {
8382
Effect.catchReason("PlatformError", "NotFound", () => Effect.succeed(undefined)),
8483
)
8584
const next = Bom.split(input.content)
86-
const counts = diffLines(current?.text ?? "", next.text).reduce(
87-
(result, item) => ({
88-
additions: result.additions + (item.added ? (item.count ?? 0) : 0),
89-
deletions: result.deletions + (item.removed ? (item.count ?? 0) : 0),
90-
}),
91-
{ additions: 0, deletions: 0 },
85+
const preview = fileDiff(
86+
target.resource,
87+
current?.text ?? "",
88+
next.text,
89+
current ? "modified" : "added",
9290
)
93-
const preview: typeof FileDiff.Info.Type = {
94-
file: target.resource,
95-
patch: createTwoFilesPatch(target.resource, target.resource, current?.text ?? "", next.text),
96-
status: current ? "modified" : "added",
97-
...counts,
98-
}
9991
yield* permission.assert({
10092
action: "edit",
10193
resources: [target.resource],

0 commit comments

Comments
 (0)