singularity-forge/tests
Jeremy McSpadden 98530fad11 Fix worktree root resolution in deep symlink paths (#1680)
* fix: prevent parallel worktree path resolution from escaping to home directory

When .gsd is a symlink into ~/.gsd/projects/<hash> (the default layout),
parallel workers resolve their cwd through the symlink. findWorktreeSegment()
then matches /.gsd/ at the user-level ~/.gsd boundary instead of the project
.gsd, causing resolveProjectRoot() to return ~ as the project root.

This corrupts ~/.gsd, creates ~/.git, and crashes pi.

Fix (3 layers):
1. Pass GSD_PROJECT_ROOT env var from coordinator to workers — the
   coordinator already knows the real basePath unambiguously.
2. In resolveProjectRoot(), detect when the candidate root's .gsd
   matches the user-level ~/.gsd and fall back to reading the worktree's
   .git file (gitdir: pointer) to recover the real project root.
3. Existing validateDirectory() already blocks ~ — but the bug bypassed
   it because the worktree path itself was 'safe'.

Also fixes the existing test that asserted the buggy behavior as correct.

Closes gsd-build/gsd-2#1676

* fix worktree root resolution for deep symlink paths

---------

Co-authored-by: Vojtěch Šplíchal <splichal@gmail.com>
2026-03-21 08:32:38 -06:00
..
fixtures feat(ci): implement three-stage promotion pipeline (Dev → Test → Prod) (#1098) 2026-03-18 00:40:06 -06:00
live feat(ci): implement three-stage promotion pipeline (Dev → Test → Prod) (#1098) 2026-03-18 00:40:06 -06:00
live-regression feat: add live regression test harness for post-build pipeline validation (#1316) 2026-03-18 20:22:54 -06:00
repro-worktree-bug Fix worktree root resolution in deep symlink paths (#1680) 2026-03-21 08:32:38 -06:00
smoke fix(ci): skip init smoke test in non-TTY CI environments (#1172) 2026-03-18 09:44:42 -06:00