diff --git a/internal/command/context.go b/internal/command/context.go index d0173ec..484e3b8 100644 --- a/internal/command/context.go +++ b/internal/command/context.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "fmt" + "os" "path/filepath" "runtime" "strconv" @@ -174,6 +175,10 @@ func makeDefaultContext(flags *CommonFlags, args []string) (Context, error) { return ctx, err } + if env := os.Getenv("GOFLAGS"); env != "" { + ctx.Env["GOFLAGS"] = env + } + if len(flags.Ldflags) > 0 { goflags := "" for _, ldflags := range strings.Fields(flags.Ldflags) { diff --git a/internal/command/docker.go b/internal/command/docker.go index 00f3f3d..18d3ac6 100644 --- a/internal/command/docker.go +++ b/internal/command/docker.go @@ -77,9 +77,9 @@ func AppendEnv(args []string, environs map[string]string, quoteNeeded bool) []st for k, v := range environs { env := k + "=" + v if quoteNeeded && strings.Contains(v, "=") { - // engine requires to double quote the env var when value contains + // engine requires to double quote the value when it contains // the `=` char - env = fmt.Sprintf("%q", env) + env = fmt.Sprintf("%s=%q", k, v) } args = append(args, "-e", env) } diff --git a/internal/command/docker_test.go b/internal/command/docker_test.go index cd6201e..895c471 100644 --- a/internal/command/docker_test.go +++ b/internal/command/docker_test.go @@ -273,6 +273,113 @@ func TestCmdEnginePodman(t *testing.T) { } } +func TestAppendEnv(t *testing.T) { + type args struct { + args []string + env map[string]string + quoteNeeded bool + } + tests := []struct { + name string + args args + wantStart []string + wantEnd [][2]string + }{ + { + name: "empty", + args: args{ + args: []string{}, + env: map[string]string{}, + quoteNeeded: true, + }, + wantStart: []string{}, + wantEnd: [][2]string{}, + }, + { + name: "quote needed", + args: args{ + args: []string{}, + env: map[string]string{"VAR": "value"}, + quoteNeeded: true, + }, + wantStart: []string{}, + wantEnd: [][2]string{{"-e", "VAR=value"}}, + }, + { + name: "quote not needed", + args: args{ + args: []string{}, + env: map[string]string{"VAR": "value"}, + quoteNeeded: false, + }, + wantStart: []string{}, + wantEnd: [][2]string{{"-e", "VAR=value"}}, + }, + { + name: "multiple", + args: args{ + args: []string{}, + env: map[string]string{"VAR": "value", "VAR2": "value2"}, + quoteNeeded: true, + }, + wantStart: []string{}, + wantEnd: [][2]string{{"-e", "VAR=value"}, {"-e", "VAR2=value2"}}, + }, + { + name: "multiple with args", + args: args{ + args: []string{"arg1", "arg2"}, + env: map[string]string{"VAR": "value", "VAR2": "value2"}, + quoteNeeded: true, + }, + wantStart: []string{"arg1", "arg2"}, + wantEnd: [][2]string{{"-e", "VAR=value"}, {"-e", "VAR2=value2"}}, + }, + { + name: "multiple with args and equal sign require quoting values", + args: args{ + args: []string{"arg1", "arg2"}, + env: map[string]string{"VAR": "value", "VAR2": "value2=2"}, + quoteNeeded: true, + }, + wantStart: []string{"arg1", "arg2"}, + wantEnd: [][2]string{{"-e", "VAR=value"}, {"-e", "VAR2=\"value2=2\""}}, + }, + { + name: "multiple with args and equal sign do not require quoting values", + args: args{ + args: []string{"arg1", "arg2"}, + env: map[string]string{"VAR": "value", "VAR2": "value2=2"}, + quoteNeeded: false, + }, + wantStart: []string{"arg1", "arg2"}, + wantEnd: [][2]string{{"-e", "VAR=value"}, {"-e", "VAR2=value2=2"}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := AppendEnv(tt.args.args, tt.args.env, tt.args.quoteNeeded) + var i int + for _, v := range tt.wantStart { + assert.Equal(t, v, got[i]) + i++ + } + for ; i < len(got); i += 2 { + found := false + for k, v := range tt.wantEnd { + if v[0] == got[i] && v[1] == got[i+1] { + tt.wantEnd = append(tt.wantEnd[:k], tt.wantEnd[k+1:]...) + found = true + break + } + } + assert.Equal(t, true, found) + } + assert.Equal(t, 0, len(tt.wantEnd)) + }) + } +} + func TestMain(m *testing.M) { os.Unsetenv("SSH_AUTH_SOCK") os.Exit(m.Run())