Browse Source

Merge branch 'bc/connect-plink' into maint

The connection initiation code for "ssh" transport tried to absorb
differences between the stock "ssh" and Putty-supplied "plink" and
its derivatives, but the logic to tell that we are using "plink"
variants were too loose and falsely triggered when "plink" appeared
anywhere in the path (e.g. "/home/me/bin/uplink/ssh").

* bc/connect-plink:
  connect: improve check for plink to reduce false positives
  t5601: fix quotation error leading to skipped tests
  connect: simplify SSH connection code path
maint
Junio C Hamano 10 years ago
parent
commit
2d8bb4685c
  1. 54
      connect.c
  2. 35
      t/t5601-clone.sh

54
connect.c

@ -724,7 +724,7 @@ struct child_process *git_connect(int fd[2], const char *url,
conn->in = conn->out = -1; conn->in = conn->out = -1;
if (protocol == PROTO_SSH) { if (protocol == PROTO_SSH) {
const char *ssh; const char *ssh;
int putty; int putty, tortoiseplink = 0;
char *ssh_host = hostandport; char *ssh_host = hostandport;
const char *port = NULL; const char *port = NULL;
get_host_and_port(&ssh_host, &port); get_host_and_port(&ssh_host, &port);
@ -743,28 +743,40 @@ struct child_process *git_connect(int fd[2], const char *url,
free(path); free(path);
free(conn); free(conn);
return NULL; return NULL;
}

ssh = getenv("GIT_SSH_COMMAND");
if (ssh) {
conn->use_shell = 1;
putty = 0;
} else { } else {
ssh = getenv("GIT_SSH_COMMAND"); const char *base;
if (ssh) { char *ssh_dup;
conn->use_shell = 1;
putty = 0; ssh = getenv("GIT_SSH");
} else { if (!ssh)
ssh = getenv("GIT_SSH"); ssh = "ssh";
if (!ssh)
ssh = "ssh"; ssh_dup = xstrdup(ssh);
putty = !!strcasestr(ssh, "plink"); base = basename(ssh_dup);
}

tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
argv_array_push(&conn->args, ssh); !strcasecmp(base, "tortoiseplink.exe");
if (putty && !strcasestr(ssh, "tortoiseplink")) putty = !strcasecmp(base, "plink") ||
argv_array_push(&conn->args, "-batch"); !strcasecmp(base, "plink.exe") || tortoiseplink;
if (port) {
/* P is for PuTTY, p is for OpenSSH */ free(ssh_dup);
argv_array_push(&conn->args, putty ? "-P" : "-p"); }
argv_array_push(&conn->args, port);
} argv_array_push(&conn->args, ssh);
argv_array_push(&conn->args, ssh_host); if (tortoiseplink)
argv_array_push(&conn->args, "-batch");
if (port) {
/* P is for PuTTY, p is for OpenSSH */
argv_array_push(&conn->args, putty ? "-P" : "-p");
argv_array_push(&conn->args, port);
} }
argv_array_push(&conn->args, ssh_host);
} else { } else {
/* remove repo-local variables from the environment */ /* remove repo-local variables from the environment */
conn->env = local_repo_env; conn->env = local_repo_env;

35
t/t5601-clone.sh

@ -296,6 +296,12 @@ setup_ssh_wrapper () {
' '
} }


copy_ssh_wrapper_as () {
cp "$TRASH_DIRECTORY/ssh-wrapper" "$1" &&
GIT_SSH="$1" &&
export GIT_SSH
}

expect_ssh () { expect_ssh () {
test_when_finished ' test_when_finished '
(cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output) (cd "$TRASH_DIRECTORY" && rm -f ssh-expect && >ssh-output)
@ -332,9 +338,36 @@ test_expect_success !MINGW,!CYGWIN 'clone local path foo:bar' '


test_expect_success 'bracketed hostnames are still ssh' ' test_expect_success 'bracketed hostnames are still ssh' '
git clone "[myhost:123]:src" ssh-bracket-clone && git clone "[myhost:123]:src" ssh-bracket-clone &&
expect_ssh myhost '-p 123' src expect_ssh "-p 123" myhost src
'

test_expect_success 'uplink is not treated as putty' '
copy_ssh_wrapper_as "$TRASH_DIRECTORY/uplink" &&
git clone "[myhost:123]:src" ssh-bracket-clone-uplink &&
expect_ssh "-p 123" myhost src
'

test_expect_success 'plink is treated specially (as putty)' '
copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" &&
git clone "[myhost:123]:src" ssh-bracket-clone-plink-0 &&
expect_ssh "-P 123" myhost src
' '


test_expect_success 'plink.exe is treated specially (as putty)' '
copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink.exe" &&
git clone "[myhost:123]:src" ssh-bracket-clone-plink-1 &&
expect_ssh "-P 123" myhost src
'

test_expect_success 'tortoiseplink is like putty, with extra arguments' '
copy_ssh_wrapper_as "$TRASH_DIRECTORY/tortoiseplink" &&
git clone "[myhost:123]:src" ssh-bracket-clone-plink-2 &&
expect_ssh "-batch -P 123" myhost src
'

# Reset the GIT_SSH environment variable for clone tests.
setup_ssh_wrapper

counter=0 counter=0
# $1 url # $1 url
# $2 none|host # $2 none|host

Loading…
Cancel
Save