fix(app): more defensive, handle no git

This commit is contained in:
Adam
2026-01-05 15:11:55 -06:00
parent 19123b6803
commit 2ca0ae7755
7 changed files with 94 additions and 23 deletions

View File

@@ -85,6 +85,7 @@ export namespace FileWatcher {
.cwd(Instance.worktree)
.text()
.then((x) => path.resolve(Instance.worktree, x.trim()))
.catch(() => undefined)
if (vcsDir && !cfgIgnores.includes(".git") && !cfgIgnores.includes(vcsDir)) {
const gitDirContents = await readdir(vcsDir).catch(() => [])
const ignoreList = gitDirContents.filter((entry) => entry !== "HEAD")

View File

@@ -53,11 +53,22 @@ export namespace Project {
if (git) {
let sandbox = path.dirname(git)
const gitBinary = Bun.which("git")
// cached id calculation
let id = await Bun.file(path.join(git, "opencode"))
.text()
.then((x) => x.trim())
.catch(() => {})
.catch(() => undefined)
if (!gitBinary) {
return {
id: id ?? "global",
worktree: sandbox,
sandbox: sandbox,
vcs: Info.shape.vcs.parse(Flag.OPENCODE_FAKE_VCS),
}
}
// generate id from root commit
if (!id) {
@@ -73,24 +84,53 @@ export namespace Project {
.map((x) => x.trim())
.toSorted(),
)
.catch(() => undefined)
if (!roots) {
return {
id: "global",
worktree: sandbox,
sandbox: sandbox,
vcs: Info.shape.vcs.parse(Flag.OPENCODE_FAKE_VCS),
}
}
id = roots[0]
if (id) Bun.file(path.join(git, "opencode")).write(id)
if (id) {
void Bun.file(path.join(git, "opencode"))
.write(id)
.catch(() => undefined)
}
}
if (!id)
if (!id) {
return {
id: "global",
worktree: sandbox,
sandbox: sandbox,
vcs: "git",
}
}
sandbox = await $`git rev-parse --show-toplevel`
const top = await $`git rev-parse --show-toplevel`
.quiet()
.nothrow()
.cwd(sandbox)
.text()
.then((x) => path.resolve(sandbox, x.trim()))
.catch(() => undefined)
if (!top) {
return {
id,
sandbox,
worktree: sandbox,
vcs: Info.shape.vcs.parse(Flag.OPENCODE_FAKE_VCS),
}
}
sandbox = top
const worktree = await $`git rev-parse --git-common-dir`
.quiet()
.nothrow()
@@ -101,6 +141,17 @@ export namespace Project {
if (dirname === ".") return sandbox
return dirname
})
.catch(() => undefined)
if (!worktree) {
return {
id,
sandbox,
worktree: sandbox,
vcs: Info.shape.vcs.parse(Flag.OPENCODE_FAKE_VCS),
}
}
return {
id,
sandbox,

View File

@@ -179,12 +179,14 @@ export namespace Snapshot {
.quiet()
.nothrow()
.text()
const added = isBinaryFile ? 0 : parseInt(additions)
const deleted = isBinaryFile ? 0 : parseInt(deletions)
result.push({
file,
before,
after,
additions: parseInt(additions),
deletions: parseInt(deletions),
additions: Number.isFinite(added) ? added : 0,
deletions: Number.isFinite(deleted) ? deleted : 0,
})
}
return result

View File

@@ -31,7 +31,7 @@ export namespace Filesystem {
const result = []
while (true) {
const search = join(current, target)
if (await exists(search)) result.push(search)
if (await exists(search).catch(() => false)) result.push(search)
if (stop === current) break
const parent = dirname(current)
if (parent === current) break
@@ -46,7 +46,7 @@ export namespace Filesystem {
while (true) {
for (const target of targets) {
const search = join(current, target)
if (await exists(search)) yield search
if (await exists(search).catch(() => false)) yield search
}
if (stop === current) break
const parent = dirname(current)