summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorGoni Zahavy <[email protected]>2026-01-29 02:47:09 +0200
committerGitHub <[email protected]>2026-01-28 18:47:09 -0600
commite5b33f8a5e249f8b3de20afaaedf573bdabb3b5d (patch)
treef0a2de46f71525360ffad2798749e5d771deb6aa /packages
parent90a7e3d64e0a83857906336f78808ffb92afe150 (diff)
downloadopencode-e5b33f8a5e249f8b3de20afaaedf573bdabb3b5d.tar.gz
opencode-e5b33f8a5e249f8b3de20afaaedf573bdabb3b5d.zip
fix(opencode): add `AbortSignal` support to `Ripgrep.files()` and `GlobTool` (#10833)
Diffstat (limited to 'packages')
-rw-r--r--packages/opencode/src/file/ripgrep.ts12
-rw-r--r--packages/opencode/src/tool/glob.ts1
-rw-r--r--packages/opencode/src/tool/ls.ts2
3 files changed, 12 insertions, 3 deletions
diff --git a/packages/opencode/src/file/ripgrep.ts b/packages/opencode/src/file/ripgrep.ts
index 0d1817356..0f6889779 100644
--- a/packages/opencode/src/file/ripgrep.ts
+++ b/packages/opencode/src/file/ripgrep.ts
@@ -209,7 +209,10 @@ export namespace Ripgrep {
hidden?: boolean
follow?: boolean
maxDepth?: number
+ signal?: AbortSignal
}) {
+ input.signal?.throwIfAborted()
+
const args = [await filepath(), "--files", "--glob=!.git/*"]
if (input.follow !== false) args.push("--follow")
if (input.hidden !== false) args.push("--hidden")
@@ -235,6 +238,7 @@ export namespace Ripgrep {
stdout: "pipe",
stderr: "ignore",
maxBuffer: 1024 * 1024 * 20,
+ signal: input.signal,
})
const reader = proc.stdout.getReader()
@@ -243,6 +247,8 @@ export namespace Ripgrep {
try {
while (true) {
+ input.signal?.throwIfAborted()
+
const { done, value } = await reader.read()
if (done) break
@@ -261,11 +267,13 @@ export namespace Ripgrep {
reader.releaseLock()
await proc.exited
}
+
+ input.signal?.throwIfAborted()
}
- export async function tree(input: { cwd: string; limit?: number }) {
+ export async function tree(input: { cwd: string; limit?: number; signal?: AbortSignal }) {
log.info("tree", input)
- const files = await Array.fromAsync(Ripgrep.files({ cwd: input.cwd }))
+ const files = await Array.fromAsync(Ripgrep.files({ cwd: input.cwd, signal: input.signal }))
interface Node {
path: string[]
children: Node[]
diff --git a/packages/opencode/src/tool/glob.ts b/packages/opencode/src/tool/glob.ts
index dda57f6ee..6943795f8 100644
--- a/packages/opencode/src/tool/glob.ts
+++ b/packages/opencode/src/tool/glob.ts
@@ -38,6 +38,7 @@ export const GlobTool = Tool.define("glob", {
for await (const file of Ripgrep.files({
cwd: search,
glob: [params.pattern],
+ signal: ctx.abort,
})) {
if (files.length >= limit) {
truncated = true
diff --git a/packages/opencode/src/tool/ls.ts b/packages/opencode/src/tool/ls.ts
index cc3d75007..b848e969b 100644
--- a/packages/opencode/src/tool/ls.ts
+++ b/packages/opencode/src/tool/ls.ts
@@ -56,7 +56,7 @@ export const ListTool = Tool.define("list", {
const ignoreGlobs = IGNORE_PATTERNS.map((p) => `!${p}*`).concat(params.ignore?.map((p) => `!${p}`) || [])
const files = []
- for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs })) {
+ for await (const file of Ripgrep.files({ cwd: searchPath, glob: ignoreGlobs, signal: ctx.abort })) {
files.push(file)
if (files.length >= LIMIT) break
}