ssh: 'simple' variant does not support --port

When trying to connect to an ssh:// URL with port explicitly specified and the ssh command configured with GIT_SSH does not support such a setting, it is less confusing to error out than to silently suppress the port setting and continue. This requires updating the GIT_SSH setting in t5603-clone-dirname.sh. That test is about the directory name produced when cloning various URLs. It uses an ssh wrapper that ignores all its arguments but does not declare that it supports a port argument; update it to set GIT_SSH_VARIANT=ssh to do so. (Real-life ssh wrappers that pass a port argument to OpenSSH would also support -G and would not require such an update.) Reported-by: William Yan <wyan@google.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Acked-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed Nov 20, 2017 at 13:31 UTC 3fa5e0d07a979dfd1a1095a9dda4904c62189e00
3 files changed +22 -5
connect.c
+12 -3
@@ -967,11 +967,20 @@ static void push_ssh_options(struct argv_array *args, struct argv_array *env,
967 if (variant == VARIANT_TORTOISEPLINK)
968 argv_array_push(args, "-batch");
969
970 - if (port && variant != VARIANT_SIMPLE) {
971 - if (variant == VARIANT_SSH)
970 + if (port) {
971 + switch (variant) {
972 + case VARIANT_AUTO:
973 + BUG("VARIANT_AUTO passed to push_ssh_options");
974 + case VARIANT_SIMPLE:
975 + die("ssh variant 'simple' does not support setting port");
976 + case VARIANT_SSH:
977 argv_array_push(args, "-p");
973 - else
978 + break;
979 + case VARIANT_PLINK:
980 + case VARIANT_PUTTY:
981 + case VARIANT_TORTOISEPLINK:
982 argv_array_push(args, "-P");
983 + }
984
985 argv_array_push(args, port);
986 }
t/t5601-clone.sh
+8 -2
@@ -378,12 +378,18 @@ test_expect_success 'variant=auto picks based on basename' '
378
379 test_expect_success 'simple does not support -4/-6' '
380 copy_ssh_wrapper_as "$TRASH_DIRECTORY/simple" &&
381 - test_must_fail git clone -4 "[myhost:123]:src" ssh-bracket-clone-simple
381 + test_must_fail git clone -4 "myhost:src" ssh-4-clone-simple
382 +'
383 +
384 +test_expect_success 'simple does not support port' '
385 + copy_ssh_wrapper_as "$TRASH_DIRECTORY/simple" &&
386 + test_must_fail git clone "[myhost:123]:src" ssh-bracket-clone-simple
387 '
388
389 test_expect_success 'uplink is treated as simple' '
390 copy_ssh_wrapper_as "$TRASH_DIRECTORY/uplink" &&
386 - git clone "[myhost:123]:src" ssh-bracket-clone-uplink &&
391 + test_must_fail git clone "[myhost:123]:src" ssh-bracket-clone-uplink &&
392 + git clone "myhost:src" ssh-clone-uplink &&
393 expect_ssh myhost src
394 '
395
t/t5603-clone-dirname.sh
+2
@@ -11,7 +11,9 @@ test_expect_success 'setup ssh wrapper' '
11 git upload-pack "$TRASH_DIRECTORY"
12 EOF
13 GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" &&
14 + GIT_SSH_VARIANT=ssh &&
15 export GIT_SSH &&
16 + export GIT_SSH_VARIANT &&
17 export TRASH_DIRECTORY
18 '
19