summaryrefslogtreecommitdiffhomepage
path: root/packages/opencode/src/file/watcher.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/opencode/src/file/watcher.ts')
-rw-r--r--packages/opencode/src/file/watcher.ts52
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()
}
}