From 5752d74caeaf604b306a2bf0794df7eacc965b00 Mon Sep 17 00:00:00 2001 From: rekram1-node Date: Sat, 22 Aug 2026 21:45:31 +0000 Subject: [PATCH] fix(core): skip nested repositories in snapshots --- packages/core/src/git.ts | 2 +- packages/core/test/git.test.ts | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/core/src/git.ts b/packages/core/src/git.ts index 3c2f5fc80fd..46e9db3a457 100644 --- a/packages/core/src/git.ts +++ b/packages/core/src/git.ts @@ -397,7 +397,7 @@ const layer = Layer.effect( ], { concurrency: 2 }, ) - const candidates = Array.from(new Set([...tracked, ...untracked])) + const candidates = Array.from(new Set([...tracked, ...untracked])).filter((item) => !item.endsWith("/")) if (!candidates.length) return { skipped: [] } const ignored = input.ignores ? new Set( diff --git a/packages/core/test/git.test.ts b/packages/core/test/git.test.ts index 26aface5730..35ee46f5030 100644 --- a/packages/core/test/git.test.ts +++ b/packages/core/test/git.test.ts @@ -131,6 +131,34 @@ describe("Git worktrees", () => { }) describe("Git trees", () => { + it.live("skips untracked nested repositories without commits", () => + Effect.gen(function* () { + const root = yield* Effect.acquireRelease( + Effect.promise(() => tmpdir()), + (dir) => Effect.promise(() => dir[Symbol.asyncDispose]()), + ) + const storage = AbsolutePath.make(`${root.path}-snapshot`) + yield* Effect.addFinalizer(() => Effect.promise(() => fs.rm(storage, { recursive: true, force: true }))) + yield* Effect.promise(async () => { + await initRepo(root.path) + await fs.mkdir(path.join(root.path, "tui")) + await $`git init`.cwd(path.join(root.path, "tui")).quiet() + await fs.writeFile(path.join(root.path, "tui", "nested.txt"), "nested\n") + await fs.writeFile(path.join(root.path, "added.txt"), "added\n") + }) + const git = yield* Git.Service + const source = yield* git.repo.discover(AbsolutePath.make(root.path)) + if (!source) throw new Error("Repository not found") + const repository = yield* git.repo.create({ worktree: source.worktree, gitDirectory: storage, seed: source }) + const before = yield* git.tree.write(repository) + + yield* git.index.refresh({ repository, scope: RelativePath.make(".") }) + const after = yield* git.tree.write(repository) + + expect(yield* git.tree.files({ repository, from: before, to: after })).toEqual([RelativePath.make("added.txt")]) + }), + ) + it.live("captures, compares, previews, and restores scoped trees", () => Effect.gen(function* () { const root = yield* Effect.acquireRelease(