mirror of
https://git.proxmox.com/git/libgit2
synced 2025-06-28 20:08:54 +00:00
Handle git+ssh:// and ssh+git:// protocols support
This commit is contained in:
parent
2f2575c002
commit
ff8e3f0e6b
@ -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 }
|
||||
};
|
||||
|
@ -21,7 +21,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";
|
||||
|
||||
@ -64,16 +66,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);
|
||||
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;
|
||||
} else {
|
||||
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
repo = strchr(url, ':');
|
||||
if (repo) repo++;
|
||||
}
|
||||
|
||||
done:
|
||||
if (!repo) {
|
||||
giterr_set(GITERR_NET, "Malformed git protocol URL");
|
||||
return -1;
|
||||
@ -515,16 +524,23 @@ static int _git_ssh_setup_conn(
|
||||
s->session = NULL;
|
||||
s->channel = NULL;
|
||||
|
||||
if (!git__prefixcmp(url, prefix_ssh)) {
|
||||
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;
|
||||
} else {
|
||||
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user