Jonathan Nieder <[email protected]> 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 <[email protected]>
> Improved-by: Jonathan Tan <[email protected]>
> Signed-off-by: Jonathan Nieder <[email protected]>
> ---

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.

Reply via email to