From 74c637fec8ab39e5ed992cebd6d223fe85ee4be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 17 Oct 2019 14:34:55 +0200 Subject: [PATCH] Improve config file parsing --- context/config_file.go | 20 +++++++++++----- context/config_file_test.go | 48 ++++++++++++++++++++++++++++++------- 2 files changed, 53 insertions(+), 15 deletions(-) diff --git a/context/config_file.go b/context/config_file.go index 0d5c02ddb..f0a6f4b81 100644 --- a/context/config_file.go +++ b/context/config_file.go @@ -1,6 +1,7 @@ package context import ( + "fmt" "io" "io/ioutil" "os" @@ -32,11 +33,18 @@ func parseConfig(r io.Reader) (*configEntry, error) { if err != nil { return nil, err } - var entries []configEntry - // TODO: this will panic if the config is malformed - err = config.Content[0].Content[1].Decode(&entries) - if err != nil { - return nil, err + if len(config.Content) < 1 { + return nil, fmt.Errorf("malformed config") } - return &entries[0], nil + for i := 0; i < len(config.Content[0].Content)-1; i = i + 2 { + if config.Content[0].Content[i].Value == defaultHostname { + var entries []configEntry + err = config.Content[0].Content[i+1].Decode(&entries) + if err != nil { + return nil, err + } + return &entries[0], nil + } + } + return nil, fmt.Errorf("could not find config entry for %q", defaultHostname) } diff --git a/context/config_file_test.go b/context/config_file_test.go index e519401c8..7163e6b2a 100644 --- a/context/config_file_test.go +++ b/context/config_file_test.go @@ -1,24 +1,54 @@ package context import ( + "errors" + "reflect" "strings" "testing" ) +func eq(t *testing.T, got interface{}, expected interface{}) { + if !reflect.DeepEqual(got, expected) { + t.Errorf("expected: %v, got: %v", expected, got) + } +} + func Test_parseConfig(t *testing.T) { c := strings.NewReader(`--- github.com: - user: monalisa oauth_token: OTOKEN + protocol: https +- user: wronguser + oauth_token: NOTTHIS `) entry, err := parseConfig(c) - if err != nil { - t.Error(err) - } - if entry.User != "monalisa" { - t.Errorf("got User: %q", entry.User) - } - if entry.Token != "OTOKEN" { - t.Errorf("got User: %q", entry.Token) - } + eq(t, err, nil) + eq(t, entry.User, "monalisa") + eq(t, entry.Token, "OTOKEN") +} + +func Test_parseConfig_multipleHosts(t *testing.T) { + c := strings.NewReader(`--- +example.com: +- user: wronguser + oauth_token: NOTTHIS +github.com: +- user: monalisa + oauth_token: OTOKEN +`) + entry, err := parseConfig(c) + eq(t, err, nil) + eq(t, entry.User, "monalisa") + eq(t, entry.Token, "OTOKEN") +} + +func Test_parseConfig_notFound(t *testing.T) { + c := strings.NewReader(`--- +example.com: +- user: wronguser + oauth_token: NOTTHIS +`) + _, err := parseConfig(c) + eq(t, err, errors.New(`could not find config entry for "github.com"`)) }