From: Segev Finer <segev208@xxxxxxxxx> This environment variable and configuration value allow to override the autodetection of plink/tortoiseplink in case that Git gets it wrong. [jes: wrapped overly-long lines, changed get_ssh_variant() to handle_ssh_variant() to accomodate the change from the putty/tortoiseplink variables to port_option/needs_batch.] Signed-off-by: Segev Finer <segev208@xxxxxxxxx> Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- Documentation/config.txt | 7 +++++++ Documentation/git.txt | 7 +++++++ connect.c | 24 ++++++++++++++++++++++-- t/t5601-clone.sh | 26 ++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index af2ae4cc02..f2c210f0a0 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -1949,6 +1949,13 @@ Environment variable settings always override any matches. The URLs that are matched against are those given directly to Git commands. This means any URLs visited as a result of a redirection do not participate in matching. +ssh.variant:: + Override the autodetection of plink/tortoiseplink in the SSH + command that 'git fetch' and 'git push' use. It can be set to + either `ssh`, `plink`, `putty` or `tortoiseplink`. Any other + value will be treated as normal ssh. This is useful in case + that Git gets this wrong. + i18n.commitEncoding:: Character encoding the commit messages are stored in; Git itself does not care per se, but this information is necessary e.g. when diff --git a/Documentation/git.txt b/Documentation/git.txt index 4f208fab92..c322558aa7 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -1020,6 +1020,13 @@ Usually it is easier to configure any desired options through your personal `.ssh/config` file. Please consult your ssh documentation for further details. +`GIT_SSH_VARIANT`:: + If this environment variable is set, it overrides the autodetection + of plink/tortoiseplink in the SSH command that 'git fetch' and 'git + push' use. It can be set to either `ssh`, `plink`, `putty` or + `tortoiseplink`. Any other value will be treated as normal ssh. This + is useful in case that Git gets this wrong. + `GIT_ASKPASS`:: If this environment variable is set, then Git commands which need to acquire passwords or passphrases (e.g. for HTTP or IMAP authentication) diff --git a/connect.c b/connect.c index 9f750eacb6..7b4437578b 100644 --- a/connect.c +++ b/connect.c @@ -691,6 +691,24 @@ static const char *get_ssh_command(void) return NULL; } +static int handle_ssh_variant(int *port_option, int *needs_batch) +{ + const char *variant; + + if (!(variant = getenv("GIT_SSH_VARIANT")) && + git_config_get_string_const("ssh.variant", &variant)) + return 0; + + if (!strcmp(variant, "plink") || !strcmp(variant, "putty")) + *port_option = 'P'; + else if (!strcmp(variant, "tortoiseplink")) { + *port_option = 'P'; + *needs_batch = 1; + } + + return 1; +} + /* * This returns a dummy child_process if the transport protocol does not * need fork(2), or a struct child_process object if it does. Once done, @@ -817,7 +835,8 @@ struct child_process *git_connect(int fd[2], const char *url, ssh_argv0 = xstrdup(ssh); } - if (ssh_argv0) { + if (!handle_ssh_variant(&port_option, &needs_batch) && + ssh_argv0) { const char *base = basename(ssh_argv0); if (!strcasecmp(base, "tortoiseplink") || @@ -828,9 +847,10 @@ struct child_process *git_connect(int fd[2], const char *url, !strcasecmp(base, "plink.exe")) { port_option = 'P'; } - free(ssh_argv0); } + free(ssh_argv0); + argv_array_push(&conn->args, ssh); if (flags & CONNECT_IPV4) argv_array_push(&conn->args, "-4"); diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh index 9335e10c2a..b52b8acf98 100755 --- a/t/t5601-clone.sh +++ b/t/t5601-clone.sh @@ -401,6 +401,32 @@ test_expect_success 'single quoted plink.exe in GIT_SSH_COMMAND' ' expect_ssh "-v -P 123" myhost src ' +test_expect_success 'GIT_SSH_VARIANT overrides plink detection' ' + copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" && + GIT_SSH_VARIANT=ssh \ + git clone "[myhost:123]:src" ssh-bracket-clone-variant-1 && + expect_ssh "-p 123" myhost src +' + +test_expect_success 'ssh.variant overrides plink detection' ' + copy_ssh_wrapper_as "$TRASH_DIRECTORY/plink" && + git -c ssh.variant=ssh \ + clone "[myhost:123]:src" ssh-bracket-clone-variant-2 && + expect_ssh "-p 123" myhost src +' + +test_expect_success 'GIT_SSH_VARIANT overrides plink detection to plink' ' + GIT_SSH_VARIANT=plink \ + git clone "[myhost:123]:src" ssh-bracket-clone-variant-3 && + expect_ssh "-P 123" myhost src +' + +test_expect_success 'GIT_SSH_VARIANT overrides plink to tortoiseplink' ' + GIT_SSH_VARIANT=tortoiseplink \ + git clone "[myhost:123]:src" ssh-bracket-clone-variant-4 && + expect_ssh "-batch -P 123" myhost src +' + # Reset the GIT_SSH environment variable for clone tests. setup_ssh_wrapper -- 2.11.1.windows.prerelease.2.9.g3014b57