Skip to content

Commit

Permalink
clone: do not use port number as dir name
Browse files Browse the repository at this point in the history
If the URI contains a port number and the URI's path component is
empty we fail to guess a sensible directory name. E.g. cloning a
repository 'ssh://example.com:2222/' we guess a directory name
'2222' where we would want the hostname only, e.g. 'example.com'.

We need to take care to not drop trailing port-like numbers in
certain cases. E.g. when cloning a repository 'foo/bar:2222.git'
we want to guess the directory name '2222' instead of 'bar'.
Thus, we have to first check the stripped URI for path separators
and only strip port numbers if there are path separators present.
This heuristic breaks when cloning a repository 'bar:2222.git',
though.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Patrick Steinhardt authored and Junio C Hamano committed Aug 10, 2015
1 parent e895986 commit 92722ef
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 7 deletions.
17 changes: 17 additions & 0 deletions builtin/clone.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,23 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
end--;
}

/*
* Strip trailing port number if we've got only a
* hostname (that is, there is no dir separator but a
* colon). This check is required such that we do not
* strip URI's like '/foo/bar:2222.git', which should
* result in a dir '2222' being guessed due to backwards
* compatibility.
*/
if (memchr(start, '/', end - start) == NULL
&& memchr(start, ':', end - start) != NULL) {
ptr = end;
while (start < ptr && isdigit(ptr[-1]) && ptr[-1] != ':')
ptr--;
if (start < ptr && ptr[-1] == ':')
end = ptr - 1;
}

/*
* Find last component. To remain backwards compatible we
* also regard colons as path separators, such that
Expand Down
14 changes: 7 additions & 7 deletions t/t5603-clone-dirname.sh
Original file line number Diff line number Diff line change
Expand Up @@ -76,17 +76,17 @@ test_clone_dir host:foo/.git/// foo

# omitting the path should default to the hostname
test_clone_dir ssh://host/ host
test_clone_dir ssh://host:1234/ host fail
test_clone_dir ssh://host:1234/ host
test_clone_dir ssh://user@host/ host
test_clone_dir host:/ host fail
test_clone_dir host:/ host

# auth materials should be redacted
test_clone_dir ssh://user:password@host/ host
test_clone_dir ssh://user:password@host:1234/ host fail
test_clone_dir ssh://user:passw@rd@host:1234/ host fail
test_clone_dir user@host:/ host fail
test_clone_dir user:password@host:/ host fail
test_clone_dir user:passw@rd@host:/ host fail
test_clone_dir ssh://user:password@host:1234/ host
test_clone_dir ssh://user:passw@rd@host:1234/ host
test_clone_dir user@host:/ host
test_clone_dir user:password@host:/ host
test_clone_dir user:passw@rd@host:/ host

# auth-like material should not be dropped
test_clone_dir ssh://host/foo@bar foo@bar
Expand Down

0 comments on commit 92722ef

Please sign in to comment.