git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 3/5] Client side support for user-relative paths.

From
Andreas Ericsson <exon@op5.se>
Date
Nov 17, 2005, 19:37 UTC
Message-ID
<20051117193714.3CCC35C7F6@nox.op5.se>
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>
---
 connect.c |   53 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 32 insertions(+), 21 deletions(-)

applies-to: cd3bc724fea293b623abee6b0b4995560dd9f32e c460d84cc8431089ddf6a888a418826ff8248509

diff --git a/connect.c b/connect.c
index c2badc7..73187a1 100644
--- a/connect.c
+++ b/connect.c
@@ -454,34 +454,45 @@ static int git_tcp_connect(int fd[2], co
 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;
+	enum protocol protocol = PROTO_LOCAL;
 
-	host = NULL;
-	path = url;
-	colon = strchr(url, ':');
-	protocol = PROTO_LOCAL;
-	if (colon) {
-		*colon = 0;
+	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);
 
---
0.99.9.GIT
Message 1 of 1 in “Client side support for user-relative paths.”
  1. 3/5 Client side support for user-relative paths.Andreas Ericsson, Nov 17, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.