mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-03-30 13:54:01 +00:00
65 lines
2.0 KiB
TypeScript
65 lines
2.0 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import { $ } from "bun"
|
|
import fs from "fs/promises"
|
|
import path from "path"
|
|
import { Instance } from "../../src/project/instance"
|
|
import { Worktree } from "../../src/worktree"
|
|
import { tmpdir } from "../fixture/fixture"
|
|
|
|
describe("Worktree.remove", () => {
|
|
test("continues when git remove exits non-zero after detaching", async () => {
|
|
await using tmp = await tmpdir({ git: true })
|
|
const root = tmp.path
|
|
const name = `remove-regression-${Date.now().toString(36)}`
|
|
const branch = `opencode/${name}`
|
|
const dir = path.join(root, "..", name)
|
|
|
|
await $`git worktree add --no-checkout -b ${branch} ${dir}`.cwd(root).quiet()
|
|
await $`git reset --hard`.cwd(dir).quiet()
|
|
|
|
const real = (await $`which git`.quiet().text()).trim()
|
|
expect(real).toBeTruthy()
|
|
|
|
const bin = path.join(root, "bin")
|
|
const shim = path.join(bin, "git")
|
|
await fs.mkdir(bin, { recursive: true })
|
|
await Bun.write(
|
|
shim,
|
|
[
|
|
"#!/bin/bash",
|
|
`REAL_GIT=${JSON.stringify(real)}`,
|
|
'if [ "$1" = "worktree" ] && [ "$2" = "remove" ]; then',
|
|
' "$REAL_GIT" "$@" >/dev/null 2>&1',
|
|
' echo "fatal: failed to remove worktree: Directory not empty" >&2',
|
|
" exit 1",
|
|
"fi",
|
|
'exec "$REAL_GIT" "$@"',
|
|
].join("\n"),
|
|
)
|
|
await fs.chmod(shim, 0o755)
|
|
|
|
const prev = process.env.PATH ?? ""
|
|
process.env.PATH = `${bin}${path.delimiter}${prev}`
|
|
|
|
const ok = await (async () => {
|
|
try {
|
|
return await Instance.provide({
|
|
directory: root,
|
|
fn: () => Worktree.remove({ directory: dir }),
|
|
})
|
|
} finally {
|
|
process.env.PATH = prev
|
|
}
|
|
})()
|
|
|
|
expect(ok).toBe(true)
|
|
expect(await Bun.file(dir).exists()).toBe(false)
|
|
|
|
const list = await $`git worktree list --porcelain`.cwd(root).quiet().text()
|
|
expect(list).not.toContain(`worktree ${dir}`)
|
|
|
|
const ref = await $`git show-ref --verify --quiet refs/heads/${branch}`.cwd(root).quiet().nothrow()
|
|
expect(ref.exitCode).not.toBe(0)
|
|
})
|
|
})
|