diff options
author | Andreas Ericsson <exon@op5.se> | 2005-11-17 20:37:14 +0100 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-11-19 20:50:39 -0800 |
commit | faea9ccbadf75128a9e394dca80ed9454e19c7a9 (patch) | |
tree | 40e21006ae0747065f09244184578577d95a8133 /connect.c | |
parent | 8d6301329156e4eeb0d25d6bce14f6e958314986 (diff) | |
download | git-faea9ccbadf75128a9e394dca80ed9454e19c7a9.tar.gz git-faea9ccbadf75128a9e394dca80ed9454e19c7a9.tar.xz |
Client side support for user-relative paths.
With this patch, the client side passes identical paths for these two:
ssh://host.xz/~junio/repo
host.xz:~junio/repo
Signed-off-by: Andreas Ericsson <ae@op5.se>
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'connect.c')
-rw-r--r-- | connect.c | 55 |
1 files changed, 33 insertions, 22 deletions
@@ -454,34 +454,45 @@ static int git_tcp_connect(int fd[2], const char *prog, char *host, char *path) int git_connect(int fd[2], char *url, const char *prog) { char command[1024]; - char *host, *path; - char *colon; + char *host, *path = url; + char *colon = NULL; int pipefd[2][2]; pid_t pid; - enum protocol protocol; - - host = NULL; - path = url; - colon = strchr(url, ':'); - protocol = PROTO_LOCAL; - if (colon) { - *colon = 0; + enum protocol protocol = PROTO_LOCAL; + + host = strstr(url, "://"); + if(host) { + *host = '\0'; + protocol = get_protocol(url); + host += 3; + path = strchr(host, '/'); + } + else { host = url; - path = colon+1; - protocol = PROTO_SSH; - if (!memcmp(path, "//", 2)) { - char *slash = strchr(path + 2, '/'); - if (slash) { - int nr = slash - path - 2; - memmove(path, path+2, nr); - path[nr] = 0; - protocol = get_protocol(url); - host = path; - path = slash; - } + if ((colon = strchr(host, ':'))) { + protocol = PROTO_SSH; + *colon = '\0'; + path = colon + 1; } } + if (!path || !*path) + die("No path specified. See 'man git-pull' for valid url syntax"); + + /* + * null-terminate hostname and point path to ~ for URL's like this: + * ssh://host.xz/~user/repo + */ + if (protocol != PROTO_LOCAL && host != url) { + char *ptr = path; + if (path[1] == '~') + path++; + else + path = strdup(ptr); + + *ptr = '\0'; + } + if (protocol == PROTO_GIT) return git_tcp_connect(fd, prog, host, path); |