@@ -10,57 +10,15 @@ import (
1010 "path/filepath"
1111 "runtime"
1212 "strings"
13+
14+ "github.com/perber/wiki/internal/core/shared"
1315)
1416
1517func 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-
6422func 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 }
0 commit comments