Skip to content

Commit 00e6843

Browse files
authored
Merge pull request #1359 from tsuna/master
cli/config/configfile: Atomically rewrite the config file when saving.
2 parents 8ec2156 + 7e9e2c1 commit 00e6843

2 files changed

Lines changed: 22 additions & 4 deletions

File tree

cli/config/configfile/file.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,21 @@ func (configFile *ConfigFile) Save() error {
175175
return errors.Errorf("Can't save config with empty filename")
176176
}
177177

178-
if err := os.MkdirAll(filepath.Dir(configFile.Filename), 0700); err != nil {
178+
dir := filepath.Dir(configFile.Filename)
179+
if err := os.MkdirAll(dir, 0700); err != nil {
179180
return err
180181
}
181-
f, err := os.OpenFile(configFile.Filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
182+
temp, err := ioutil.TempFile(dir, filepath.Base(configFile.Filename))
182183
if err != nil {
183184
return err
184185
}
185-
defer f.Close()
186-
return configFile.SaveToWriter(f)
186+
err = configFile.SaveToWriter(temp)
187+
temp.Close()
188+
if err != nil {
189+
os.Remove(temp.Name())
190+
return err
191+
}
192+
return os.Rename(temp.Name(), configFile.Filename)
187193
}
188194

189195
// ParseProxyConfig computes proxy configuration by retrieving the config for the provided host and

cli/config/configfile/file_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package configfile
22

33
import (
44
"fmt"
5+
"io/ioutil"
6+
"os"
57
"testing"
68

79
"github.com/docker/cli/cli/config/credentials"
@@ -413,3 +415,13 @@ func TestCheckKubernetesConfigurationRaiseAnErrorOnInvalidValue(t *testing.T) {
413415
}
414416
}
415417
}
418+
419+
func TestSave(t *testing.T) {
420+
configFile := New("test-save")
421+
defer os.Remove("test-save")
422+
err := configFile.Save()
423+
assert.NilError(t, err)
424+
cfg, err := ioutil.ReadFile("test-save")
425+
assert.NilError(t, err)
426+
assert.Check(t, is.Equal(string(cfg), "{\n \"auths\": {}\n}"))
427+
}

0 commit comments

Comments
 (0)