Add osutil.AtomicWriter

This captures the common pattern of writing to a temp file and moving it
to it's real name only if everything went well. It reduces the amount of
code in some places where we do this, but maybe not as much as I
expected because the upgrade thing is still a special snowflake...
This commit is contained in:
Jakob Borg
2015-07-12 01:03:40 +10:00
parent 3f3170818d
commit f0684d83e9
5 changed files with 199 additions and 42 deletions

View File

@@ -7,9 +7,7 @@
package config
import (
"io/ioutil"
"os"
"path/filepath"
"github.com/syncthing/protocol"
"github.com/syncthing/syncthing/internal/events"
@@ -283,24 +281,20 @@ func (w *Wrapper) IgnoredDevice(id protocol.DeviceID) bool {
// Save writes the configuration to disk, and generates a ConfigSaved event.
func (w *Wrapper) Save() error {
fd, err := ioutil.TempFile(filepath.Dir(w.path), "cfg")
fd, err := osutil.CreateAtomic(w.path, 0600)
if err != nil {
return err
}
defer os.Remove(fd.Name())
err = w.cfg.WriteXML(fd)
if err != nil {
if err := w.cfg.WriteXML(fd); err != nil {
fd.Close()
return err
}
err = fd.Close()
if err != nil {
if err := fd.Close(); err != nil {
return err
}
events.Default.Log(events.ConfigSaved, w.cfg)
return osutil.Rename(fd.Name(), w.path)
return nil
}