fix(worktree): Cache git detection results to eliminate slowness (bd-7di)

In git worktrees, any bd command was slow with a 2-3s pause because:
- git.IsWorktree() was called 4+ times per command
- Each call spawned 2 git processes (git-dir and git-common-dir)
- git.GetRepoRoot() and git.GetMainRepoRoot() also called multiple times

Fix: Cache results using sync.Once since these values do not change during
a single command execution:
- IsWorktree() - caches worktree detection
- GetRepoRoot() - caches repo root path
- GetMainRepoRoot() - caches main repo root for worktrees

Added ResetCaches() for test cleanup between subtests that change directories.

🤖 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-25 22:04:40 -08:00
parent df5d4b384c
commit 32c803dd16
3 changed files with 50 additions and 0 deletions

View File

@@ -864,6 +864,7 @@ func TestCountJSONLIssues(t *testing.T) {
// TestGetMainRepoRoot tests the GetMainRepoRoot function for various scenarios
func TestGetMainRepoRoot(t *testing.T) {
t.Run("returns correct root for regular repo", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -877,6 +878,7 @@ func TestGetMainRepoRoot(t *testing.T) {
if err := os.Chdir(repoPath); err != nil {
t.Fatalf("Failed to chdir to repo: %v", err)
}
ResetCaches() // Reset after chdir
root, err := GetMainRepoRoot()
if err != nil {
@@ -893,6 +895,7 @@ func TestGetMainRepoRoot(t *testing.T) {
})
t.Run("returns main repo root from worktree", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -913,6 +916,7 @@ func TestGetMainRepoRoot(t *testing.T) {
if err := os.Chdir(worktreePath); err != nil {
t.Fatalf("Failed to chdir to worktree: %v", err)
}
ResetCaches() // Reset after chdir
root, err := GetMainRepoRoot()
if err != nil {
@@ -929,6 +933,7 @@ func TestGetMainRepoRoot(t *testing.T) {
})
t.Run("returns main repo root from nested worktree (GH#509)", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -950,6 +955,7 @@ func TestGetMainRepoRoot(t *testing.T) {
if err := os.Chdir(nestedWorktreePath); err != nil {
t.Fatalf("Failed to chdir to nested worktree: %v", err)
}
ResetCaches() // Reset after chdir
root, err := GetMainRepoRoot()
if err != nil {
@@ -966,6 +972,7 @@ func TestGetMainRepoRoot(t *testing.T) {
})
t.Run("returns main repo root from subdirectory of nested worktree", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -993,6 +1000,7 @@ func TestGetMainRepoRoot(t *testing.T) {
if err := os.Chdir(subDir); err != nil {
t.Fatalf("Failed to chdir to subdir: %v", err)
}
ResetCaches() // Reset after chdir
root, err := GetMainRepoRoot()
if err != nil {
@@ -1012,6 +1020,7 @@ func TestGetMainRepoRoot(t *testing.T) {
// TestIsWorktree tests the IsWorktree function
func TestIsWorktree(t *testing.T) {
t.Run("returns false for regular repo", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -1024,6 +1033,7 @@ func TestIsWorktree(t *testing.T) {
if err := os.Chdir(repoPath); err != nil {
t.Fatalf("Failed to chdir to repo: %v", err)
}
ResetCaches() // Reset after chdir
if IsWorktree() {
t.Error("IsWorktree() should return false for regular repo")
@@ -1031,6 +1041,7 @@ func TestIsWorktree(t *testing.T) {
})
t.Run("returns true for worktree", func(t *testing.T) {
ResetCaches() // Reset caches from previous subtests
repoPath, cleanup := setupTestRepo(t)
defer cleanup()
@@ -1051,6 +1062,7 @@ func TestIsWorktree(t *testing.T) {
t.Fatalf("Failed to chdir to worktree: %v", err)
}
ResetCaches() // Reset after chdir to worktree
if !IsWorktree() {
t.Error("IsWorktree() should return true for worktree")
}