Skip to content

Commit c89033d

Browse files
authored
Merge pull request #2 from f1monkey/fix/file-save
Use atomic file writes for save operations
2 parents cae3cb6 + 37d4738 commit c89033d

1 file changed

Lines changed: 36 additions & 3 deletions

File tree

internal/spellchecker/save_load.go

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,26 @@ func (r *Registry) doSave(code string) error {
7070
return err
7171
}
7272

73-
err = os.WriteFile(path.Join(r.dir, fileName(code)), data, 0644)
73+
dstPath := path.Join(r.dir, fileName(code))
74+
75+
tmpFile, err := os.CreateTemp(r.dir, fileName(code)+".tmp-*")
7476
if err != nil {
7577
return err
7678
}
79+
tmpName := tmpFile.Name()
7780

78-
return nil
81+
if _, err := tmpFile.Write(data); err != nil {
82+
tmpFile.Close()
83+
os.Remove(tmpName)
84+
return err
85+
}
86+
87+
if err := tmpFile.Close(); err != nil {
88+
os.Remove(tmpName)
89+
return err
90+
}
91+
92+
return os.Rename(tmpName, dstPath)
7993
}
8094

8195
func (r *Registry) doLoad(code string) (RegistryItem, error) {
@@ -112,5 +126,24 @@ func (r *Registry) doSaveMetadata() error {
112126
return err
113127
}
114128

115-
return os.WriteFile(path.Join(r.dir, metadataFile), data, 0644)
129+
dstPath := path.Join(r.dir, metadataFile)
130+
131+
tmpFile, err := os.CreateTemp(r.dir, metadataFile+".tmp-*")
132+
if err != nil {
133+
return err
134+
}
135+
tmpName := tmpFile.Name()
136+
137+
if _, err := tmpFile.Write(data); err != nil {
138+
tmpFile.Close()
139+
os.Remove(tmpName)
140+
return err
141+
}
142+
143+
if err := tmpFile.Close(); err != nil {
144+
os.Remove(tmpName)
145+
return err
146+
}
147+
148+
return os.Rename(tmpName, dstPath)
116149
}

0 commit comments

Comments
 (0)