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) {