Skip to content

Commit 56c871e

Browse files
committed
fix: use shared write file atomic
1 parent 06e23b9 commit 56c871e

File tree

2 files changed

+8
-50
lines changed

2 files changed

+8
-50
lines changed

internal/core/tree/node_store.go

Lines changed: 7 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -10,57 +10,15 @@ import (
1010
"path/filepath"
1111
"runtime"
1212
"strings"
13+
14+
"github.com/perber/wiki/internal/core/shared"
1315
)
1416

1517
func fileExists(p string) bool {
1618
_, err := os.Stat(p)
1719
return err == nil
1820
}
1921

20-
// writeFileAtomic writes data to filename atomically by writing to a temp file
21-
// in the same directory and then renaming it over the target.
22-
func writeFileAtomic(filename string, data []byte, perm os.FileMode) error {
23-
dir := filepath.Dir(filename)
24-
25-
tmpFile, err := os.CreateTemp(dir, ".tmp-*")
26-
if err != nil {
27-
return fmt.Errorf("create temp file: %w", err)
28-
}
29-
30-
tmpName := tmpFile.Name()
31-
// Ensure the temp file is removed in case of an error
32-
defer func() {
33-
_ = os.Remove(tmpName)
34-
}()
35-
36-
if perm != 0 {
37-
if err := tmpFile.Chmod(perm); err != nil {
38-
tmpFile.Close()
39-
return fmt.Errorf("chmod temp file: %w", err)
40-
}
41-
}
42-
43-
if _, err := tmpFile.Write(data); err != nil {
44-
tmpFile.Close()
45-
return fmt.Errorf("write temp file: %w", err)
46-
}
47-
48-
if err := tmpFile.Sync(); err != nil {
49-
tmpFile.Close()
50-
return fmt.Errorf("sync temp file: %w", err)
51-
}
52-
53-
if err := tmpFile.Close(); err != nil {
54-
return fmt.Errorf("close temp file: %w", err)
55-
}
56-
57-
if err := atomicReplace(tmpName, filename); err != nil {
58-
return fmt.Errorf("replace temp file: %w", err)
59-
}
60-
61-
return nil
62-
}
63-
6422
func atomicReplace(src, dst string) error {
6523
// On Windows, os.Rename fails if dst already exists.
6624
// On Unix, Rename is atomic and replaces dst.
@@ -152,7 +110,7 @@ func (f *NodeStore) SaveTree(filename string, tree *PageNode) error {
152110
return fmt.Errorf("could not marshal tree: %w", err)
153111
}
154112

155-
if err := writeFileAtomic(fullPath, data, 0o644); err != nil {
113+
if err := shared.WriteFileAtomic(fullPath, data, 0o644); err != nil {
156114
return fmt.Errorf("could not atomically write tree file: %w", err)
157115
}
158116

@@ -207,7 +165,7 @@ func (f *NodeStore) CreatePage(parentEntry *PageNode, newEntry *PageNode) error
207165
return fmt.Errorf("could not build markdown with frontmatter: %w", err)
208166
}
209167

210-
if err := writeFileAtomic(destFile, []byte(md), 0o644); err != nil {
168+
if err := shared.WriteFileAtomic(destFile, []byte(md), 0o644); err != nil {
211169
return fmt.Errorf("could not create file: %w", err)
212170
}
213171

@@ -287,7 +245,7 @@ func (f *NodeStore) UpsertContent(entry *PageNode, content string) error {
287245
if err != nil {
288246
return fmt.Errorf("could not build markdown with frontmatter: %w", err)
289247
}
290-
if err := writeFileAtomic(filePath, []byte(contentWithFM), mode); err != nil {
248+
if err := shared.WriteFileAtomic(filePath, []byte(contentWithFM), mode); err != nil {
291249
return fmt.Errorf("could not write to file atomically: %w", err)
292250
}
293251

@@ -630,7 +588,7 @@ func (f *NodeStore) SyncFrontmatterIfExists(entry *PageNode) error {
630588
mode = st.Mode()
631589
}
632590

633-
if err := writeFileAtomic(filePath, []byte(out), mode); err != nil {
591+
if err := shared.WriteFileAtomic(filePath, []byte(out), mode); err != nil {
634592
return fmt.Errorf("write file atomically: %w", err)
635593
}
636594
return nil
@@ -818,7 +776,7 @@ func (f *NodeStore) ConvertNode(entry *PageNode, target NodeKind) error {
818776
if err != nil {
819777
return err
820778
}
821-
if err := writeFileAtomic(filePath, []byte(md), 0o644); err != nil {
779+
if err := shared.WriteFileAtomic(filePath, []byte(md), 0o644); err != nil {
822780
return fmt.Errorf("could not write page file: %w", err)
823781
}
824782
}

internal/core/tree/tree_service.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ func (t *TreeService) migrateToV2() error {
233233
return fmt.Errorf("could not determine content path for node %s: %w", node.ID, err)
234234
}
235235

236-
if err := writeFileAtomic(filePath, []byte(newContent), 0o644); err != nil {
236+
if err := shared.WriteFileAtomic(filePath, []byte(newContent), 0o644); err != nil {
237237
t.log.Error("could not write updated page content", "nodeID", node.ID, "filePath", filePath, "error", err)
238238
return fmt.Errorf("could not write updated page content for node %s: %w", node.ID, err)
239239
}

0 commit comments

Comments
 (0)