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:
@@ -321,14 +321,15 @@ func (wm *WorktreeManager) mergeJSONLFiles(srcData, dstData []byte) ([]byte, err
|
||||
}
|
||||
|
||||
|
||||
// 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:])
|
||||
}
|
||||
|
||||
@@ -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:])
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user