diff --git a/internal/command/command.go b/internal/command/command.go index 9155751f47a24e7c5bd3e8c68c548ecbcca3304f..287fa6a7551bf4501bc152f820752953e30af6bb 100644 --- a/internal/command/command.go +++ b/internal/command/command.go @@ -197,7 +197,7 @@ func New(ctx context.Context, cmd *exec.Cmd, stdin io.Reader, stdout, stderr io. env = append(env, "GIT_TERMINAL_PROMPT=0") // Export env vars - cmd.Env = append(env, AllowedEnvironment(os.Environ())...) + cmd.Env = append(AllowedEnvironment(os.Environ()), env...) cmd.Env = envInjector(ctx, cmd.Env) // Start the command in its own process group (nice for signalling) diff --git a/internal/command/command_test.go b/internal/command/command_test.go index 08f51a97a0a089eccf19b6e174d56c765923e120..cc60394a3b0e4ac1fc675159d8a9af7bf19d28f2 100644 --- a/internal/command/command_test.go +++ b/internal/command/command_test.go @@ -91,18 +91,42 @@ func TestNewCommandProxyEnv(t *testing.T) { for _, tc := range testCases { t.Run(tc.key, func(t *testing.T) { - extraVar := fmt.Sprintf("%s=%s", tc.key, tc.value) + os.Setenv(tc.key, tc.value) + defer os.Unsetenv(tc.key) + buff := &bytes.Buffer{} - cmd, err := New(ctx, exec.Command("/usr/bin/env"), nil, buff, nil, extraVar) + cmd, err := New(ctx, exec.Command("/usr/bin/env"), nil, buff, nil) require.NoError(t, err) require.NoError(t, cmd.Wait()) + extraVar := fmt.Sprintf("%s=%s", tc.key, tc.value) require.Contains(t, strings.Split(buff.String(), "\n"), extraVar) }) } } +func TestPassedInEnvsTakeHigherPriority(t *testing.T) { + envValueOs := "foobar_os" + envValuePassedIn := "foobar_passed_in" + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + oldTZ := os.Getenv("TZ") + defer os.Setenv("TZ", oldTZ) + + os.Setenv("TZ", envValueOs) + + buff := &bytes.Buffer{} + cmd, err := New(ctx, exec.Command("env"), nil, buff, nil, "TZ="+envValuePassedIn) + + require.NoError(t, err) + require.NoError(t, cmd.Wait()) + + require.Contains(t, strings.Split(buff.String(), "\n"), "TZ="+envValuePassedIn) +} + func TestRejectEmptyContextDone(t *testing.T) { defer func() { p := recover()