diff --git a/agent/agent.go b/agent/agent.go index 18eaf6935c82c..26f013589c384 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -359,10 +359,11 @@ func (a *agent) createCommand(ctx context.Context, rawCommand string, env []stri if err != nil { return nil, xerrors.Errorf("getting os executable: %w", err) } + cmd.Env = append(cmd.Env, fmt.Sprintf(`PATH=%s%c%s`, os.Getenv("PATH"), filepath.ListSeparator, executablePath)) // Git on Windows resolves with UNIX-style paths. // If using backslashes, it's unable to find the executable. - executablePath = strings.ReplaceAll(executablePath, "\\", "/") - cmd.Env = append(cmd.Env, fmt.Sprintf(`GIT_SSH_COMMAND=%s gitssh --`, executablePath)) + unixExecutablePath := strings.ReplaceAll(executablePath, "\\", "/") + cmd.Env = append(cmd.Env, fmt.Sprintf(`GIT_SSH_COMMAND=%s gitssh --`, unixExecutablePath)) // These prevent the user from having to specify _anything_ to successfully commit. // Both author and committer must be set! cmd.Env = append(cmd.Env, fmt.Sprintf(`GIT_AUTHOR_EMAIL=%s`, metadata.OwnerEmail)) diff --git a/agent/agent_test.go b/agent/agent_test.go index cb476116eb435..95565272df51c 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -68,6 +68,21 @@ func TestAgent(t *testing.T) { require.True(t, strings.HasSuffix(strings.TrimSpace(string(output)), "gitssh --")) }) + t.Run("PATHHasCoder", func(t *testing.T) { + t.Parallel() + session := setupSSHSession(t, agent.Metadata{}) + command := "sh -c 'echo $PATH'" + if runtime.GOOS == "windows" { + command = "cmd.exe /c echo %PATH%" + } + output, err := session.Output(command) + require.NoError(t, err) + ex, err := os.Executable() + t.Log(ex) + require.NoError(t, err) + require.True(t, strings.Contains(strings.TrimSpace(string(output)), ex), string(output), ex) + }) + t.Run("SessionTTY", func(t *testing.T) { t.Parallel() if runtime.GOOS == "windows" {