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
This commit is contained in:
commit
2d8bb4685c
56
connect.c
56
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;
|
||||||
} else {
|
|
||||||
ssh = getenv("GIT_SSH_COMMAND");
|
|
||||||
if (ssh) {
|
|
||||||
conn->use_shell = 1;
|
|
||||||
putty = 0;
|
|
||||||
} else {
|
|
||||||
ssh = getenv("GIT_SSH");
|
|
||||||
if (!ssh)
|
|
||||||
ssh = "ssh";
|
|
||||||
putty = !!strcasestr(ssh, "plink");
|
|
||||||
}
|
|
||||||
|
|
||||||
argv_array_push(&conn->args, ssh);
|
|
||||||
if (putty && !strcasestr(ssh, "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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssh = getenv("GIT_SSH_COMMAND");
|
||||||
|
if (ssh) {
|
||||||
|
conn->use_shell = 1;
|
||||||
|
putty = 0;
|
||||||
|
} else {
|
||||||
|
const char *base;
|
||||||
|
char *ssh_dup;
|
||||||
|
|
||||||
|
ssh = getenv("GIT_SSH");
|
||||||
|
if (!ssh)
|
||||||
|
ssh = "ssh";
|
||||||
|
|
||||||
|
ssh_dup = xstrdup(ssh);
|
||||||
|
base = basename(ssh_dup);
|
||||||
|
|
||||||
|
tortoiseplink = !strcasecmp(base, "tortoiseplink") ||
|
||||||
|
!strcasecmp(base, "tortoiseplink.exe");
|
||||||
|
putty = !strcasecmp(base, "plink") ||
|
||||||
|
!strcasecmp(base, "plink.exe") || tortoiseplink;
|
||||||
|
|
||||||
|
free(ssh_dup);
|
||||||
|
}
|
||||||
|
|
||||||
|
argv_array_push(&conn->args, ssh);
|
||||||
|
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;
|
||||||
|
@ -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…
Reference in New Issue
Block a user