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
|
// This handles bare repo worktrees where the relative path includes the worktree
|
||||||
// name (e.g., "main/.beads/issues.jsonl" -> ".beads/issues.jsonl").
|
// name (e.g., "main/.beads/issues.jsonl" -> ".beads/issues.jsonl").
|
||||||
// GH#785: Fix for sync failing across worktrees in bare repo setup.
|
// GH#785: Fix for sync failing across worktrees in bare repo setup.
|
||||||
func normalizeBeadsRelPath(relPath string) string {
|
func normalizeBeadsRelPath(relPath string) string {
|
||||||
// Use filepath.ToSlash for consistent handling across platforms
|
// Use filepath.ToSlash for consistent handling across platforms
|
||||||
normalized := filepath.ToSlash(relPath)
|
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
|
// Strip leading path components before .beads
|
||||||
return filepath.FromSlash(normalized[idx:])
|
return filepath.FromSlash(normalized[idx:])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1082,14 +1082,15 @@ func formatVanishedIssues(localIssues, mergedIssues map[string]issueSummary, loc
|
|||||||
return lines
|
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
|
// This handles bare repo worktrees where the relative path includes the worktree
|
||||||
// name (e.g., "main/.beads/issues.jsonl" -> ".beads/issues.jsonl").
|
// name (e.g., "main/.beads/issues.jsonl" -> ".beads/issues.jsonl").
|
||||||
// GH#785: Fix for sync failing across worktrees in bare repo setup.
|
// GH#785: Fix for sync failing across worktrees in bare repo setup.
|
||||||
func normalizeBeadsRelPath(relPath string) string {
|
func normalizeBeadsRelPath(relPath string) string {
|
||||||
// Use filepath.ToSlash for consistent handling across platforms
|
// Use filepath.ToSlash for consistent handling across platforms
|
||||||
normalized := filepath.ToSlash(relPath)
|
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
|
// Strip leading path components before .beads
|
||||||
return filepath.FromSlash(normalized[idx:])
|
return filepath.FromSlash(normalized[idx:])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -218,6 +218,16 @@ func TestNormalizeBeadsRelPath(t *testing.T) {
|
|||||||
input: ".beads/subdir/file.jsonl",
|
input: ".beads/subdir/file.jsonl",
|
||||||
expected: ".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 {
|
for _, tt := range tests {
|
||||||
|
|||||||
Reference in New Issue
Block a user