]> git.ipfire.org Git - thirdparty/git.git/commitdiff
git fetch: support host:/~repo
authorTorsten Bögershausen <tboegi@web.de>
Thu, 28 Nov 2013 19:49:38 +0000 (20:49 +0100)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Dec 2013 22:54:47 +0000 (14:54 -0800)
The documentation (in urls.txt) says that

    "ssh://host:/~repo",
    "host:/~repo" or
    "host:~repo"

specify the repository "repo" in the home directory at "host".

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

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".

However, after 356bec "[::1]" was converted into "::1", yielding
url != hostname as well.  To fix this regression, don't use
"if (url != hostname)", but look at the separator instead.

Rename the variable "c" into "separator" to make it easier to read.

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
connect.c
t/t5500-fetch-pack.sh
t/t5601-clone.sh

index a16bdaf0b77a3e8de97cf15b6d198351950b7143..7e5f608a2fcb0ffbddebb2d2d836baaa869a477a 100644 (file)
--- 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);
index 545dd7b8e1cdb4fa989846fba10a314154629a45..df5baf8d6f962a53b398099433fe750bb5019df5 100755 (executable)
@@ -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
index ba99972d88c72682df66f5e2d93ec0c459ee96cf..4db0c0b01ec7e6ea173809ce99d83fbfe2646fb7 100755 (executable)
@@ -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