fix: Windows infinite loop in findLocalBeadsDir and findOriginalBeadsDir (GH#996)
Same fix as PR #991 for FindBeadsDir() - the loop condition dir != "/" && dir != "." doesn't handle Windows drive roots. On Windows, filepath.Dir("C:\\") returns "C:\\", not "/" or ".". Changed both functions to check parent == dir to detect filesystem root, which works correctly on both Unix and Windows. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -118,7 +118,7 @@ func findOriginalBeadsDir() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Walk up directory tree looking for .beads with redirect
|
// Walk up directory tree looking for .beads with redirect
|
||||||
for dir := cwd; dir != "/" && dir != "."; dir = filepath.Dir(dir) {
|
for dir := cwd; dir != "/" && dir != "."; {
|
||||||
beadsDir := filepath.Join(dir, ".beads")
|
beadsDir := filepath.Join(dir, ".beads")
|
||||||
if info, err := os.Stat(beadsDir); err == nil && info.IsDir() {
|
if info, err := os.Stat(beadsDir); err == nil && info.IsDir() {
|
||||||
redirectFile := filepath.Join(beadsDir, beads.RedirectFileName)
|
redirectFile := filepath.Join(beadsDir, beads.RedirectFileName)
|
||||||
@@ -128,6 +128,16 @@ func findOriginalBeadsDir() string {
|
|||||||
// Found .beads without redirect - this is the actual location
|
// Found .beads without redirect - this is the actual location
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move up one directory
|
||||||
|
parent := filepath.Dir(dir)
|
||||||
|
if parent == dir {
|
||||||
|
// Reached filesystem root (works on both Unix and Windows)
|
||||||
|
// On Unix: filepath.Dir("/") returns "/"
|
||||||
|
// On Windows: filepath.Dir("C:\\") returns "C:\\"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
dir = parent
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ func findLocalBeadsDir() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check for worktree - use main repo's .beads
|
// Check for worktree - use main repo's .beads
|
||||||
|
// Note: GetMainRepoRoot() is safe to call outside a git repo - it returns an error
|
||||||
mainRepoRoot, err := git.GetMainRepoRoot()
|
mainRepoRoot, err := git.GetMainRepoRoot()
|
||||||
if err == nil && mainRepoRoot != "" {
|
if err == nil && mainRepoRoot != "" {
|
||||||
beadsDir := filepath.Join(mainRepoRoot, ".beads")
|
beadsDir := filepath.Join(mainRepoRoot, ".beads")
|
||||||
@@ -158,11 +159,21 @@ func findLocalBeadsDir() string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
for dir := cwd; dir != "/" && dir != "."; dir = filepath.Dir(dir) {
|
for dir := cwd; dir != "/" && dir != "."; {
|
||||||
beadsDir := filepath.Join(dir, ".beads")
|
beadsDir := filepath.Join(dir, ".beads")
|
||||||
if info, err := os.Stat(beadsDir); err == nil && info.IsDir() {
|
if info, err := os.Stat(beadsDir); err == nil && info.IsDir() {
|
||||||
return beadsDir
|
return beadsDir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Move up one directory
|
||||||
|
parent := filepath.Dir(dir)
|
||||||
|
if parent == dir {
|
||||||
|
// Reached filesystem root (works on both Unix and Windows)
|
||||||
|
// On Unix: filepath.Dir("/") returns "/"
|
||||||
|
// On Windows: filepath.Dir("C:\\") returns "C:\\"
|
||||||
|
break
|
||||||
|
}
|
||||||
|
dir = parent
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
|
|||||||
Reference in New Issue
Block a user