Skip to content

Commit 04f118d

Browse files
Merge cursor/network-failfast-env-971d into cursor/parallel-rain-workers-971d
Co-authored-by: Ben Schellenberger <bschellenberger2600@users.noreply.github.com>
2 parents cd617d4 + 8f76cb4 commit 04f118d

3 files changed

Lines changed: 24 additions & 4 deletions

File tree

‎internal/git/command.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
// PrepareNetworkGit configures cmd for fetch/push operations that may contact
1010
// a remote. Delegates to git-harness for GIT_TERMINAL_PROMPT=0, then adds
1111
// fail-fast SSH and HTTP env unless the user already set GIT_SSH_COMMAND,
12-
// GIT_HTTP_LOW_SPEED_*, or core.sshCommand in the repo.
12+
// GIT_SSH, GIT_HTTP_LOW_SPEED_*, or core.sshCommand.
1313
func PrepareNetworkGit(cmd *exec.Cmd) {
1414
harnessgit.PrepareNetworkGit(cmd)
1515
applyFailFastNetworkEnv(cmd)

‎internal/git/command_test.go‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ func TestFetchFailureReason_TerminalPromptsDisabled(t *testing.T) {
2020
}
2121

2222
func isolatedPrepareNetworkEnv(t *testing.T) []string {
23+
t.Helper()
2324
return []string{
2425
"PATH=" + os.Getenv("PATH"),
2526
"HOME=" + os.Getenv("HOME"),
2627
"USER=" + os.Getenv("USER"),
2728
"GIT_CONFIG_NOSYSTEM=1",
2829
"GIT_CONFIG_GLOBAL=/dev/null",
30+
"GIT_CONFIG_SYSTEM=/dev/null",
2931
}
3032
}
3133

@@ -64,6 +66,20 @@ func TestPrepareNetworkGit_PreservesUserGitSSHCommand(t *testing.T) {
6466
}
6567
}
6668

69+
func TestPrepareNetworkGit_PreservesUserGitSSH(t *testing.T) {
70+
repo := testutil.CreateTestRepo(t, testutil.RepoOptions{Name: "failfast-user-git-ssh"})
71+
cmd := exec.Command("git", "fetch", "--all")
72+
cmd.Dir = repo
73+
cmd.Env = append(isolatedPrepareNetworkEnv(t), "GIT_SSH=/usr/bin/custom-ssh")
74+
PrepareNetworkGit(cmd)
75+
76+
for _, e := range cmd.Env {
77+
if strings.HasPrefix(e, "GIT_SSH_COMMAND=") {
78+
t.Fatalf("should not set GIT_SSH_COMMAND when GIT_SSH is set, got %s", e)
79+
}
80+
}
81+
}
82+
6783
func TestPrepareNetworkGit_PreservesCoreSSHCommand(t *testing.T) {
6884
repo := testutil.CreateTestRepo(t, testutil.RepoOptions{Name: "failfast-core-ssh"})
6985
runGit := exec.Command("git", "-C", repo, "config", "core.sshCommand", "ssh -o IdentityFile=/tmp/from-core")

‎internal/git/network_env.go‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ func applyFailFastNetworkEnv(cmd *exec.Cmd) {
2121
env = setEnvIfUnset(env, "GIT_HTTP_LOW_SPEED_LIMIT", defaultHTTPLowSpeedLimit)
2222
env = setEnvIfUnset(env, "GIT_HTTP_LOW_SPEED_TIME", defaultHTTPLowSpeedTimeSec)
2323

24-
if !envHasPrefix(env, "GIT_SSH_COMMAND=") && !envHasPrefix(env, "GIT_SSH=") && !repoHasCoreSSHCommand(cmd.Dir) {
24+
// GIT_SSH_COMMAND overrides GIT_SSH; only inject when neither is set and
25+
// core.sshCommand is unset (same preserve path as an explicit SSH wrapper).
26+
if !envHasPrefix(env, "GIT_SSH_COMMAND=") && !envHasPrefix(env, "GIT_SSH=") && !repoHasCoreSSHCommand(cmd.Dir, env) {
2527
sshCmd := fmt.Sprintf("ssh -o BatchMode=yes -o ConnectTimeout=%d", defaultSSHConnectTimeoutSec)
2628
env = append(env, "GIT_SSH_COMMAND="+sshCmd)
2729
}
@@ -47,10 +49,12 @@ func envHasPrefix(env []string, prefix string) bool {
4749
return false
4850
}
4951

50-
func repoHasCoreSSHCommand(repoDir string) bool {
52+
func repoHasCoreSSHCommand(repoDir string, env []string) bool {
5153
if strings.TrimSpace(repoDir) == "" {
5254
return false
5355
}
54-
out, err := exec.Command("git", "-C", repoDir, "config", "--get", "core.sshCommand").Output()
56+
probe := exec.Command("git", "-C", repoDir, "config", "--get", "core.sshCommand")
57+
probe.Env = env
58+
out, err := probe.Output()
5559
return err == nil && strings.TrimSpace(string(out)) != ""
5660
}

0 commit comments

Comments
 (0)