Merge pull request #1304 from cli/missing-config-file

Support `hosts.yml` existing while `config.yml` does not
This commit is contained in:
Mislav Marohnić 2020-07-07 10:34:35 +02:00 committed by GitHub
commit d0342a42d8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 11 deletions

View file

@ -138,7 +138,11 @@ func migrateConfig(filename string) error {
func ParseConfig(filename string) (Config, error) {
_, root, err := parseConfigFile(filename)
if err != nil {
return nil, err
if os.IsNotExist(err) {
root = NewBlankRoot()
} else {
return nil, err
}
}
if isLegacy(root) {

View file

@ -110,14 +110,36 @@ github.com:
}
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, "")()
tests := []struct {
contents string
wantsErr bool
}{
{
contents: "",
wantsErr: true,
},
{
contents: " ",
wantsErr: false,
},
{
contents: "\n",
wantsErr: false,
},
}
for _, tt := range tests {
t.Run(fmt.Sprintf("contents: %q", tt.contents), func(t *testing.T) {
defer StubConfig(tt.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)
if tt.wantsErr != (err != nil) {
t.Fatalf("got error: %v", err)
}
if tt.wantsErr {
return
}
assert.Equal(t, yaml.MappingNode, yamlRoot.Content[0].Kind)
assert.Equal(t, 0, len(yamlRoot.Content[0].Content))
})
}
}

View file

@ -123,7 +123,11 @@ func NewConfig(root *yaml.Node) Config {
}
func NewBlankConfig() Config {
return NewConfig(&yaml.Node{
return NewConfig(NewBlankRoot())
}
func NewBlankRoot() *yaml.Node {
return &yaml.Node{
Kind: yaml.DocumentNode,
Content: []*yaml.Node{
{
@ -168,7 +172,7 @@ func NewBlankConfig() Config {
},
},
},
})
}
}
// This type implements a Config interface and represents a config file on disk.

View file

@ -42,7 +42,11 @@ func StubConfig(main, hosts string) func() {
ReadConfigFile = func(fn string) ([]byte, error) {
switch path.Base(fn) {
case "config.yml":
return []byte(main), nil
if main == "" {
return []byte(nil), os.ErrNotExist
} else {
return []byte(main), nil
}
case "hosts.yml":
if hosts == "" {
return []byte(nil), os.ErrNotExist