[PATCH v7 07/10] git fetch: support host:/~repo

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The documentation (in urls.txt) says that
"ssh://host:/~repo",
"host:/~repo" or
"host:~repo"
specifiy the repository "repo" in the home directory at "host".

This has not been working for "host:/~repo".

Fix a minor regression:
Before commit 356bec "Support [address] in URLs"
the comparison url != hostname could be used to determine if
the URL had a scheme or not: "ssh://host/host" != "host".
After 356bec "[::1]" was converted into "::1", yielding
url != hostname as well.
Solution:
Don't use "if (url != hostname)", but look at the separator instead.
Rename the variable "c" into separator.

Signed-off-by: Torsten Bögershausen <tboegi@xxxxxx>
---
 connect.c             | 14 +++++++-------
 t/t5500-fetch-pack.sh | 24 ++++++++++++++++++++++++
 t/t5601-clone.sh      | 12 ++----------
 3 files changed, 33 insertions(+), 17 deletions(-)

diff --git a/connect.c b/connect.c
index a16bdaf..7e5f608 100644
--- a/connect.c
+++ b/connect.c
@@ -567,7 +567,7 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 	char *url;
 	char *host, *path;
 	char *end;
-	int c;
+	int separator;
 	enum protocol protocol = PROTO_LOCAL;
 	int free_path = 0;
 	char *port = NULL;
@@ -582,10 +582,10 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 		*host = '\0';
 		protocol = get_protocol(url);
 		host += 3;
-		c = '/';
+		separator = '/';
 	} else {
 		host = url;
-		c = ':';
+		separator = ':';
 	}
 
 	/*
@@ -605,9 +605,9 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 	} else
 		end = host;
 
-	path = strchr(end, c);
+	path = strchr(end, separator);
 	if (path && !has_dos_drive_prefix(end)) {
-		if (c == ':') {
+		if (separator == ':') {
 			if (host != url || path < strchrnul(host, '/')) {
 				protocol = PROTO_SSH;
 				*path++ = '\0';
@@ -624,7 +624,7 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 	 * null-terminate hostname and point path to ~ for URL's like this:
 	 *    ssh://host.xz/~user/repo
 	 */
-	if (protocol != PROTO_LOCAL && host != url) {
+	if (protocol != PROTO_LOCAL) {
 		char *ptr = path;
 		if (path[1] == '~')
 			path++;
@@ -639,7 +639,7 @@ static enum protocol parse_connect_url(const char *url_orig, char **ret_host,
 	/*
 	 * Add support for ssh port: ssh://host.xy:<port>/...
 	 */
-	if (protocol == PROTO_SSH && host != url)
+	if (protocol == PROTO_SSH && separator == '/')
 		port = get_port(end);
 
 	*ret_host = xstrdup(host);
diff --git a/t/t5500-fetch-pack.sh b/t/t5500-fetch-pack.sh
index a2b37af..2d3cdaa 100755
--- a/t/t5500-fetch-pack.sh
+++ b/t/t5500-fetch-pack.sh
@@ -589,6 +589,30 @@ do
 			check_prot_path $p://$h/~$r $p "/~$r"
 		'
 	done
+	# file without scheme
+	for h in nohost nohost:12 [::1] [::1]:23 [ [:aa
+	do
+		test_expect_success "fetch-pack --diag-url ./$h:$r" '
+			check_prot_path ./$h:$r $p "./$h:$r"
+		'
+		# No "/~" -> "~" conversion for file
+		test_expect_success "fetch-pack --diag-url ./$p:$h/~$r" '
+		check_prot_path ./$p:$h/~$r $p "./$p:$h/~$r"
+		'
+	done
+	#ssh without scheme
+	p=ssh
+	for h in host [::1]
+	do
+		hh=$(echo $h | tr -d "[]")
+		test_expect_success "fetch-pack --diag-url $h:$r" '
+			check_prot_path $h:$r $p "$r"
+		'
+		# Do "/~" -> "~" conversion
+		test_expect_success "fetch-pack --diag-url $h:/~$r" '
+			check_prot_host_path $h:/~$r $p "$hh" "~$r"
+		'
+	done
 done
 
 test_done
diff --git a/t/t5601-clone.sh b/t/t5601-clone.sh
index ba99972..4db0c0b 100755
--- a/t/t5601-clone.sh
+++ b/t/t5601-clone.sh
@@ -348,7 +348,7 @@ test_expect_success MINGW 'clone c:temp is dos drive' '
 '
 
 #ip v4
-for repo in rep rep/home/project /~proj 123
+for repo in rep rep/home/project 123
 do
 	test_expect_success "clone host:$repo" '
 		test_clone_url host:$repo host $repo
@@ -356,14 +356,6 @@ do
 done
 
 #ipv6
-# failing
-for repo in /~proj
-do
-	test_expect_failure "clone [::1]:$repo" '
-		test_clone_url [::1]:$repo ::1 $repo
-	'
-done
-
 for repo in rep rep/home/project 123
 do
 	test_expect_success "clone [::1]:$repo" '
@@ -373,7 +365,7 @@ done
 
 # Corner cases
 # failing
-for repo in [foo]bar/baz:qux [foo/bar]:baz
+for url in [foo]bar/baz:qux [foo/bar]:baz
 do
 	test_expect_failure "clone $url is not ssh" '
 		test_clone_url $url none
-- 
1.8.5.rc0.23.gaa27064


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]