|
|
@@ -26,8 +26,12 @@ export namespace Snapshot {
|
|
|
.nothrow()
|
|
|
log.info("initialized")
|
|
|
}
|
|
|
- await $`git --git-dir ${git} add .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
- const hash = await $`git --git-dir ${git} write-tree`.quiet().cwd(Instance.directory).nothrow().text()
|
|
|
+ await $`git --git-dir ${git} --work-tree ${Instance.worktree} add .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
+ const hash = await $`git --git-dir ${git} --work-tree ${Instance.worktree} write-tree`
|
|
|
+ .quiet()
|
|
|
+ .cwd(Instance.directory)
|
|
|
+ .nothrow()
|
|
|
+ .text()
|
|
|
log.info("tracking", { hash, cwd: Instance.directory, git })
|
|
|
return hash.trim()
|
|
|
}
|
|
|
@@ -40,8 +44,11 @@ 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 result = await $`git --git-dir ${git} diff --name-only ${hash} -- .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
+ await $`git --git-dir ${git} --work-tree ${Instance.worktree} add .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
+ const result = await $`git --git-dir ${git} --work-tree ${Instance.worktree} diff --name-only ${hash} -- .`
|
|
|
+ .quiet()
|
|
|
+ .cwd(Instance.directory)
|
|
|
+ .nothrow()
|
|
|
|
|
|
// If git diff fails, return empty patch
|
|
|
if (result.exitCode !== 0) {
|
|
|
@@ -64,10 +71,11 @@ export namespace Snapshot {
|
|
|
export async function restore(snapshot: string) {
|
|
|
log.info("restore", { commit: snapshot })
|
|
|
const git = gitdir()
|
|
|
- const result = await $`git --git-dir=${git} read-tree ${snapshot} && git --git-dir=${git} checkout-index -a -f`
|
|
|
- .quiet()
|
|
|
- .cwd(Instance.worktree)
|
|
|
- .nothrow()
|
|
|
+ const result =
|
|
|
+ await $`git --git-dir ${git} --work-tree ${Instance.worktree} read-tree ${snapshot} && git --git-dir ${git} --work-tree ${Instance.worktree} checkout-index -a -f`
|
|
|
+ .quiet()
|
|
|
+ .cwd(Instance.worktree)
|
|
|
+ .nothrow()
|
|
|
|
|
|
if (result.exitCode !== 0) {
|
|
|
log.error("failed to restore snapshot", {
|
|
|
@@ -86,16 +94,17 @@ export namespace Snapshot {
|
|
|
for (const file of item.files) {
|
|
|
if (files.has(file)) continue
|
|
|
log.info("reverting", { file, hash: item.hash })
|
|
|
- const result = await $`git --git-dir=${git} checkout ${item.hash} -- ${file}`
|
|
|
+ const result = await $`git --git-dir ${git} --work-tree ${Instance.worktree} checkout ${item.hash} -- ${file}`
|
|
|
.quiet()
|
|
|
.cwd(Instance.worktree)
|
|
|
.nothrow()
|
|
|
if (result.exitCode !== 0) {
|
|
|
const relativePath = path.relative(Instance.worktree, file)
|
|
|
- const checkTree = await $`git --git-dir=${git} ls-tree ${item.hash} -- ${relativePath}`
|
|
|
- .quiet()
|
|
|
- .cwd(Instance.worktree)
|
|
|
- .nothrow()
|
|
|
+ const checkTree =
|
|
|
+ await $`git --git-dir ${git} --work-tree ${Instance.worktree} ls-tree ${item.hash} -- ${relativePath}`
|
|
|
+ .quiet()
|
|
|
+ .cwd(Instance.worktree)
|
|
|
+ .nothrow()
|
|
|
if (checkTree.exitCode === 0 && checkTree.text().trim()) {
|
|
|
log.info("file existed in snapshot but checkout failed, keeping", {
|
|
|
file,
|
|
|
@@ -112,8 +121,11 @@ export namespace Snapshot {
|
|
|
|
|
|
export async function diff(hash: string) {
|
|
|
const git = gitdir()
|
|
|
- await $`git --git-dir ${git} add .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
- const result = await $`git --git-dir=${git} diff ${hash} -- .`.quiet().cwd(Instance.worktree).nothrow()
|
|
|
+ await $`git --git-dir ${git} --work-tree ${Instance.worktree} add .`.quiet().cwd(Instance.directory).nothrow()
|
|
|
+ const result = await $`git --git-dir ${git} --work-tree ${Instance.worktree} diff ${hash} -- .`
|
|
|
+ .quiet()
|
|
|
+ .cwd(Instance.worktree)
|
|
|
+ .nothrow()
|
|
|
|
|
|
if (result.exitCode !== 0) {
|
|
|
log.warn("failed to get diff", {
|
|
|
@@ -143,7 +155,7 @@ export namespace Snapshot {
|
|
|
export async function diffFull(from: string, to: string): Promise<FileDiff[]> {
|
|
|
const git = gitdir()
|
|
|
const result: FileDiff[] = []
|
|
|
- for await (const line of $`git --git-dir=${git} diff --no-renames --numstat ${from} ${to} -- .`
|
|
|
+ for await (const line of $`git --git-dir ${git} --work-tree ${Instance.worktree} diff --no-renames --numstat ${from} ${to} -- .`
|
|
|
.quiet()
|
|
|
.cwd(Instance.directory)
|
|
|
.nothrow()
|
|
|
@@ -151,8 +163,12 @@ export namespace Snapshot {
|
|
|
if (!line) continue
|
|
|
const [additions, deletions, file] = line.split("\t")
|
|
|
const isBinaryFile = additions === "-" && deletions === "-"
|
|
|
- const before = isBinaryFile ? "" : await $`git --git-dir=${git} show ${from}:${file}`.quiet().nothrow().text()
|
|
|
- const after = isBinaryFile ? "" : await $`git --git-dir=${git} show ${to}:${file}`.quiet().nothrow().text()
|
|
|
+ const before = isBinaryFile
|
|
|
+ ? ""
|
|
|
+ : await $`git --git-dir ${git} --work-tree ${Instance.worktree} show ${from}:${file}`.quiet().nothrow().text()
|
|
|
+ const after = isBinaryFile
|
|
|
+ ? ""
|
|
|
+ : await $`git --git-dir ${git} --work-tree ${Instance.worktree} show ${to}:${file}`.quiet().nothrow().text()
|
|
|
result.push({
|
|
|
file,
|
|
|
before,
|