Skip to content

Commit fce54ce

Browse files
jrngitster
authored andcommitted
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 <[email protected]> Reviewed-by: Stefan Beller <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2ac67cb commit fce54ce

File tree

1 file changed

+60
-53
lines changed

1 file changed

+60
-53
lines changed

connect.c

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -919,6 +919,65 @@ static struct child_process *git_connect_git(int fd[2], char *hostandport,
919919
return conn;
920920
}
921921

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+
922981
/*
923982
* This returns the dummy child_process `no_fork` if the transport protocol
924983
* 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,
9721031
conn->use_shell = 1;
9731032
conn->in = conn->out = -1;
9741033
if (protocol == PROTO_SSH) {
975-
const char *ssh;
976-
enum ssh_variant variant;
9771034
char *ssh_host = hostandport;
9781035
const char *port = NULL;
9791036
transport_check_allowed("ssh");
@@ -995,57 +1052,7 @@ struct child_process *git_connect(int fd[2], const char *url,
9951052
strbuf_release(&cmd);
9961053
return NULL;
9971054
}
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);
10491056
} else {
10501057
transport_check_allowed("file");
10511058
if (get_protocol_version_config() > 0) {

0 commit comments

Comments
 (0)