diff options
Diffstat (limited to 'packages/opencode/src/file/watcher.ts')
| -rw-r--r-- | packages/opencode/src/file/watcher.ts | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/packages/opencode/src/file/watcher.ts b/packages/opencode/src/file/watcher.ts index d5985b582..4459d20e9 100644 --- a/packages/opencode/src/file/watcher.ts +++ b/packages/opencode/src/file/watcher.ts @@ -1,6 +1,5 @@ import z from "zod" import { Bus } from "../bus" -import { Flag } from "../flag/flag" import { Instance } from "../project/instance" import { Log } from "../util/log" import { FileIgnore } from "./ignore" @@ -8,6 +7,7 @@ import { Config } from "../config/config" // @ts-ignore import { createWrapper } from "@parcel/watcher/wrapper" import { lazy } from "@/util/lazy" +import type ParcelWatcher from "@parcel/watcher" export namespace FileWatcher { const log = Log.create({ service: "file.watcher" }) @@ -44,32 +44,46 @@ export namespace FileWatcher { return {} } log.info("watcher backend", { platform: process.platform, backend }) - const sub = await watcher().subscribe( - Instance.directory, - (err, evts) => { - if (err) return - for (const evt of evts) { - log.info("event", evt) - if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" }) - if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" }) - if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" }) - } - }, - { - ignore: [...FileIgnore.PATTERNS, ...(cfg.watcher?.ignore ?? [])], + const subscribe: ParcelWatcher.SubscribeCallback = (err, evts) => { + if (err) return + for (const evt of evts) { + log.info("event", evt) + if (evt.type === "create") Bus.publish(Event.Updated, { file: evt.path, event: "add" }) + if (evt.type === "update") Bus.publish(Event.Updated, { file: evt.path, event: "change" }) + if (evt.type === "delete") Bus.publish(Event.Updated, { file: evt.path, event: "unlink" }) + } + } + + const subs = [] + const cfgIgnores = cfg.watcher?.ignore ?? [] + + subs.push( + await watcher().subscribe(Instance.directory, subscribe, { + ignore: [...FileIgnore.PATTERNS, ...cfgIgnores], backend, - }, + }), ) - return { sub } + + const vcsDir = Instance.project.vcsDir + if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) { + subs.push( + await watcher().subscribe(vcsDir, subscribe, { + ignore: ["hooks", "info", "logs", "objects", "refs", "worktrees", "modules", "lfs"], + backend, + }), + ) + } + + return { subs } }, async (state) => { - if (!state.sub) return - await state.sub?.unsubscribe() + if (!state.subs) return + await Promise.all(state.subs.map((sub) => sub?.unsubscribe())) }, ) export function init() { - if (!Flag.OPENCODE_EXPERIMENTAL_WATCHER) return + // if (!Flag.OPENCODE_EXPERIMENTAL_WATCHER) return state() } } |
