connect: split ssh command line options into separate function

The git_connect function is growing long. Split the portion that discovers an ssh command and options it accepts before the service name and path to a separate function to make it easier to read. No functional change intended. Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Reviewed-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed Nov 20, 2017 at 14:19 UTC fce54ce422befdeb69d94f7576d3c23e94e41572
1 file changed +60 -53
connect.c
+60 -53
@@ -919,6 +919,65 @@ static struct child_process *git_connect_git(int fd[2], char *hostandport,
919 return conn;
920 }
921
922 +/* Prepare a child_process for use by Git's SSH-tunneled transport. */
923 +static void fill_ssh_args(struct child_process *conn, const char *ssh_host,
924 + const char *port, int flags)
925 +{
926 + const char *ssh;
927 + enum ssh_variant variant;
928 +
929 + if (looks_like_command_line_option(ssh_host))
930 + die("strange hostname '%s' blocked", ssh_host);
931 +
932 + ssh = get_ssh_command();
933 + if (ssh) {
934 + variant = determine_ssh_variant(ssh, 1);
935 + } else {
936 + /*
937 + * GIT_SSH is the no-shell version of
938 + * GIT_SSH_COMMAND (and must remain so for
939 + * historical compatibility).
940 + */
941 + conn->use_shell = 0;
942 +
943 + ssh = getenv("GIT_SSH");
944 + if (!ssh)
945 + ssh = "ssh";
946 + variant = determine_ssh_variant(ssh, 0);
947 + }
948 +
949 + argv_array_push(&conn->args, ssh);
950 +
951 + if (variant == VARIANT_SSH &&
952 + get_protocol_version_config() > 0) {
953 + argv_array_push(&conn->args, "-o");
954 + argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
955 + argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
956 + get_protocol_version_config());
957 + }
958 +
959 + if (variant != VARIANT_SIMPLE) {
960 + if (flags & CONNECT_IPV4)
961 + argv_array_push(&conn->args, "-4");
962 + else if (flags & CONNECT_IPV6)
963 + argv_array_push(&conn->args, "-6");
964 + }
965 +
966 + if (variant == VARIANT_TORTOISEPLINK)
967 + argv_array_push(&conn->args, "-batch");
968 +
969 + if (port && variant != VARIANT_SIMPLE) {
970 + if (variant == VARIANT_SSH)
971 + argv_array_push(&conn->args, "-p");
972 + else
973 + argv_array_push(&conn->args, "-P");
974 +
975 + argv_array_push(&conn->args, port);
976 + }
977 +
978 + argv_array_push(&conn->args, ssh_host);
979 +}
980 +
981 /*
982 * This returns the dummy child_process `no_fork` if the transport protocol
983 * does not need fork(2), or a struct child_process object if it does. Once
@@ -972,8 +1031,6 @@ struct child_process *git_connect(int fd[2], const char *url,
1031 conn->use_shell = 1;
1032 conn->in = conn->out = -1;
1033 if (protocol == PROTO_SSH) {
975 - const char *ssh;
976 - enum ssh_variant variant;
1034 char *ssh_host = hostandport;
1035 const char *port = NULL;
1036 transport_check_allowed("ssh");
@@ -995,57 +1052,7 @@ struct child_process *git_connect(int fd[2], const char *url,
1052 strbuf_release(&cmd);
1053 return NULL;
1054 }
998 -
999 - if (looks_like_command_line_option(ssh_host))
1000 - die("strange hostname '%s' blocked", ssh_host);
1001 -
1002 - ssh = get_ssh_command();
1003 - if (ssh) {
1004 - variant = determine_ssh_variant(ssh, 1);
1005 - } else {
1006 - /*
1007 - * GIT_SSH is the no-shell version of
1008 - * GIT_SSH_COMMAND (and must remain so for
1009 - * historical compatibility).
1010 - */
1011 - conn->use_shell = 0;
1012 -
1013 - ssh = getenv("GIT_SSH");
1014 - if (!ssh)
1015 - ssh = "ssh";
1016 - variant = determine_ssh_variant(ssh, 0);
1017 - }
1018 -
1019 - argv_array_push(&conn->args, ssh);
1020 -
1021 - if (variant == VARIANT_SSH &&
1022 - get_protocol_version_config() > 0) {
1023 - argv_array_push(&conn->args, "-o");
1024 - argv_array_push(&conn->args, "SendEnv=" GIT_PROTOCOL_ENVIRONMENT);
1025 - argv_array_pushf(&conn->env_array, GIT_PROTOCOL_ENVIRONMENT "=version=%d",
1026 - get_protocol_version_config());
1027 - }
1028 -
1029 - if (variant != VARIANT_SIMPLE) {
1030 - if (flags & CONNECT_IPV4)
1031 - argv_array_push(&conn->args, "-4");
1032 - else if (flags & CONNECT_IPV6)
1033 - argv_array_push(&conn->args, "-6");
1034 - }
1035 -
1036 - if (variant == VARIANT_TORTOISEPLINK)
1037 - argv_array_push(&conn->args, "-batch");
1038 -
1039 - if (port && variant != VARIANT_SIMPLE) {
1040 - if (variant == VARIANT_SSH)
1041 - argv_array_push(&conn->args, "-p");
1042 - else
1043 - argv_array_push(&conn->args, "-P");
1044 -
1045 - argv_array_push(&conn->args, port);
1046 - }
1047 -
1048 - argv_array_push(&conn->args, ssh_host);
1055 + fill_ssh_args(conn, ssh_host, port, flags);
1056 } else {
1057 transport_check_allowed("file");
1058 if (get_protocol_version_config() > 0) {