fix: edge case in normalizeBeadsRelPath for similar prefixes

Code review caught that ".beads" would incorrectly match prefixes like
".beads-backup". Changed to match ".beads/" (with trailing slash) to
ensure we only match the actual .beads directory.

Added test cases for this edge case.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Steve Yegge
2025-12-29 15:51:17 -08:00
parent 0fa97a4c30
commit 53a63f2779
3 changed files with 16 additions and 4 deletions

View File

@@ -1082,14 +1082,15 @@ func formatVanishedIssues(localIssues, mergedIssues map[string]issueSummary, loc
return lines
}
// normalizeBeadsRelPath strips any leading path components before .beads.
// normalizeBeadsRelPath strips any leading path components before .beads/.
// This handles bare repo worktrees where the relative path includes the worktree
// name (e.g., "main/.beads/issues.jsonl" -> ".beads/issues.jsonl").
// GH#785: Fix for sync failing across worktrees in bare repo setup.
func normalizeBeadsRelPath(relPath string) string {
// Use filepath.ToSlash for consistent handling across platforms
normalized := filepath.ToSlash(relPath)
if idx := strings.Index(normalized, ".beads"); idx > 0 {
// Look for ".beads/" to ensure we match the directory, not a prefix like ".beads-backup"
if idx := strings.Index(normalized, ".beads/"); idx > 0 {
// Strip leading path components before .beads
return filepath.FromSlash(normalized[idx:])
}

View File

@@ -218,6 +218,16 @@ func TestNormalizeBeadsRelPath(t *testing.T) {
input: ".beads/subdir/file.jsonl",
expected: ".beads/subdir/file.jsonl",
},
{
name: "similar prefix like .beads-backup not matched",
input: "foo/.beads-backup/.beads/issues.jsonl",
expected: ".beads/issues.jsonl",
},
{
name: "only .beads-backup no real .beads unchanged",
input: "foo/.beads-backup/file.txt",
expected: "foo/.beads-backup/file.txt",
},
}
for _, tt := range tests {