diff options
author | Chris Bargren <cbargren@gmail.com> | 2015-12-22 10:38:31 -0700 |
---|---|---|
committer | Chris Bargren <cbargren@gmail.com> | 2015-12-22 10:38:31 -0700 |
commit | ed21fd745ca9119817e0005080f7dbd0234b7842 (patch) | |
tree | 581f863180707e598de6229b37dc36b954cd601a | |
parent | d900cec96c322fb85a810b3476defa8e458fa2a8 (diff) | |
download | libgit2-ed21fd745ca9119817e0005080f7dbd0234b7842.tar.gz |
Handle git+ssh:// and ssh+git:// protocols support
-rw-r--r-- | src/transport.c | 2 | ||||
-rw-r--r-- | src/transports/ssh.c | 50 |
2 files changed, 35 insertions, 17 deletions
diff --git a/src/transport.c b/src/transport.c index 5c65c7c06..cf785bc88 100644 --- a/src/transport.c +++ b/src/transport.c @@ -35,6 +35,8 @@ static transport_definition transports[] = { { "file://", git_transport_local, NULL }, #ifdef GIT_SSH { "ssh://", git_transport_smart, &ssh_subtransport_definition }, + { "ssh+git://", git_transport_smart, &ssh_subtransport_definition }, + { "git+ssh://", git_transport_smart, &ssh_subtransport_definition }, #endif { NULL, 0, 0 } }; diff --git a/src/transports/ssh.c b/src/transports/ssh.c index ffa4a24a7..c1f97fa47 100644 --- a/src/transports/ssh.c +++ b/src/transports/ssh.c @@ -20,7 +20,9 @@ #define OWNING_SUBTRANSPORT(s) ((ssh_subtransport *)(s)->parent.subtransport) -static const char prefix_ssh[] = "ssh://"; +static const char * ssh_prefixes[] = { "ssh://", "ssh+git://", "git+ssh://" }; +#define SSH_PREFIX_COUNT (sizeof(ssh_prefixes) / sizeof(ssh_prefixes[0])) + static const char cmd_uploadpack[] = "git-upload-pack"; static const char cmd_receivepack[] = "git-receive-pack"; @@ -63,16 +65,23 @@ static int gen_proto(git_buf *request, const char *cmd, const char *url) char *repo; int len; - if (!git__prefixcmp(url, prefix_ssh)) { - url = url + strlen(prefix_ssh); - repo = strchr(url, '/'); - if (repo && repo[1] == '~') - ++repo; - } else { - repo = strchr(url, ':'); - if (repo) repo++; + size_t i = 0; + for (i = 0; i < SSH_PREFIX_COUNT; ++i) { + const char *p = ssh_prefixes[i]; + + if (!git__prefixcmp(url, p)) { + url = url + strlen(p); + repo = strchr(url, '/'); + if (repo && repo[1] == '~') + ++repo; + + goto done; + } } + repo = strchr(url, ':'); + if (repo) repo++; +done: if (!repo) { giterr_set(GITERR_NET, "Malformed git protocol URL"); return -1; @@ -509,16 +518,23 @@ static int _git_ssh_setup_conn( s->session = NULL; s->channel = NULL; - if (!git__prefixcmp(url, prefix_ssh)) { - if ((error = gitno_extract_url_parts(&host, &port, &path, &user, &pass, url, default_port)) < 0) - goto done; - } else { - if ((error = git_ssh_extract_url_parts(&host, &user, url)) < 0) - goto done; - port = git__strdup(default_port); - GITERR_CHECK_ALLOC(port); + size_t i = 0; + for (i = 0; i < SSH_PREFIX_COUNT; ++i) { + const char *p = ssh_prefixes[i]; + + if (!git__prefixcmp(url, p)) { + if ((error = gitno_extract_url_parts(&host, &port, &path, &user, &pass, url, default_port)) < 0) + goto done; + + goto post_extract; + } } + if ((error = git_ssh_extract_url_parts(&host, &user, url)) < 0) + goto done; + port = git__strdup(default_port); + GITERR_CHECK_ALLOC(port); +post_extract: if ((error = git_socket_stream_new(&s->io, host, port)) < 0 || (error = git_stream_connect(s->io)) < 0) goto done; |