Skip to content

Commit 0448782

Browse files
sdfwds4xiantang
andauthored
fix: Fix the issue with ineffective --build.full_bin command line argument (#748)
* Update config.go * Update flag_test.go * fix: handle preprocess correctly in command line arguments * fix: update withArgs documentation to reflect its private status --------- Co-authored-by: xiantang <[email protected]>
1 parent a830e5a commit 0448782

File tree

6 files changed

+64
-40
lines changed

6 files changed

+64
-40
lines changed

main.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,11 @@ func main() {
8989
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
9090

9191
var err error
92-
cfg, err := runner.InitConfig(cfgPath)
92+
cfg, err := runner.InitConfig(cfgPath, cmdArgs)
9393
if err != nil {
9494
log.Fatal(err)
9595
return
9696
}
97-
cfg.WithArgs(cmdArgs)
9897
if !cfg.Log.Silent {
9998
printSplash()
10099
}

runner/config.go

+10-5
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (t sliceTransformer) Transformer(typ reflect.Type) func(dst, src reflect.Va
109109
}
110110

111111
// InitConfig initializes the configuration.
112-
func InitConfig(path string) (cfg *Config, err error) {
112+
func InitConfig(path string, cmdArgs map[string]TomlInfo) (cfg *Config, err error) {
113113
if path == "" {
114114
cfg, err = defaultPathConfig()
115115
if err != nil {
@@ -135,7 +135,7 @@ func InitConfig(path string) (cfg *Config, err error) {
135135
return nil, err
136136
}
137137

138-
err = ret.preprocess()
138+
err = ret.preprocess(cmdArgs)
139139
return ret, err
140140
}
141141

@@ -278,8 +278,12 @@ func readConfigOrDefault(path string) (*Config, error) {
278278
return cfg, nil
279279
}
280280

281-
func (c *Config) preprocess() error {
281+
func (c *Config) preprocess(args map[string]TomlInfo) error {
282282
var err error
283+
284+
if args != nil {
285+
c.withArgs(args)
286+
}
283287
cwd := os.Getenv(airWd)
284288
if cwd != "" {
285289
if err = os.Chdir(cwd); err != nil {
@@ -384,8 +388,8 @@ func (c *Config) rel(path string) string {
384388
return s
385389
}
386390

387-
// WithArgs returns a new config with the given arguments added to the configuration.
388-
func (c *Config) WithArgs(args map[string]TomlInfo) {
391+
// withArgs returns a new config with the given arguments added to the configuration.
392+
func (c *Config) withArgs(args map[string]TomlInfo) {
389393
for _, value := range args {
390394
// Ignore values that match the default configuration.
391395
// This ensures user-specified configurations are not overwritten by default values.
@@ -394,4 +398,5 @@ func (c *Config) WithArgs(args map[string]TomlInfo) {
394398
setValue2Struct(v, value.fieldPath, *value.Value)
395399
}
396400
}
401+
397402
}

runner/config_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func TestBinCmdPath(t *testing.T) {
4343
var err error
4444

4545
c := getWindowsConfig()
46-
err = c.preprocess()
46+
err = c.preprocess(nil)
4747
if err != nil {
4848
t.Fatal(err)
4949
}
@@ -118,7 +118,7 @@ func TestReadConfByName(t *testing.T) {
118118
func TestConfPreprocess(t *testing.T) {
119119
t.Setenv(airWd, "_testdata/toml")
120120
df := defaultConfig()
121-
err := df.preprocess()
121+
err := df.preprocess(nil)
122122
if err != nil {
123123
t.Fatalf("preprocess error %v", err)
124124
}
@@ -143,7 +143,7 @@ func TestConfigWithRuntimeArgs(t *testing.T) {
143143

144144
t.Run("when using bin", func(t *testing.T) {
145145
df := defaultConfig()
146-
if err := df.preprocess(); err != nil {
146+
if err := df.preprocess(nil); err != nil {
147147
t.Fatalf("preprocess error %v", err)
148148
}
149149

@@ -155,7 +155,7 @@ func TestConfigWithRuntimeArgs(t *testing.T) {
155155
t.Run("when using full_bin", func(t *testing.T) {
156156
df := defaultConfig()
157157
df.Build.FullBin = "./tmp/main"
158-
if err := df.preprocess(); err != nil {
158+
if err := df.preprocess(nil); err != nil {
159159
t.Fatalf("preprocess error %v", err)
160160
}
161161

runner/engine.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ func NewEngineWithConfig(cfg *Config, debugMode bool) (*Engine, error) {
7171
}
7272

7373
// NewEngine ...
74-
func NewEngine(cfgPath string, debugMode bool) (*Engine, error) {
74+
func NewEngine(cfgPath string, args map[string]TomlInfo, debugMode bool) (*Engine, error) {
7575
var err error
76-
cfg, err := InitConfig(cfgPath)
76+
cfg, err := InitConfig(cfgPath, args)
7777
if err != nil {
7878
return nil, err
7979
}

runner/engine_test.go

+25-25
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
func TestNewEngine(t *testing.T) {
2323
_ = os.Unsetenv(airWd)
24-
engine, err := NewEngine("", true)
24+
engine, err := NewEngine("", nil, true)
2525
if err != nil {
2626
t.Fatalf("Should not be fail: %s.", err)
2727
}
@@ -38,7 +38,7 @@ func TestNewEngine(t *testing.T) {
3838

3939
func TestCheckRunEnv(t *testing.T) {
4040
_ = os.Unsetenv(airWd)
41-
engine, err := NewEngine("", true)
41+
engine, err := NewEngine("", nil, true)
4242
if err != nil {
4343
t.Fatalf("Should not be fail: %s.", err)
4444
}
@@ -49,7 +49,7 @@ func TestCheckRunEnv(t *testing.T) {
4949
}
5050

5151
func TestWatching(t *testing.T) {
52-
engine, err := NewEngine("", true)
52+
engine, err := NewEngine("", nil, true)
5353
if err != nil {
5454
t.Fatalf("Should not be fail: %s.", err)
5555
}
@@ -65,12 +65,12 @@ func TestWatching(t *testing.T) {
6565
}
6666

6767
func TestRegexes(t *testing.T) {
68-
engine, err := NewEngine("", true)
68+
engine, err := NewEngine("", nil, true)
6969
if err != nil {
7070
t.Fatalf("Should not be fail: %s.", err)
7171
}
7272
engine.config.Build.ExcludeRegex = []string{"foo\\.html$", "bar", "_test\\.go"}
73-
err = engine.config.preprocess()
73+
err = engine.config.preprocess(nil)
7474
if err != nil {
7575
t.Fatalf("Should not be fail: %s.", err)
7676
}
@@ -123,7 +123,7 @@ func TestRunCommand(t *testing.T) {
123123
tmpDir := initTestEnv(t, port)
124124
// change dir to tmpDir
125125
chdir(t, tmpDir)
126-
engine, err := NewEngine("", true)
126+
engine, err := NewEngine("", nil, true)
127127
if err != nil {
128128
t.Fatalf("Should not be fail: %s.", err)
129129
}
@@ -146,7 +146,7 @@ func TestRunPreCmd(t *testing.T) {
146146
tmpDir := initTestEnv(t, port)
147147
// change dir to tmpDir
148148
chdir(t, tmpDir)
149-
engine, err := NewEngine("", true)
149+
engine, err := NewEngine("", nil, true)
150150
if err != nil {
151151
t.Fatalf("Should not be fail: %s.", err)
152152
}
@@ -171,7 +171,7 @@ func TestRunPostCmd(t *testing.T) {
171171
// change dir to tmpDir
172172
chdir(t, tmpDir)
173173

174-
engine, err := NewEngine("", true)
174+
engine, err := NewEngine("", nil, true)
175175
if err != nil {
176176
t.Fatalf("Should not be fail: %s.", err)
177177
}
@@ -190,7 +190,7 @@ func TestRunPostCmd(t *testing.T) {
190190
}
191191

192192
func TestRunBin(t *testing.T) {
193-
engine, err := NewEngine("", true)
193+
engine, err := NewEngine("", nil, true)
194194
if err != nil {
195195
t.Fatalf("Should not be fail: %s.", err)
196196
}
@@ -221,7 +221,7 @@ func TestRebuild(t *testing.T) {
221221
tmpDir := initTestEnv(t, port)
222222
// change dir to tmpDir
223223
chdir(t, tmpDir)
224-
engine, err := NewEngine("", true)
224+
engine, err := NewEngine("", nil, true)
225225
engine.config.Build.ExcludeUnchanged = true
226226
if err != nil {
227227
t.Fatalf("Should not be fail: %s.", err)
@@ -310,14 +310,14 @@ func TestCtrlCWhenHaveKillDelay(t *testing.T) {
310310
tmpDir := initTestEnv(t, port)
311311
// change dir to tmpDir
312312
chdir(t, tmpDir)
313-
engine, err := NewEngine("", true)
313+
engine, err := NewEngine("", nil, true)
314314
if err != nil {
315315
t.Fatalf("Should not be fail: %s.", err)
316316
}
317317
engine.config.Build.KillDelay = c.Build.KillDelay
318318
engine.config.Build.Delay = 2000
319319
engine.config.Build.SendInterrupt = true
320-
if err := engine.config.preprocess(); err != nil {
320+
if err := engine.config.preprocess(nil); err != nil {
321321
t.Fatalf("Should not be fail: %s.", err)
322322
}
323323

@@ -353,7 +353,7 @@ func TestCtrlCWhenREngineIsRunning(t *testing.T) {
353353
tmpDir := initTestEnv(t, port)
354354
// change dir to tmpDir
355355
chdir(t, tmpDir)
356-
engine, err := NewEngine("", true)
356+
engine, err := NewEngine("", nil, true)
357357
if err != nil {
358358
t.Fatalf("Should not be fail: %s.", err)
359359
}
@@ -386,7 +386,7 @@ func TestCtrlCWithFailedBin(t *testing.T) {
386386
go func() {
387387
dir := initWithQuickExitGoCode(t)
388388
chdir(t, dir)
389-
engine, err := NewEngine("", true)
389+
engine, err := NewEngine("", nil, true)
390390
assert.NoError(t, err)
391391
engine.config.Build.Bin = "<WRONGCOMAMND>"
392392
sigs := make(chan os.Signal, 1)
@@ -419,7 +419,7 @@ func TestFixCloseOfChannelAfterCtrlC(t *testing.T) {
419419
// fix https://github.com/air-verse/air/issues/294
420420
dir := initWithBuildFailedCode(t)
421421
chdir(t, dir)
422-
engine, err := NewEngine("", true)
422+
engine, err := NewEngine("", nil, true)
423423
if err != nil {
424424
t.Fatalf("Should not be fail: %s.", err)
425425
}
@@ -464,7 +464,7 @@ func TestFixCloseOfChannelAfterTwoFailedBuild(t *testing.T) {
464464
dir := initWithBuildFailedCode(t)
465465
// change dir to tmpDir
466466
chdir(t, dir)
467-
engine, err := NewEngine("", true)
467+
engine, err := NewEngine("", nil, true)
468468
if err != nil {
469469
t.Fatalf("Should not be fail: %s.", err)
470470
}
@@ -530,7 +530,7 @@ func TestRun(t *testing.T) {
530530
tmpDir := initTestEnv(t, port)
531531
// change dir to tmpDir
532532
chdir(t, tmpDir)
533-
engine, err := NewEngine("", true)
533+
engine, err := NewEngine("", nil, true)
534534
if err != nil {
535535
t.Fatalf("Should not be fail: %s.", err)
536536
}
@@ -716,7 +716,7 @@ func TestRebuildWhenRunCmdUsingDLV(t *testing.T) {
716716
tmpDir := initTestEnv(t, port)
717717
// change dir to tmpDir
718718
chdir(t, tmpDir)
719-
engine, err := NewEngine("", true)
719+
engine, err := NewEngine("", nil, true)
720720
if err != nil {
721721
t.Fatalf("Should not be fail: %s.", err)
722722
}
@@ -725,7 +725,7 @@ func TestRebuildWhenRunCmdUsingDLV(t *testing.T) {
725725
dlvPort, f := GetPort()
726726
f()
727727
engine.config.Build.FullBin = fmt.Sprintf("dlv exec --accept-multiclient --log --headless --continue --listen :%d --api-version 2 ./tmp/main", dlvPort)
728-
_ = engine.config.preprocess()
728+
_ = engine.config.preprocess(nil)
729729
go func() {
730730
engine.Run()
731731
}()
@@ -818,7 +818,7 @@ include_file = ["test/not_a_test.go"]
818818
if err := os.WriteFile(dftTOML, []byte(config), 0o644); err != nil {
819819
t.Fatal(err)
820820
}
821-
engine, err := NewEngine(".air.toml", true)
821+
engine, err := NewEngine(".air.toml", nil, true)
822822
if err != nil {
823823
t.Fatal(err)
824824
}
@@ -881,7 +881,7 @@ func Test(t *testing.T) {
881881
}
882882

883883
time.Sleep(time.Second * 2)
884-
engine, err := NewEngine(".air.toml", false)
884+
engine, err := NewEngine(".air.toml", nil, false)
885885
if err != nil {
886886
t.Fatal(err)
887887
}
@@ -917,7 +917,7 @@ func TestCreateNewDir(t *testing.T) {
917917
tmpDir := initTestEnv(t, port)
918918
// change dir to tmpDir
919919
chdir(t, tmpDir)
920-
engine, err := NewEngine("", true)
920+
engine, err := NewEngine("", nil, true)
921921
if err != nil {
922922
t.Fatalf("Should not be fail: %s.", err)
923923
}
@@ -967,7 +967,7 @@ include_file = ["main.sh"]
967967
t.Fatal(err)
968968
}
969969

970-
engine, err := NewEngine(dftTOML, false)
970+
engine, err := NewEngine(dftTOML, nil, false)
971971
if err != nil {
972972
t.Fatal(err)
973973
}
@@ -1026,7 +1026,7 @@ include_file = ["main.sh"]
10261026
t.Fatal(err)
10271027
}
10281028

1029-
engine, err := NewEngine(dftTOML, false)
1029+
engine, err := NewEngine(dftTOML, nil, false)
10301030
if err != nil {
10311031
t.Fatal(err)
10321032
}
@@ -1110,7 +1110,7 @@ func TestEngineExit(t *testing.T) {
11101110

11111111
for _, tt := range tests {
11121112
t.Run(tt.name, func(t *testing.T) {
1113-
e, err := NewEngine("", true)
1113+
e, err := NewEngine("", nil, true)
11141114
if err != nil {
11151115
t.Fatal(err)
11161116
}

runner/flag_test.go

+22-2
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,27 @@ func TestConfigRuntimeArgs(t *testing.T) {
118118
assert.NotEqual(t, []string{}, conf.Build.ExcludeDir)
119119
},
120120
},
121+
{
122+
name: "check full_bin",
123+
args: []string{"--build.full_bin", "APP_ENV=dev APP_USER=air ./tmp/main"},
124+
check: func(t *testing.T, conf *Config) {
125+
assert.Equal(t, "APP_ENV=dev APP_USER=air ./tmp/main", conf.Build.Bin)
126+
},
127+
},
128+
129+
{
130+
name: "check exclude_regex patterns compiled",
131+
args: []string{"--build.exclude_regex", "test_pattern\\.go"},
132+
check: func(t *testing.T, conf *Config) {
133+
assert.Equal(t, []string{"test_pattern\\.go"}, conf.Build.ExcludeRegex)
134+
patterns, err := conf.Build.RegexCompiled()
135+
require.NoError(t, err)
136+
require.NotNil(t, patterns)
137+
require.Len(t, patterns, 1)
138+
assert.True(t, patterns[0].MatchString("test_pattern.go"), "regex should match test_pattern.go")
139+
assert.False(t, patterns[0].MatchString("other_file.go"), "regex shouldn't match other_file.go")
140+
},
141+
},
121142
}
122143
for _, tc := range testCases {
123144
t.Run(tc.name, func(t *testing.T) {
@@ -126,12 +147,11 @@ func TestConfigRuntimeArgs(t *testing.T) {
126147
flag := flag.NewFlagSet(t.Name(), flag.ExitOnError)
127148
cmdArgs := ParseConfigFlag(flag)
128149
_ = flag.Parse(tc.args)
129-
cfg, err := InitConfig("")
150+
cfg, err := InitConfig("", cmdArgs)
130151
if err != nil {
131152
log.Fatal(err)
132153
return
133154
}
134-
cfg.WithArgs(cmdArgs)
135155
tc.check(t, cfg)
136156
})
137157
}

0 commit comments

Comments
 (0)