X Tutup
Skip to content

Commit 562f1b3

Browse files
author
nate smith
committed
add GetOrDefault functionality to config
1 parent eaa64df commit 562f1b3

File tree

33 files changed

+115
-57
lines changed

33 files changed

+115
-57
lines changed

internal/config/config_file_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ hosts:
2222
`, "")()
2323
config, err := parseConfig("config.yml")
2424
assert.NoError(t, err)
25-
user, err := config.Get("github.com", "user")
25+
user, err := config.GetOrDefault("github.com", "user")
2626
assert.NoError(t, err)
2727
assert.Equal(t, "monalisa", user)
28-
token, err := config.Get("github.com", "oauth_token")
28+
token, err := config.GetOrDefault("github.com", "oauth_token")
2929
assert.NoError(t, err)
3030
assert.Equal(t, "OTOKEN", token)
3131
}
@@ -42,10 +42,10 @@ hosts:
4242
`, "")()
4343
config, err := parseConfig("config.yml")
4444
assert.NoError(t, err)
45-
user, err := config.Get("github.com", "user")
45+
user, err := config.GetOrDefault("github.com", "user")
4646
assert.NoError(t, err)
4747
assert.Equal(t, "monalisa", user)
48-
token, err := config.Get("github.com", "oauth_token")
48+
token, err := config.GetOrDefault("github.com", "oauth_token")
4949
assert.NoError(t, err)
5050
assert.Equal(t, "OTOKEN", token)
5151
}
@@ -58,10 +58,10 @@ github.com:
5858
`)()
5959
config, err := parseConfig("config.yml")
6060
assert.NoError(t, err)
61-
user, err := config.Get("github.com", "user")
61+
user, err := config.GetOrDefault("github.com", "user")
6262
assert.NoError(t, err)
6363
assert.Equal(t, "monalisa", user)
64-
token, err := config.Get("github.com", "oauth_token")
64+
token, err := config.GetOrDefault("github.com", "oauth_token")
6565
assert.NoError(t, err)
6666
assert.Equal(t, "OTOKEN", token)
6767
}
@@ -80,13 +80,13 @@ example.com:
8080
`)()
8181
config, err := parseConfig("config.yml")
8282
assert.NoError(t, err)
83-
val, err := config.Get("example.com", "git_protocol")
83+
val, err := config.GetOrDefault("example.com", "git_protocol")
8484
assert.NoError(t, err)
8585
assert.Equal(t, "https", val)
86-
val, err = config.Get("github.com", "git_protocol")
86+
val, err = config.GetOrDefault("github.com", "git_protocol")
8787
assert.NoError(t, err)
8888
assert.Equal(t, "ssh", val)
89-
val, err = config.Get("nonexistent.io", "git_protocol")
89+
val, err = config.GetOrDefault("nonexistent.io", "git_protocol")
9090
assert.NoError(t, err)
9191
assert.Equal(t, "ssh", val)
9292
}

