Jonathan Nieder <jrnieder@xxxxxxxxx> writes: > Android's "repo" tool is a tool for managing a large codebase > consisting of multiple smaller repositories, similar to Git's > submodule feature. Starting with Git 94b8ae5a (ssh: introduce a > 'simple' ssh variant, 2017-10-16), users noticed that it stopped > handling the port in ssh:// URLs. > > ... > Reported-by: William Yan <wyan@xxxxxxxxxx> > Improved-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> > Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> > --- Not a big issue, but the above made me wonder, due to lack of any signed-off-by before improved-by, what "base" was improved by JTan. If you were writing a change before formally passing it around with your sign-off and somebody had a valuable input to improve it, it seems that people say helped-by around here. > ssh.variant:: > - Depending on the value of the environment variables `GIT_SSH` or > - `GIT_SSH_COMMAND`, or the config setting `core.sshCommand`, Git > - auto-detects whether to adjust its command-line parameters for use > - with ssh (OpenSSH), plink or tortoiseplink, as opposed to the default > - (simple). > + By default, Git determines the command line arguments to use > + based on the basename of the configured SSH command (configured > + using the environment variable `GIT_SSH` or `GIT_SSH_COMMAND` or > + the config setting `core.sshCommand`). If the basename is > + unrecognized, Git will attempt to detect support of OpenSSH > + options by first invoking the configured SSH command with the > + `-G` (print configuration) option and will subsequently use > + OpenSSH options (if that is successful) or no options besides > + the host and remote command (if it fails). > + > -The config variable `ssh.variant` can be set to override this auto-detection; > -valid values are `ssh`, `simple`, `plink`, `putty` or `tortoiseplink`. Any > -other value will be treated as normal ssh. This setting can be overridden via > -the environment variable `GIT_SSH_VARIANT`. > +The config variable `ssh.variant` can be set to override this detection. > +Valid values are `ssh` (to use OpenSSH options), `plink`, `putty`, > +`tortoiseplink`, `simple` (no options except the host and remote command). > +The default auto-detection can be explicitly requested using the value > +`auto`. Any other value is treated as `ssh`. This setting can also be > +overridden via the environment variable `GIT_SSH_VARIANT`. > + Cleanly written and easily read. Good. > @@ -982,6 +985,21 @@ static void fill_ssh_args(struct child_process *conn, const char *ssh_host, > variant = determine_ssh_variant(ssh, 0); > } > > + if (variant == VARIANT_AUTO) { > + struct child_process detect = CHILD_PROCESS_INIT; > + > + detect.use_shell = conn->use_shell; > + detect.no_stdin = detect.no_stdout = detect.no_stderr = 1; > + > + argv_array_push(&detect.args, ssh); > + argv_array_push(&detect.args, "-G"); > + push_ssh_options(&detect.args, &detect.env_array, > + VARIANT_SSH, port, flags); > + argv_array_push(&detect.args, ssh_host); > + > + variant = run_command(&detect) ? VARIANT_SIMPLE : VARIANT_SSH; > + } I briefly wondered if it safe to simply append "-G" in both cases, i.e. where "ssh" came from GIT_SSH and it came from GIT_SSH_COMMAND, but in the real invocation we see in the post-context of this hunk, we'd push options the same way regardless, so it should be fine. > argv_array_push(&conn->args, ssh); > push_ssh_options(&conn->args, &conn->env_array, variant, port, flags); > argv_array_push(&conn->args, ssh_host); > +test_expect_success 'OpenSSH-like uplink is treated as ssh' ' > + write_script "$TRASH_DIRECTORY/uplink" <<-EOF && > + if test "\$1" = "-G" > + then > + exit 0 > + fi && > + exec "\$TRASH_DIRECTORY/ssh$X" "\$@" > + EOF OK. > + test_when_finished "rm -f \"\$TRASH_DIRECTORY/uplink\"" && > + GIT_SSH="$TRASH_DIRECTORY/uplink" && > + test_when_finished "GIT_SSH=\"\$TRASH_DIRECTORY/ssh\$X\"" && > + git clone "[myhost:123]:src" ssh-bracket-clone-sshlike-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 && Thanks.