Skip to content

Commit 957c061

Browse files
authored
feat: support setting proxy and provider for setup sub-command (#397)
1 parent 8f63471 commit 957c061

File tree

4 files changed

+124
-27
lines changed

4 files changed

+124
-27
lines changed

cmd/setup.go

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,49 +24,52 @@ func newSetupCommand(v *viper.Viper, stdio terminal.Stdio) (cmd *cobra.Command)
2424
RunE: opt.runE,
2525
GroupID: configGroup.ID,
2626
}
27+
flags := cmd.Flags()
28+
flags.StringVarP(&opt.proxy, "proxy", "p", "", "The proxy of GitHub")
29+
flags.StringVarP(&opt.provider, "provider", "", "", "The provider of hd configuration")
2730
return
2831
}
2932

3033
type setupOption struct {
3134
stdio terminal.Stdio
3235
v *viper.Viper
36+
37+
proxy string
38+
provider string
3339
}
3440

3541
func (o *setupOption) runE(cmd *cobra.Command, args []string) (err error) {
36-
var (
37-
proxyGitHub string
38-
provider string
39-
)
40-
4142
logger := log.GetLoggerFromContextOrDefault(cmd)
42-
if proxyGitHub, err = selectFromList([]string{"", "ghproxy.com", "gh.api.99988866.xyz", "mirror.ghproxy.com"},
43-
o.v.GetString("proxy-github"),
44-
"Select proxy-github", o.stdio); err == nil {
45-
o.v.Set("proxy-github", proxyGitHub)
46-
} else {
47-
return
43+
44+
if o.proxy == "" {
45+
if o.proxy, err = selectFromList([]string{"", "ghproxy.com", "gh.api.99988866.xyz", "mirror.ghproxy.com"},
46+
o.v.GetString("proxy-github"),
47+
"Select proxy-github", o.stdio); err != nil {
48+
return
49+
}
4850
}
51+
o.v.Set("proxy-github", o.proxy)
4952

50-
if provider, err = selectFromList([]string{"github", "gitee"}, o.v.GetString("provider"),
51-
"Select provider", o.stdio); err == nil {
52-
o.v.Set("provider", provider)
53-
} else {
54-
return
53+
if o.provider == "" {
54+
if o.provider, err = selectFromList([]string{"github", "gitee"}, o.v.GetString("provider"),
55+
"Select provider", o.stdio); err != nil {
56+
return
57+
}
5558
}
59+
o.v.Set("provider", o.provider)
5660

5761
var configDir string
5862
fetcher := &installer.DefaultFetcher{}
59-
if configDir, err = fetcher.GetHomeDir(); err != nil {
60-
return
61-
}
62-
if err = os.MkdirAll(configDir, 0750); err != nil {
63-
err = fmt.Errorf("failed to create directory: %s, error: %v", configDir, err)
64-
return
65-
}
63+
if configDir, err = fetcher.GetHomeDir(); err == nil {
64+
if err = os.MkdirAll(configDir, 0750); err != nil {
65+
err = fmt.Errorf("failed to create directory: %s, error: %v", configDir, err)
66+
return
67+
}
6668

67-
configPath := filepath.Join(configDir, ".config", "hd.yaml")
68-
logger.Info("write config into:", configPath)
69-
err = o.v.WriteConfigAs(configPath)
69+
configPath := filepath.Join(configDir, ".config", "hd.yaml")
70+
logger.Info("write config into:", configPath)
71+
err = o.v.WriteConfigAs(configPath)
72+
}
7073
return
7174
}
7275

cmd/setup_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package cmd
22

33
import (
4+
"context"
45
"testing"
56

67
"github.com/AlecAivazis/survey/v2/terminal"
78
expect "github.com/Netflix/go-expect"
89
pseudotty "github.com/creack/pty"
910
"github.com/hinshun/vt10x"
11+
"github.com/linuxsuren/http-downloader/pkg/log"
1012
"github.com/spf13/afero"
1113
"github.com/spf13/viper"
1214
"github.com/stretchr/testify/assert"
@@ -65,6 +67,28 @@ func Test_newSetupCommand(t *testing.T) {
6567
return err
6668
})
6769
})
70+
71+
t.Run("setup with given flags", func(t *testing.T) {
72+
RunTest(t, func(c expectConsole) {
73+
}, func(tr terminal.Stdio) error {
74+
fs := afero.NewMemMapFs()
75+
v := viper.New()
76+
v.SetFs(fs)
77+
v.Set("provider", "gitee")
78+
v.Set("proxy-github", "gh.api.99988866.xyz")
79+
80+
cmd := newSetupCommand(v, tr)
81+
assert.Equal(t, "setup", cmd.Name())
82+
cmd.SetArgs([]string{"--proxy", "fake.com", "--provider", "fake"})
83+
cmd.SetContext(log.NewContextWithLogger(context.Background(), 0))
84+
85+
err := cmd.Execute()
86+
assert.Nil(t, err)
87+
assert.Equal(t, "fake.com", v.GetString("proxy-github"))
88+
assert.Equal(t, "fake", v.GetString("provider"))
89+
return err
90+
})
91+
})
6892
}
6993

