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>
This commit is contained in:
Andreas Ericsson 2005-11-17 20:37:14 +01:00 committed by Junio C Hamano
parent 8d63013291
commit faea9ccbad

@ -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) int git_connect(int fd[2], char *url, const char *prog)
{ {
char command[1024]; char command[1024];
char *host, *path; char *host, *path = url;
char *colon; char *colon = NULL;
int pipefd[2][2]; int pipefd[2][2];
pid_t pid; pid_t pid;
enum protocol protocol; enum protocol protocol = PROTO_LOCAL;
host = NULL; host = strstr(url, "://");
path = url; if(host) {
colon = strchr(url, ':'); *host = '\0';
protocol = PROTO_LOCAL; protocol = get_protocol(url);
if (colon) { host += 3;
*colon = 0; path = strchr(host, '/');
}
else {
host = url; host = url;
path = colon+1; if ((colon = strchr(host, ':'))) {
protocol = PROTO_SSH; protocol = PROTO_SSH;
if (!memcmp(path, "//", 2)) { *colon = '\0';
char *slash = strchr(path + 2, '/'); path = colon + 1;
if (slash) {
int nr = slash - path - 2;
memmove(path, path+2, nr);
path[nr] = 0;
protocol = get_protocol(url);
host = path;
path = slash;
}
} }
} }
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) if (protocol == PROTO_GIT)
return git_tcp_connect(fd, prog, host, path); return git_tcp_connect(fd, prog, host, path);