be smarter about generating a worktree name

This commit is contained in:
James Long 2026-05-08 11:42:22 -04:00
commit 5668fe61f8
2 changed files with 32 additions and 1 deletions

View file

@ -361,13 +361,15 @@ export const layer: Layer.Layer<
}
const primary = yield* canonical(ctx.worktree)
const primaryName = pathSvc.basename(primary)
return yield* Effect.forEach(parseWorktreeList(result.text), (entry) =>
Effect.gen(function* () {
if (!entry.path) return undefined
const directory = yield* canonical(entry.path)
if (directory === primary) return undefined
const name = pathSvc.basename(directory)
return {
name: pathSvc.basename(directory),
name: name === primaryName ? pathSvc.basename(pathSvc.dirname(directory)) : name,
directory,
...(entry.branch ? { branch: entry.branch.replace(/^refs\/heads\//, "") } : {}),
}

View file

@ -200,6 +200,35 @@ describe("Worktree", () => {
)
})
describe("list", () => {
it.live("uses parent folder name when worktree basename matches the primary worktree", () =>
provideTmpdirInstance(
(dir) =>
Effect.gen(function* () {
const svc = yield* Worktree.Service
const parent = path.join(path.dirname(dir), `${path.basename(dir)}-parent`)
const target = path.join(parent, path.basename(dir))
const branch = `same-basename-list-${Date.now()}`
yield* Effect.promise(() => fs.mkdir(parent, { recursive: true }))
yield* Effect.promise(() => $`git worktree add -b ${branch} ${target}`.cwd(dir).quiet())
const list = yield* svc.list()
const directory = yield* Effect.promise(() => fs.realpath(target).catch(() => target))
expect(list).toContainEqual({
name: path.basename(parent),
branch,
directory,
})
yield* svc.remove({ directory: target })
}),
{ git: true },
),
)
})
describe("remove edge cases", () => {
it.live("remove non-existent directory succeeds silently", () =>
provideTmpdirInstance(