diff --git a/internal/config/config_file.go b/internal/config/config_file.go index 720b86b6e..ff10d446f 100644 --- a/internal/config/config_file.go +++ b/internal/config/config_file.go @@ -76,8 +76,11 @@ func parseConfigFile(fn string) ([]byte, *yaml.Node, error) { if err != nil { return data, nil, err } - if len(root.Content) < 1 { - return data, &root, fmt.Errorf("malformed config") + if len(root.Content) == 0 { + return data, &yaml.Node{ + Kind: yaml.DocumentNode, + Content: []*yaml.Node{{Kind: yaml.MappingNode}}, + }, nil } if root.Content[0].Kind != yaml.MappingNode { return data, &root, fmt.Errorf("expected a top level map") diff --git a/internal/config/config_file_test.go b/internal/config/config_file_test.go index 28d50a37e..441dc22f2 100644 --- a/internal/config/config_file_test.go +++ b/internal/config/config_file_test.go @@ -3,6 +3,7 @@ package config import ( "bytes" "errors" + "fmt" "reflect" "testing" @@ -94,3 +95,16 @@ github.com: eq(t, buf.String(), expected) } + +func Test_parseConfigFile(t *testing.T) { + fileContents := []string{"", " ", "\n"} + for _, contents := range fileContents { + t.Run(fmt.Sprintf("contents: %q", contents), func(t *testing.T) { + defer StubConfig(contents, "")() + _, yamlRoot, err := parseConfigFile("config.yml") + eq(t, err, nil) + eq(t, yamlRoot.Content[0].Kind, yaml.MappingNode) + eq(t, len(yamlRoot.Content[0].Content), 0) + }) + } +} diff --git a/internal/config/config_type.go b/internal/config/config_type.go index b45ca554b..c2fc66d9b 100644 --- a/internal/config/config_type.go +++ b/internal/config/config_type.go @@ -1,6 +1,7 @@ package config import ( + "bytes" "errors" "fmt" @@ -172,6 +173,10 @@ func (c *fileConfig) Write() error { return err } + if bytes.Equal(marshalled, []byte("{}\n")) { + marshalled = []byte{} + } + return WriteConfigFile(ConfigFile(), marshalled) } diff --git a/internal/config/config_type_test.go b/internal/config/config_type_test.go index eb0747571..97ffd9aa7 100644 --- a/internal/config/config_type_test.go +++ b/internal/config/config_type_test.go @@ -27,3 +27,13 @@ hosts: editor: vim `, cb.String()) } + +func Test_fileConfig_Write(t *testing.T) { + cb := bytes.Buffer{} + StubWriteConfig(&cb, nil) + + c := NewBlankConfig() + assert.NoError(t, c.Write()) + + assert.Equal(t, "", cb.String()) +}