mirror of
https://github.com/git/git.git
synced 2024-12-12 19:34:35 +08:00
92722efec0
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>
107 lines
3.1 KiB
Bash
Executable File
107 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='check output directory names used by git-clone'
|
|
. ./test-lib.sh
|
|
|
|
# we use a fake ssh wrapper that ignores the arguments
|
|
# entirely; we really only care that we get _some_ repo,
|
|
# as the real test is what clone does on the local side
|
|
test_expect_success 'setup ssh wrapper' '
|
|
write_script "$TRASH_DIRECTORY/ssh-wrapper" <<-\EOF &&
|
|
git upload-pack "$TRASH_DIRECTORY"
|
|
EOF
|
|
GIT_SSH="$TRASH_DIRECTORY/ssh-wrapper" &&
|
|
export GIT_SSH &&
|
|
export TRASH_DIRECTORY
|
|
'
|
|
|
|
# make sure that cloning $1 results in local directory $2
|
|
test_clone_dir () {
|
|
url=$1; shift
|
|
dir=$1; shift
|
|
expect=success
|
|
bare=non-bare
|
|
clone_opts=
|
|
for i in "$@"
|
|
do
|
|
case "$i" in
|
|
fail)
|
|
expect=failure
|
|
;;
|
|
bare)
|
|
bare=bare
|
|
clone_opts=--bare
|
|
;;
|
|
esac
|
|
done
|
|
test_expect_$expect "clone of $url goes to $dir ($bare)" "
|
|
rm -rf $dir &&
|
|
git clone $clone_opts $url &&
|
|
test_path_is_dir $dir
|
|
"
|
|
}
|
|
|
|
# basic syntax with bare and non-bare variants
|
|
test_clone_dir host:foo foo
|
|
test_clone_dir host:foo foo.git bare
|
|
test_clone_dir host:foo.git foo
|
|
test_clone_dir host:foo.git foo.git bare
|
|
test_clone_dir host:foo/.git foo
|
|
test_clone_dir host:foo/.git foo.git bare
|
|
|
|
# similar, but using ssh URL rather than host:path syntax
|
|
test_clone_dir ssh://host/foo foo
|
|
test_clone_dir ssh://host/foo foo.git bare
|
|
test_clone_dir ssh://host/foo.git foo
|
|
test_clone_dir ssh://host/foo.git foo.git bare
|
|
test_clone_dir ssh://host/foo/.git foo
|
|
test_clone_dir ssh://host/foo/.git foo.git bare
|
|
|
|
# we should remove trailing slashes and .git suffixes
|
|
test_clone_dir ssh://host/foo/ foo
|
|
test_clone_dir ssh://host/foo/// foo
|
|
test_clone_dir ssh://host/foo/.git/ foo
|
|
test_clone_dir ssh://host/foo.git/ foo
|
|
test_clone_dir ssh://host/foo.git/// foo
|
|
test_clone_dir ssh://host/foo///.git/ foo
|
|
test_clone_dir ssh://host/foo/.git/// foo
|
|
|
|
test_clone_dir host:foo/ foo
|
|
test_clone_dir host:foo/// foo
|
|
test_clone_dir host:foo.git/ foo
|
|
test_clone_dir host:foo/.git/ foo
|
|
test_clone_dir host:foo.git/// foo
|
|
test_clone_dir host:foo///.git/ foo
|
|
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
|
|
test_clone_dir ssh://user@host/ host
|
|
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
|
|
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
|
|
test_clone_dir ssh://host/foo@bar.git foo@bar
|
|
test_clone_dir ssh://user:password@host/foo@bar foo@bar
|
|
test_clone_dir ssh://user:passw@rd@host/foo@bar.git foo@bar
|
|
|
|
test_clone_dir host:/foo@bar foo@bar
|
|
test_clone_dir host:/foo@bar.git foo@bar
|
|
test_clone_dir user:password@host:/foo@bar foo@bar
|
|
test_clone_dir user:passw@rd@host:/foo@bar.git foo@bar
|
|
|
|
# trailing port-like numbers should not be stripped for paths
|
|
test_clone_dir ssh://user:password@host/test:1234 1234
|
|
test_clone_dir ssh://user:password@host/test:1234.git 1234
|
|
|
|
test_done
|