diff --git a/config.go b/config.go index 97f38e0..00e24d6 100644 --- a/config.go +++ b/config.go @@ -90,13 +90,6 @@ func SaveConfig(url, token string) error { // _ = url // _ = token func ResolveConfig(flagURL, flagToken string) (url, token string, err error) { - if fileURL, fileToken, fileErr := readConfigFile(); fileErr != nil { - return "", "", fileErr - } else { - url = fileURL - token = fileToken - } - if envURL, ok := os.LookupEnv("FORGE_URL"); ok && envURL != "" { url = envURL } @@ -110,6 +103,18 @@ func ResolveConfig(flagURL, flagToken string) (url, token string, err error) { if flagToken != "" { token = flagToken } + if url == "" || token == "" { + fileURL, fileToken, fileErr := readConfigFile() + if fileErr != nil { + return "", "", fileErr + } + if url == "" { + url = fileURL + } + if token == "" { + token = fileToken + } + } if url == "" { url = DefaultURL } diff --git a/config_test.go b/config_test.go index f0326d0..1263e42 100644 --- a/config_test.go +++ b/config_test.go @@ -111,6 +111,32 @@ func TestResolveConfig_EnvOverridesConfig_Good(t *testing.T) { } } +func TestResolveConfig_FlagOverridesBrokenConfig_Good(t *testing.T) { + home := t.TempDir() + t.Setenv("HOME", home) + t.Setenv("FORGE_URL", "") + t.Setenv("FORGE_TOKEN", "") + + cfgPath := filepath.Join(home, ".config", "forge", "config.json") + if err := coreio.Local.EnsureDir(filepath.Dir(cfgPath)); err != nil { + t.Fatal(err) + } + if err := coreio.Local.WriteMode(cfgPath, "{not-json", 0600); err != nil { + t.Fatal(err) + } + + url, token, err := ResolveConfig("https://flag.example.com", "flag-token") + if err != nil { + t.Fatal(err) + } + if url != "https://flag.example.com" { + t.Errorf("got url=%q", url) + } + if token != "flag-token" { + t.Errorf("got token=%q", token) + } +} + func TestNewForgeFromConfig_NoToken_Bad(t *testing.T) { t.Setenv("HOME", t.TempDir()) t.Setenv("FORGE_URL", "")