internal/config/config_type.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import (
99
// This interface describes interacting with some persistent configuration for gh.
1010
type Config interface {
1111
Get(string, string) (string, error)
12+
GetOrDefault(string, string) (string, error)
1213
GetWithSource(string, string) (string, string, error)
14+
GetOrDefaultWithSource(string, string) (string, string, error)
15+
Default(string) string
1316
Set(string, string, string) error
1417
UnsetHost(string)
1518
Hosts() ([]string, error)

internal/config/config_type_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ func Test_defaultConfig(t *testing.T) {
5858
assert.Equal(t, expected, mainBuf.String())
5959
assert.Equal(t, "", hostsBuf.String())
6060

61-
proto, err := cfg.Get("", "git_protocol")
61+
proto, err := cfg.GetOrDefault("", "git_protocol")
6262
assert.NoError(t, err)
6363
assert.Equal(t, "https", proto)
6464

65-
editor, err := cfg.Get("", "editor")
65+
editor, err := cfg.GetOrDefault("", "editor")
6666
assert.NoError(t, err)
6767
assert.Equal(t, "", editor)
6868

@@ -72,7 +72,7 @@ func Test_defaultConfig(t *testing.T) {
7272
expansion, _ := aliases.Get("co")
7373
assert.Equal(t, expansion, "pr checkout")
7474

75-
browser, err := cfg.Get("", "browser")
75+
browser, err := cfg.GetOrDefault("", "browser")
7676
assert.NoError(t, err)
7777
assert.Equal(t, "", browser)
7878
}

internal/config/from_env.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,24 @@ func (c *envConfig) GetWithSource(hostname, key string) (string, string, error)
7676
return c.Config.GetWithSource(hostname, key)
7777
}
7878

79+
func (c *envConfig) GetOrDefault(hostname, key string) (val string, err error) {
80+
val, _, err = c.GetOrDefaultWithSource(hostname, key)
81+
return
82+
}
83+
84+
func (c *envConfig) GetOrDefaultWithSource(hostname, key string) (val string, src string, err error) {
85+
val, src, err = c.GetWithSource(hostname, key)
86+
if err == nil && val == "" {
87+
val = c.Default(key)
88+
}
89+
90+
return
91+
}
92+
93+
func (c *envConfig) Default(key string) string {
94+
return c.Config.Default(key)
95+
}
96+
7997
func (c *envConfig) CheckWriteable(hostname, key string) error {
8098
if hostname != "" && key == "oauth_token" {
8199
if token, env := AuthTokenFromEnv(hostname); token != "" {

internal/config/from_env_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,11 @@ func TestInheritEnv(t *testing.T) {
301301
hosts, _ := cfg.Hosts()
302302
assert.Equal(t, tt.wants.hosts, hosts)
303303

304-
val, source, _ := cfg.GetWithSource(tt.hostname, "oauth_token")
304+
val, source, _ := cfg.GetOrDefaultWithSource(tt.hostname, "oauth_token")
305305
assert.Equal(t, tt.wants.token, val)
306306
assert.Regexp(t, tt.wants.source, source)
307307

308-
val, _ = cfg.Get(tt.hostname, "oauth_token")
308+
val, _ = cfg.GetOrDefault(tt.hostname, "oauth_token")
309309
assert.Equal(t, tt.wants.token, val)
310310

311311
err := cfg.CheckWriteable(tt.hostname, "oauth_token")

internal/config/from_file.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,11 +65,24 @@ func (c *fileConfig) GetWithSource(hostname, key string) (string, string, error)
6565
return "", defaultSource, err
6666
}
6767

68-
if value == "" {
69-
return defaultFor(key), defaultSource, nil
68+
return value, defaultSource, nil
69+
}
70+
71+
func (c *fileConfig) GetOrDefault(hostname, key string) (val string, err error) {
72+
val, _, err = c.GetOrDefaultWithSource(hostname, key)
73+
return
74+
}
75+
76+
func (c *fileConfig) GetOrDefaultWithSource(hostname, key string) (val string, src string, err error) {
77+
val, src, err = c.GetWithSource(hostname, key)
78+
if err != nil && val == "" {
79+
val = c.Default(key)
7080
}
81+
return
82+
}
7183

72-
return value, defaultSource, nil
84+
func (c *fileConfig) Default(key string) string {
85+
return defaultFor(key)
7386
}
7487

7588
func (c *fileConfig) Set(hostname, key, value string) error {

internal/config/stub.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,24 @@ func (c ConfigStub) GetWithSource(host, key string) (string, string, error) {
2525
return "", "", errors.New("not found")
2626
}
2727

28+
func (c ConfigStub) GetOrDefault(hostname, key string) (val string, err error) {
29+
val, _, err = c.GetOrDefaultWithSource(hostname, key)
30+
return
31+
}
32+
33+
func (c ConfigStub) GetOrDefaultWithSource(hostname, key string) (val string, src string, err error) {
34+
val, src, err = c.GetWithSource(hostname, key)
35+
if err == nil && val == "" {
36+
val = c.Default(key)
37+
}
38+
return
39+
}
40+
41+
func (c ConfigStub) Default(key string) string {
42+
// TODO may regret this
43+
return defaultFor(key)
44+
}
45+
2846
func (c ConfigStub) Set(host, key, value string) error {
2947
c[genKey(host, key)] = value
3048
return nil

pkg/cmd/auth/gitcredential/helper.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
const tokenUser = "x-access-token"
1515

1616
type config interface {
17-
GetWithSource(string, string) (string, string, error)
17+
GetOrDefaultWithSource(string, string) (string, string, error)
1818
}
1919

2020
type CredentialOptions struct {
@@ -101,11 +101,11 @@ func helperRun(opts *CredentialOptions) error {
101101
}
102102

103103
var gotUser string
104-
gotToken, source, _ := cfg.GetWithSource(wants["host"], "oauth_token")
104+
gotToken, source, _ := cfg.GetOrDefaultWithSource(wants["host"], "oauth_token")
105105
if strings.HasSuffix(source, "_TOKEN") {
106106
gotUser = tokenUser
107107
} else {
108-
gotUser, _, _ = cfg.GetWithSource(wants["host"], "user")
108+
gotUser, _, _ = cfg.GetOrDefaultWithSource(wants["host"], "user")
109109
}
110110

111111
if gotUser == "" || gotToken == "" {

pkg/cmd/auth/gitcredential/helper_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,18 @@ import (
88
"github.com/cli/cli/v2/pkg/iostreams"
99
)
1010

11+
// why not just use the config stub argh
1112
type tinyConfig map[string]string
1213

13-
func (c tinyConfig) GetWithSource(host, key string) (string, string, error) {
14+
func (c tinyConfig) GetOrDefaultWithSource(host, key string) (string, string, error) {
1415
return c[fmt.Sprintf("%s:%s", host, key)], c["_source"], nil
1516
}
1617

18+
func (c tinyConfig) GetOrDefault(host, key string) (val string, err error) {
19+
val, _, err = c.GetOrDefaultWithSource(host, key)
20+
return
21+
}
22+
1723
func Test_helperRun(t *testing.T) {
1824
tests := []struct {
1925
name string

pkg/cmd/auth/login/login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func loginRun(opts *LoginOptions) error {
165165
return cfg.Write()
166166
}
167167

168-
existingToken, _ := cfg.Get(hostname, "oauth_token")
168+
existingToken, _ := cfg.GetOrDefault(hostname, "oauth_token")
169169
if existingToken != "" && opts.Interactive {
170170
if err := shared.HasMinimumScopes(httpClient, hostname, existingToken); err == nil {
171171
var keepGoing bool

0 commit comments

Comments
 (0)
X Tutup