summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--packages/opencode/src/snapshot/index.ts37
1 files changed, 33 insertions, 4 deletions
diff --git a/packages/opencode/src/snapshot/index.ts b/packages/opencode/src/snapshot/index.ts
index c26ac55ba..4152498d3 100644
--- a/packages/opencode/src/snapshot/index.ts
+++ b/packages/opencode/src/snapshot/index.ts
@@ -55,7 +55,15 @@ export namespace Snapshot {
export async function patch(hash: string): Promise<Patch> {
const git = gitdir()
await $`git --git-dir ${git} add .`.quiet().cwd(Instance.directory).nothrow()
- const files = await $`git --git-dir ${git} diff --name-only ${hash} -- .`.cwd(Instance.directory).text()
+ const result = await $`git --git-dir ${git} diff --name-only ${hash} -- .`.quiet().cwd(Instance.directory).nothrow()
+
+ // If git diff fails, return empty patch
+ if (result.exitCode !== 0) {
+ log.warn("failed to get diff", { hash, exitCode: result.exitCode })
+ return { hash, files: [] }
+ }
+
+ const files = result.text()
return {
hash,
files: files
@@ -70,9 +78,19 @@ export namespace Snapshot {
export async function restore(snapshot: string) {
log.info("restore", { commit: snapshot })
const git = gitdir()
- await $`git --git-dir=${git} read-tree ${snapshot} && git --git-dir=${git} checkout-index -a -f`
+ const result = await $`git --git-dir=${git} read-tree ${snapshot} && git --git-dir=${git} checkout-index -a -f`
.quiet()
.cwd(Instance.worktree)
+ .nothrow()
+
+ if (result.exitCode !== 0) {
+ log.error("failed to restore snapshot", {
+ snapshot,
+ exitCode: result.exitCode,
+ stderr: result.stderr.toString(),
+ stdout: result.stdout.toString(),
+ })
+ }
}
export async function revert(patches: Patch[]) {
@@ -97,8 +115,19 @@ export namespace Snapshot {
export async function diff(hash: string) {
const git = gitdir()
- const result = await $`git --git-dir=${git} diff ${hash} -- .`.quiet().cwd(Instance.worktree).text()
- return result.trim()
+ const result = await $`git --git-dir=${git} diff ${hash} -- .`.quiet().cwd(Instance.worktree).nothrow()
+
+ if (result.exitCode !== 0) {
+ log.warn("failed to get diff", {
+ hash,
+ exitCode: result.exitCode,
+ stderr: result.stderr.toString(),
+ stdout: result.stdout.toString(),
+ })
+ return ""
+ }
+
+ return result.text().trim()
}
function gitdir() {