diff --git a/viper.go b/viper.go index c64094a..20abc96 100644 --- a/viper.go +++ b/viper.go @@ -1323,7 +1323,10 @@ func WriteConfig() error { return v.WriteConfig() } func (v *Viper) WriteConfig() error { filename, err := v.getConfigFile() if err != nil { - return err + filename, err = v.getDefaultConfigFile() + if err != nil { + return err + } } return v.writeConfig(filename, true) } @@ -1333,11 +1336,26 @@ func SafeWriteConfig() error { return v.SafeWriteConfig() } func (v *Viper) SafeWriteConfig() error { filename, err := v.getConfigFile() if err != nil { - return err + filename, err = v.getDefaultConfigFile() + if err != nil { + return err + } } return v.writeConfig(filename, false) } +func (v *Viper) getDefaultConfigFile() (string, error) { + if v.configName == "" { + return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)} + } + + if len(v.configPaths) == 0 { + return v.configName + "." + SupportedExts[0], nil + } else { + return filepath.Join(v.configPaths[0], v.configName+"."+SupportedExts[0]), nil + } +} + // WriteConfigAs writes current configuration to a given filename. func WriteConfigAs(filename string) error { return v.WriteConfigAs(filename) } func (v *Viper) WriteConfigAs(filename string) error { diff --git a/viper_test.go b/viper_test.go index 8dcfd1a..d19cfc5 100644 --- a/viper_test.go +++ b/viper_test.go @@ -1349,6 +1349,22 @@ func TestWriteConfigYAML(t *testing.T) { assert.Equal(t, yamlWriteExpected, read) } +func TestGetDefaultConfigFile(t *testing.T) { + v := New() + home, err := filepath.Abs("/homedir") + if err != nil { + t.Fatal(err) + } + v.AddConfigPath(home) + v.SetConfigName("c") + filename, err := v.getDefaultConfigFile() + if err != nil { + t.Fatal(err) + } + ext := "json" + assert.Equal(t, filename, filepath.Join("/homedir", "c"+"."+ext)) +} + var yamlMergeExampleTgt = []byte(` hello: pop: 37890