|
|
@@ -23,7 +23,7 @@ mock.module("../../src/util/git", () => ({
|
|
|
mode === "rev-list-fail" &&
|
|
|
cmd.includes("git rev-list") &&
|
|
|
cmd.includes("--max-parents=0") &&
|
|
|
- cmd.includes("--all")
|
|
|
+ cmd.includes("HEAD")
|
|
|
) {
|
|
|
return Promise.resolve({
|
|
|
exitCode: 128,
|
|
|
@@ -172,6 +172,52 @@ describe("Project.fromDirectory with worktrees", () => {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
+ test("worktree should share project ID with main repo", async () => {
|
|
|
+ const p = await loadProject()
|
|
|
+ await using tmp = await tmpdir({ git: true })
|
|
|
+
|
|
|
+ const { project: main } = await p.fromDirectory(tmp.path)
|
|
|
+
|
|
|
+ const worktreePath = path.join(tmp.path, "..", path.basename(tmp.path) + "-wt-shared")
|
|
|
+ try {
|
|
|
+ await $`git worktree add ${worktreePath} -b shared-${Date.now()}`.cwd(tmp.path).quiet()
|
|
|
+
|
|
|
+ const { project: wt } = await p.fromDirectory(worktreePath)
|
|
|
+
|
|
|
+ expect(wt.id).toBe(main.id)
|
|
|
+
|
|
|
+ // Cache should live in the common .git dir, not the worktree's .git file
|
|
|
+ const cache = path.join(tmp.path, ".git", "opencode")
|
|
|
+ const exists = await Filesystem.exists(cache)
|
|
|
+ expect(exists).toBe(true)
|
|
|
+ } finally {
|
|
|
+ await $`git worktree remove ${worktreePath}`
|
|
|
+ .cwd(tmp.path)
|
|
|
+ .quiet()
|
|
|
+ .catch(() => {})
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ test("separate clones of the same repo should share project ID", async () => {
|
|
|
+ const p = await loadProject()
|
|
|
+ await using tmp = await tmpdir({ git: true })
|
|
|
+
|
|
|
+ // Create a bare remote, push, then clone into a second directory
|
|
|
+ const bare = tmp.path + "-bare"
|
|
|
+ const clone = tmp.path + "-clone"
|
|
|
+ try {
|
|
|
+ await $`git clone --bare ${tmp.path} ${bare}`.quiet()
|
|
|
+ await $`git clone ${bare} ${clone}`.quiet()
|
|
|
+
|
|
|
+ const { project: a } = await p.fromDirectory(tmp.path)
|
|
|
+ const { project: b } = await p.fromDirectory(clone)
|
|
|
+
|
|
|
+ expect(b.id).toBe(a.id)
|
|
|
+ } finally {
|
|
|
+ await $`rm -rf ${bare} ${clone}`.quiet().nothrow()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
test("should accumulate multiple worktrees in sandboxes", async () => {
|
|
|
const p = await loadProject()
|
|
|
await using tmp = await tmpdir({ git: true })
|