Skip to content

Commit b878e3c

Browse files
theThomasxiantang
authored
Fix command line argument handling for slice configuration parameters (#299)
* Fix command line argument handling for slice configuration parameters (comma separated list). * Update READMEs. * Add unset value * extend waiting * don't need export unsetDefault Co-authored-by: Thomas <[email protected]> Co-authored-by: xiantang <[email protected]>
1 parent 2ffc212 commit b878e3c

8 files changed

+51
-8
lines changed

README-zh_cn.md

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ Air 是为 Go 应用开发设计的另外一个热重载的命令行工具。只
3030

3131
`air --build.cmd "go build -o bin/api cmd/run.go" --build.bin "./bin/api"`
3232

33+
对于以列表形式输入的参数,使用逗号来分隔项目:
34+
35+
`air --build.cmd "go build -o bin/api cmd/run.go" --build.bin "./bin/api" --build.exclude_dir "templates,build"`
36+
3337
## 安装
3438

3539
### 推荐使用 install.sh

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ if you just want to config build command and run command, you can use like follo
3434

3535
`air --build.cmd "go build -o bin/api cmd/run.go" --build.bin "./bin/api"`
3636

37+
use a comma to separate items for arguments that take a list as input:
38+
39+
`air --build.cmd "go build -o bin/api cmd/run.go" --build.bin "./bin/api" --build.exclude_dir "templates,build"`
40+
3741
## Installation
3842

3943
### Prefer install.sh

runner/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func (c *Config) rel(path string) string {
321321
// WithArgs returns a new config with the given arguments added to the configuration.
322322
func (c *Config) WithArgs(args map[string]TomlInfo) {
323323
for _, value := range args {
324-
if value.Value != nil && *value.Value != "" {
324+
if value.Value != nil && *value.Value != unsetDefault {
325325
v := reflect.ValueOf(c)
326326
setValue2Struct(v, value.fieldPath, *value.Value)
327327
}

runner/engine_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -563,7 +563,7 @@ func TestRebuildWhenRunCmdUsingDLV(t *testing.T) {
563563
go func() {
564564
engine.Run()
565565
}()
566-
if err := waitingPortReady(t, port, time.Second*20); err != nil {
566+
if err := waitingPortReady(t, port, time.Second*40); err != nil {
567567
t.Fatalf("Should not be fail: %s.", err)
568568
}
569569

@@ -588,7 +588,7 @@ func TestRebuildWhenRunCmdUsingDLV(t *testing.T) {
588588
}
589589
t.Logf("connection refused")
590590
time.Sleep(time.Second * 2)
591-
err = waitingPortReady(t, port, time.Second*20)
591+
err = waitingPortReady(t, port, time.Second*40)
592592
if err != nil {
593593
t.Fatalf("Should not be fail: %s.", err)
594594
}

runner/flag.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import (
44
"flag"
55
)
66

7+
const unsetDefault = "DEFAULT"
8+
79
// ParseConfigFlag parse toml information for flag
810
func ParseConfigFlag(f *flag.FlagSet) map[string]TomlInfo {
911
c := Config{}
1012
m := flatConfig(c)
1113
for k, v := range m {
12-
f.StringVar(v.Value, k, "", "")
14+
f.StringVar(v.Value, k, unsetDefault, "")
1315
}
1416
return m
1517
}

runner/flag_test.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,18 @@ func TestConfigRuntimeArgs(t *testing.T) {
103103
},
104104
{
105105
name: "check exclude_regex",
106-
args: []string{"--build.exclude_regex", `["_test.go"]`},
106+
args: []string{"--build.exclude_regex", "_test.go,.html"},
107107
check: func(t *testing.T, conf *Config) {
108-
assert.Equal(t, []string{"_test.go"}, conf.Build.ExcludeRegex)
108+
assert.Equal(t, []string{"_test.go", ".html"}, conf.Build.ExcludeRegex)
109+
},
110+
},
111+
{
112+
name: "check exclude_regex with empty string",
113+
args: []string{"--build.exclude_regex", ""},
114+
check: func(t *testing.T, conf *Config) {
115+
assert.Equal(t, []string{}, conf.Build.ExcludeRegex)
116+
t.Logf("%+v", conf.Build.ExcludeDir)
117+
assert.NotEqual(t, []string{}, conf.Build.ExcludeDir)
109118
},
110119
},
111120
}

runner/util.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ import (
1616
"github.com/fsnotify/fsnotify"
1717
)
1818

19+
const (
20+
sliceCmdArgSeparator = ","
21+
)
22+
1923
func (e *Engine) mainLog(format string, v ...interface{}) {
2024
e.logWithLock(func() {
2125
e.logger.main()(format, v...)
@@ -296,8 +300,10 @@ func setValue2Struct(v reflect.Value, fieldName string, value string) {
296300
case reflect.String:
297301
field.SetString(value)
298302
case reflect.Slice:
299-
if field.Len() == 0 {
300-
field.Set(reflect.Append(field, reflect.ValueOf(value)))
303+
if len(value) == 0 {
304+
field.Set(reflect.ValueOf([]string{}))
305+
} else {
306+
field.Set(reflect.ValueOf(strings.Split(value, sliceCmdArgSeparator)))
301307
}
302308
case reflect.Int64:
303309
i, _ := strconv.ParseInt(value, 10, 64)

runner/util_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -256,3 +256,21 @@ func TestNestStructValue(t *testing.T) {
256256
setValue2Struct(v, "Build.Cmd", "asdasd")
257257
assert.Equal(t, "asdasd", c.Build.Cmd)
258258
}
259+
260+
func TestNestStructArrayValue(t *testing.T) {
261+
c := Config{}
262+
v := reflect.ValueOf(&c)
263+
setValue2Struct(v, "Build.ExcludeDir", "dir1,dir2")
264+
assert.Equal(t, []string{"dir1", "dir2"}, c.Build.ExcludeDir)
265+
}
266+
267+
func TestNestStructArrayValueOverride(t *testing.T) {
268+
c := Config{
269+
Build: cfgBuild{
270+
ExcludeDir: []string{"default1", "default2"},
271+
},
272+
}
273+
v := reflect.ValueOf(&c)
274+
setValue2Struct(v, "Build.ExcludeDir", "dir1,dir2")
275+
assert.Equal(t, []string{"dir1", "dir2"}, c.Build.ExcludeDir)
276+
}

0 commit comments

Comments
 (0)