Browse Source

decode file:// and ssh:// URLs

We generally treat these as equivalent to "/path/to/repo"
and "host:path_to_repo" respectively. However, they are URLs
and as such may be percent-encoded. The current code simply
uses them as-is without any decoding.

With this patch, we will now percent-decode any file:// or
ssh:// url (or ssh+git, git+ssh, etc) at the transport
layer. We continue to treat plain paths and "host:path"
syntax literally.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Jeff King 15 years ago committed by Junio C Hamano
parent
commit
9d2e942070
  1. 8
      connect.c
  2. 12
      t/t5601-clone.sh

8
connect.c

@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
#include "refs.h"
#include "run-command.h"
#include "remote.h"
#include "url.h"

static char *server_capabilities;

@ -450,7 +451,7 @@ static struct child_process no_fork; @@ -450,7 +451,7 @@ static struct child_process no_fork;
struct child_process *git_connect(int fd[2], const char *url_orig,
const char *prog, int flags)
{
char *url = xstrdup(url_orig);
char *url;
char *host, *path;
char *end;
int c;
@ -466,6 +467,11 @@ struct child_process *git_connect(int fd[2], const char *url_orig, @@ -466,6 +467,11 @@ struct child_process *git_connect(int fd[2], const char *url_orig,
*/
signal(SIGCHLD, SIG_DFL);

if (is_url(url_orig))
url = url_decode(url_orig);
else
url = xstrdup(url_orig);

host = strstr(url, "://");
if (host) {
*host = '\0';

12
t/t5601-clone.sh

@ -176,4 +176,16 @@ test_expect_success 'clone respects global branch.autosetuprebase' ' @@ -176,4 +176,16 @@ test_expect_success 'clone respects global branch.autosetuprebase' '
)
'

test_expect_success 'respect url-encoding of file://' '
git init x+y &&
test_must_fail git clone "file://$PWD/x+y" xy-url &&
git clone "file://$PWD/x%2By" xy-url
'

test_expect_success 'do not respect url-encoding of non-url path' '
git init x+y &&
test_must_fail git clone x%2By xy-regular &&
git clone x+y xy-regular
'

test_done

Loading…
Cancel
Save