7094
func TestSelectFromList(t *testing.T) {

pkg/log/level.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package log
22

33
import (
44
"context"
5+
"io"
56
syslog "log"
67
)
78

@@ -27,6 +28,23 @@ func (l *LevelLog) Debug(v ...any) {
2728
}
2829
}
2930

31+
// SetLevel sets the level of logger
32+
func (l *LevelLog) SetLevel(level int) *LevelLog {
33+
l.level = level
34+
return l
35+
}
36+
37+
// GetLevel returns the level of logger
38+
func (l *LevelLog) GetLevel() int {
39+
return l.level
40+
}
41+
42+
// SetOutput sets the output destination for the logger.
43+
func (l *LevelLog) SetOutput(writer io.Writer) *LevelLog {
44+
l.Logger.SetOutput(writer)
45+
return l
46+
}
47+
3048
// LoggerContext used to get and set context value
3149
type LoggerContext string
3250

@@ -51,13 +69,19 @@ func GetLoggerFromContextOrDefault(aware ContextAware) (logger *LevelLog) {
5169
if !ok {
5270
logger = GetLogger()
5371
}
54-
logger.level = 3
5572
return
5673
}
5774

5875
// GetLogger returns an instance of Logger
5976
func GetLogger() *LevelLog {
6077
return &LevelLog{
6178
Logger: syslog.Default(),
79+
level: 3,
6280
}
6381
}
82+
83+
// NewContextWithLogger returns a new context with given logger level
84+
func NewContextWithLogger(ctx context.Context, level int) context.Context {
85+
logger := GetLogger().SetLevel(level)
86+
return context.WithValue(ctx, LoggerContextKey, logger)
87+
}

pkg/log/level_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package log_test
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"testing"
7+
8+
"github.com/linuxsuren/http-downloader/pkg/log"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestLogger(t *testing.T) {
13+
t.Run("default level", func(t *testing.T) {
14+
logger := log.GetLoggerFromContextOrDefault(&fakeContextAwareObj{})
15+
assert.Equal(t, 3, logger.GetLevel())
16+
17+
logger = log.GetLoggerFromContextOrDefault(&fakeContextAwareObj{ctx: context.Background()})
18+
assert.Equal(t, 3, logger.GetLevel())
19+
20+
ctx := log.NewContextWithLogger(context.Background(), 5)
21+
logger = log.GetLoggerFromContextOrDefault(&fakeContextAwareObj{ctx: ctx})
22+
assert.Equal(t, 5, logger.GetLevel())
23+
})
24+
25+
t.Run("print in different level", func(t *testing.T) {
26+
buf := new(bytes.Buffer)
27+
logger := log.GetLogger().SetOutput(buf)
28+
29+
logger.Debug("debug")
30+
logger.Info("info")
31+
32+
assert.Contains(t, buf.String(), "info")
33+
34+
logger.SetLevel(7)
35+
logger.Debug("debug")
36+
assert.Contains(t, buf.String(), "debug")
37+
})
38+
}
39+
40+
type fakeContextAwareObj struct {
41+
ctx context.Context
42+
}
43+
44+
func (f *fakeContextAwareObj) Context() context.Context {
45+
return f.ctx
46+
}

0 commit comments

Comments
 (0)