writeConfig operations are atomic

This commit is contained in:
Alessandro (Ale) Segala 2020-09-15 06:39:35 +00:00
parent d9d7dcdc63
commit b783f57e01

View file

@ -1490,17 +1490,27 @@ func (v *Viper) writeConfig(filename string, force bool) error {
if v.config == nil { if v.config == nil {
v.config = make(map[string]interface{}) v.config = make(map[string]interface{})
} }
flags := os.O_CREATE | os.O_TRUNC | os.O_WRONLY
if !force { exists, err := afero.Exists(v.fs, filename)
flags |= os.O_EXCL if err != nil {
} return err
f, err := v.fs.OpenFile(filename, flags, v.configPermissions) }
if exists && !force {
return fmt.Errorf("file already exists: %s", filename)
}
f, err := afero.TempFile(v.fs, filepath.Dir(filename), filepath.Base(filename)+"-")
if err != nil { if err != nil {
return err return err
} }
defer f.Close()
if err := v.marshalWriter(f, configType); err != nil { if err := v.marshalWriter(f, configType); err != nil {
f.Close()
return err
}
f.Close()
err = v.fs.Rename(f.Name(), filename)
if err != nil {
return err return err
} }