@@ -11,6 +11,9 @@ import (
1111)
1212
1313func TestResolveBeadsDirForRepo_BareParentWorktreeFallback (t * testing.T ) {
14+ clearResolveBeadsDirCache ()
15+ t .Cleanup (clearResolveBeadsDirCache )
16+
1417 bareDir , featureWorktreeDir := setupBareParentWorktreeForDoctorTest (t )
1518 bareBeadsDir := filepath .Join (bareDir , ".beads" )
1619 if err := os .MkdirAll (bareBeadsDir , 0o750 ); err != nil {
@@ -23,7 +26,66 @@ func TestResolveBeadsDirForRepo_BareParentWorktreeFallback(t *testing.T) {
2326 }
2427}
2528
29+ func TestResolveBeadsDirForRepo_CachesFallbackResult (t * testing.T ) {
30+ clearResolveBeadsDirCache ()
31+ t .Cleanup (clearResolveBeadsDirCache )
32+
33+ tmpDir := t .TempDir ()
34+ repoPath := filepath .Join (tmpDir , "feature" )
35+ bareDir := filepath .Join (tmpDir , "repo.git" )
36+ bareBeadsDir := filepath .Join (bareDir , ".beads" )
37+ gitBinDir := filepath .Join (tmpDir , "bin" )
38+ gitLogPath := filepath .Join (tmpDir , "git.log" )
39+ gitScriptPath := filepath .Join (gitBinDir , "git" )
40+
41+ for _ , dir := range []string {repoPath , bareBeadsDir , gitBinDir } {
42+ if err := os .MkdirAll (dir , 0o750 ); err != nil {
43+ t .Fatal (err )
44+ }
45+ }
46+
47+ gitScript := strings .Join ([]string {
48+ "#!/bin/sh" ,
49+ "printf 'called\n ' >> \" $FAKE_GIT_LOG\" " ,
50+ "printf '%s\\ n%s\\ n' \" $FAKE_GIT_DIR\" \" $FAKE_GIT_COMMON_DIR\" " ,
51+ "" ,
52+ }, "\n " )
53+ if err := os .WriteFile (gitScriptPath , []byte (gitScript ), 0o750 ); err != nil {
54+ t .Fatal (err )
55+ }
56+
57+ t .Setenv ("PATH" , gitBinDir )
58+ t .Setenv ("FAKE_GIT_LOG" , gitLogPath )
59+ t .Setenv ("FAKE_GIT_DIR" , filepath .Join (bareDir , "worktrees" , "feature" ))
60+ t .Setenv ("FAKE_GIT_COMMON_DIR" , bareDir )
61+
62+ first := ResolveBeadsDirForRepo (repoPath )
63+ if first != utils .CanonicalizePath (bareBeadsDir ) {
64+ t .Fatalf ("first ResolveBeadsDirForRepo() = %q, want %q" , first , utils .CanonicalizePath (bareBeadsDir ))
65+ }
66+
67+ if err := os .Remove (gitScriptPath ); err != nil {
68+ t .Fatal (err )
69+ }
70+
71+ second := ResolveBeadsDirForRepo (repoPath )
72+ if second != first {
73+ t .Fatalf ("second ResolveBeadsDirForRepo() = %q, want cached %q" , second , first )
74+ }
75+
76+ logData , err := os .ReadFile (gitLogPath )
77+ if err != nil {
78+ t .Fatal (err )
79+ }
80+ if calls := strings .Count (string (logData ), "called\n " ); calls != 1 {
81+ t .Fatalf ("git fallback call count = %d, want 1" , calls )
82+ }
83+ }
84+
2685func TestCheckMetadataVersionTracking_BareParentWorktreeFallback (t * testing.T ) {
86+ clearResolveBeadsDirCache ()
87+ t .Cleanup (clearResolveBeadsDirCache )
88+
2789 bareDir , featureWorktreeDir := setupBareParentWorktreeForDoctorTest (t )
2890 bareBeadsDir := filepath .Join (bareDir , ".beads" )
2991 if err := os .MkdirAll (bareBeadsDir , 0o750 ); err != nil {
@@ -40,6 +102,9 @@ func TestCheckMetadataVersionTracking_BareParentWorktreeFallback(t *testing.T) {
40102}
41103
42104func TestCheckLockHealth_BareParentWorktreeFallback (t * testing.T ) {
105+ clearResolveBeadsDirCache ()
106+ t .Cleanup (clearResolveBeadsDirCache )
107+
43108 bareDir , featureWorktreeDir := setupBareParentWorktreeForDoctorTest (t )
44109 bareBeadsDir := filepath .Join (bareDir , ".beads" )
45110 if err := os .MkdirAll (filepath .Join (bareBeadsDir , "dolt" ), 0o750 ); err != nil {
@@ -56,6 +121,9 @@ func TestCheckLockHealth_BareParentWorktreeFallback(t *testing.T) {
56121}
57122
58123func TestCheckDoltLocks_BareParentWorktreeFallback (t * testing.T ) {
124+ clearResolveBeadsDirCache ()
125+ t .Cleanup (clearResolveBeadsDirCache )
126+
59127 bareDir , featureWorktreeDir := setupBareParentWorktreeForDoctorTest (t )
60128 bareBeadsDir := filepath .Join (bareDir , ".beads" )
61129 if err := os .MkdirAll (bareBeadsDir , 0o750 ); err != nil {
0 commit comments