Skip to content

Commit bcf0808

Browse files
committed
fix: close pack-only filesystem health gaps
1 parent 1b98069 commit bcf0808

5 files changed

Lines changed: 105 additions & 11 deletions

File tree

‎internal/cli/fold.go‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package cli
22

33
import (
4+
"context"
45
"encoding/json"
6+
"errors"
57
"fmt"
8+
"os"
69
"path/filepath"
710

811
"github.com/samekind/codexfold/internal/codex"
@@ -134,13 +137,7 @@ func newDoctorCommand() *cobra.Command {
134137
return err
135138
}
136139
storeDir = resolveFoldStore(home, storeDir)
137-
var reader fold.ObjectReader
138-
resolver, packErr := pack.Open(storeDir, pack.OpenOptions{CacheBytes: -1})
139-
if packErr == nil {
140-
defer resolver.Close()
141-
reader = resolver
142-
}
143-
result, err := fold.DoctorWithOptions(command.Context(), storeDir, fold.DoctorOptions{Reader: reader})
140+
result, err := doctorFoldStore(command.Context(), storeDir)
144141
if err != nil {
145142
return err
146143
}
@@ -157,6 +154,21 @@ func newDoctorCommand() *cobra.Command {
157154
return command
158155
}
159156

157+
func doctorFoldStore(ctx context.Context, storeDir string) (fold.DoctorResult, error) {
158+
resolver, err := pack.Open(storeDir, pack.OpenOptions{CacheBytes: -1})
159+
if err == nil {
160+
defer resolver.Close()
161+
return fold.DoctorWithOptions(ctx, storeDir, fold.DoctorOptions{Reader: resolver})
162+
}
163+
current := filepath.Join(filepath.Clean(storeDir), "packs", "CURRENT")
164+
if _, currentErr := os.Lstat(current); errors.Is(currentErr, os.ErrNotExist) {
165+
return fold.Doctor(ctx, storeDir)
166+
} else if currentErr != nil {
167+
return fold.DoctorResult{}, currentErr
168+
}
169+
return fold.DoctorResult{}, fmt.Errorf("open current pack for fold verification: %w", err)
170+
}
171+
160172
func newGCCommand() *cobra.Command {
161173
var codexHome string
162174
var storeDir string

‎internal/cli/fs.go‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,11 @@ func newFSServeCommand() *cobra.Command {
602602
if nativeFSKitSocket == "" {
603603
nativeFSKitSocket = defaultNativeFSKitSocket(home, nativeFSKitResource)
604604
}
605+
if frontend == "native-fskit" {
606+
if err := validateNativeFSKitSocketPath(nativeFSKitSocket); err != nil {
607+
return err
608+
}
609+
}
605610
result := FSServeResult{MountPoint: mount, ManagedSessions: len(states), Frontend: frontend, DryRun: !apply}
606611
if frontend == "native-fskit" {
607612
result.ResourcePath = nativeFSKitResource
@@ -910,6 +915,13 @@ func defaultNativeFSKitSocket(home string, resourcePath string) string {
910915
return filepath.Join("/private/tmp", fmt.Sprintf("codexfold-fskit-%d-%s.sock", os.Getuid(), hex.EncodeToString(digest[:4])))
911916
}
912917

918+
func validateNativeFSKitSocketPath(path string) error {
919+
if len(path) >= 104 {
920+
return errors.New("native FSKit Unix socket path exceeds the macOS limit; choose a shorter resource path")
921+
}
922+
return nil
923+
}
924+
913925
func syncCanonicalRetirement(
914926
store string,
915927
home string,
@@ -1808,7 +1820,7 @@ func requireStorageHealth(ctx context.Context, store string) error {
18081820
if packReport.IssueCount != 0 {
18091821
return fmt.Errorf("pack doctor reported %d issues", packReport.IssueCount)
18101822
}
1811-
foldReport, err := fold.Doctor(ctx, store)
1823+
foldReport, err := doctorFoldStore(ctx, store)
18121824
if err != nil {
18131825
return err
18141826
}
@@ -1932,7 +1944,7 @@ func fsDoctor(ctx context.Context, home string, store string, mount string, defi
19321944
return nil
19331945
}},
19341946
{Component: fsctl.ComponentManifest, Run: func(ctx context.Context) error {
1935-
report, err := fold.Doctor(ctx, store)
1947+
report, err := doctorFoldStore(ctx, store)
19361948
if err != nil {
19371949
return err
19381950
}

‎internal/cli/fs_enroll.go‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212

1313
"github.com/samekind/codexfold/internal/codex"
1414
"github.com/samekind/codexfold/internal/enroll"
15-
"github.com/samekind/codexfold/internal/fold"
1615
"github.com/samekind/codexfold/internal/fsctl"
1716
"github.com/samekind/codexfold/internal/mountfs"
1817
"github.com/samekind/codexfold/internal/pack"
@@ -261,7 +260,7 @@ func buildEnrollmentPlan(ctx context.Context, flags enrollmentFlags) (enroll.Pla
261260
}
262261

263262
func requireEnrollmentStorageHealth(ctx context.Context, store string) error {
264-
foldReport, err := fold.Doctor(ctx, store)
263+
foldReport, err := doctorFoldStore(ctx, store)
265264
if err != nil {
266265
return err
267266
}

‎internal/cli/fs_service.go‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,11 @@ func newFSServiceInstallCommand() *cobra.Command {
346346
}
347347
fskitResource = service.DefaultFSKitResourcePath(userHome)
348348
}
349+
if frontend == "native-fskit" {
350+
if err := validateNativeFSKitSocketPath(defaultNativeFSKitSocket(home, fskitResource)); err != nil {
351+
return err
352+
}
353+
}
349354
if frontend == "native-fskit" && apply {
350355
within, err := filepath.Rel(appTransaction.AppGroupPath(), filepath.Clean(fskitResource))
351356
if err != nil || within == ".." || strings.HasPrefix(within, ".."+string(filepath.Separator)) {

‎internal/cli/fs_test.go‎

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,53 @@ func TestRootExposesPackAndFilesystemCommands(t *testing.T) {
5454
}
5555
}
5656

57+
func TestDoctorFoldStoreVerifiesPackOnlyManifests(t *testing.T) {
58+
storeDir := t.TempDir()
59+
source := filepath.Join(t.TempDir(), "rollout.jsonl")
60+
data := bytes.Repeat([]byte("{\"pack_only\":true}\n"), 256)
61+
if err := os.WriteFile(source, data, 0o600); err != nil {
62+
t.Fatal(err)
63+
}
64+
if _, err := fold.Fold(context.Background(), fold.Session{ID: "session", RolloutPath: source, Archived: true}, fold.FoldOptions{StoreDir: storeDir, Apply: true}); err != nil {
65+
t.Fatal(err)
66+
}
67+
if _, err := pack.Build(context.Background(), storeDir, pack.BuildOptions{}); err != nil {
68+
t.Fatal(err)
69+
}
70+
if _, err := pack.RetireLoose(context.Background(), storeDir, pack.RetireLooseOptions{Apply: true}); err != nil {
71+
t.Fatal(err)
72+
}
73+
report, err := doctorFoldStore(context.Background(), storeDir)
74+
if err != nil || report.IssueCount != 0 || report.VerifiedManifestCount != 1 {
75+
t.Fatalf("pack-only fold doctor: report=%#v err=%v", report, err)
76+
}
77+
}
78+
79+
func TestDoctorFoldStoreDoesNotMaskBrokenCurrentPackWithLooseObjects(t *testing.T) {
80+
storeDir := t.TempDir()
81+
source := filepath.Join(t.TempDir(), "rollout.jsonl")
82+
if err := os.WriteFile(source, []byte("{\"pack\":\"must remain authoritative\"}\n"), 0o600); err != nil {
83+
t.Fatal(err)
84+
}
85+
if _, err := fold.Fold(context.Background(), fold.Session{ID: "session", RolloutPath: source, Archived: true}, fold.FoldOptions{StoreDir: storeDir, Apply: true}); err != nil {
86+
t.Fatal(err)
87+
}
88+
result, err := pack.Build(context.Background(), storeDir, pack.BuildOptions{})
89+
if err != nil {
90+
t.Fatal(err)
91+
}
92+
packFiles, err := filepath.Glob(filepath.Join(storeDir, "packs", result.Generation, "*.pack"))
93+
if err != nil || len(packFiles) == 0 {
94+
t.Fatalf("locate current pack: files=%v err=%v", packFiles, err)
95+
}
96+
if err := os.Remove(packFiles[0]); err != nil {
97+
t.Fatal(err)
98+
}
99+
if _, err := doctorFoldStore(context.Background(), storeDir); err == nil || !strings.Contains(err.Error(), "open current pack") {
100+
t.Fatalf("broken current pack error = %v", err)
101+
}
102+
}
103+
57104
func TestRetainCanonicalSnapshotBudgetRejectsBeforeCreatingSnapshot(t *testing.T) {
58105
root := t.TempDir()
59106
store := filepath.Join(root, "store")
@@ -424,6 +471,25 @@ func TestFSServiceInstallRendersNativeFSKitDaemonAndSupervisor(t *testing.T) {
424471
}
425472
}
426473

474+
func TestFSServiceInstallRejectsNativeFSKitResourceWithOverlongSocketPath(t *testing.T) {
475+
if runtime.GOOS != "darwin" {
476+
t.Skip("native FSKit services are macOS-only")
477+
}
478+
home, storeDir, _ := fsFixture(t, true)
479+
resource := filepath.Join(string(filepath.Separator), strings.Repeat("a", 110))
480+
root := NewRootCommand()
481+
root.SetOut(&bytes.Buffer{})
482+
root.SetErr(&bytes.Buffer{})
483+
root.SetArgs([]string{
484+
"fs", "service", "install", "--frontend", "native-fskit",
485+
"--codex-home", home, "--store", storeDir, "--fskit-resource", resource,
486+
})
487+
err := root.Execute()
488+
if err == nil || !strings.Contains(err.Error(), "Unix socket path exceeds the macOS limit") {
489+
t.Fatalf("overlong native FSKit resource error = %v", err)
490+
}
491+
}
492+
427493
func TestFSServiceInstallCustomLabelUsesCustomDefinitionPath(t *testing.T) {
428494
if runtime.GOOS != "darwin" {
429495
t.Skip("custom LaunchAgent labels are macOS-only")

0 commit comments

Comments
 (0)