From df1f29b7ef8a6430215e121ad931d3192666089c Mon Sep 17 00:00:00 2001 From: Kristian Borgwarth <10348902@pm.me> Date: Thu, 2 Apr 2026 19:01:49 +0200 Subject: [PATCH] fix(file_store): remove writes on partial failure) --- cmd/main.go | 5 ++--- core/server/server.go | 2 -- persistence/store/file_store.go | 13 ++++++++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index d2efd75..4b4890f 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -9,12 +9,11 @@ import ( _ "modernc.org/sqlite" ) - func main() { server := server.NewServer() - server.Register("initialize", handlers.InitializeHandler{}) - + server.Register("initialize", handlers.InitializeHandler{}) + if err := server.Run(os.Stdin, os.Stdout); err != nil { slog.Error("server error", "error", err) } diff --git a/core/server/server.go b/core/server/server.go index 646036a..6561a5d 100644 --- a/core/server/server.go +++ b/core/server/server.go @@ -41,9 +41,7 @@ func (s *Server) Run(r io.Reader, w io.Writer) error { } s.handle(w, req) - } - return scanner.Err() } diff --git a/persistence/store/file_store.go b/persistence/store/file_store.go index 6229823..1eb94e9 100644 --- a/persistence/store/file_store.go +++ b/persistence/store/file_store.go @@ -3,7 +3,7 @@ package store import "os" type FileStore struct { - staged []stagedFile + staged []stagedFile committed []string } @@ -21,14 +21,24 @@ func (fs *FileStore) Stage(path string, data []byte) { } func (fs *FileStore) Flush() error { + originalCommittedLen := len(fs.committed) + var writtenPaths []string for _, file := range fs.staged { + if fs.fileExists(file.path) { continue } + if err := os.WriteFile(file.path, file.data, 0o644); err != nil { + for _, path := range writtenPaths { + _ = os.Remove(path) + } + fs.committed = fs.committed[:originalCommittedLen] return err } + fs.committed = append(fs.committed, file.path) + writtenPaths = append(writtenPaths, file.path) } fs.staged = nil return nil @@ -48,3 +58,4 @@ func (fs *FileStore) fileExists(path string) bool { _, err := os.Stat(path) return err == nil } +