Merge branch 'jk/guess-repo-name-regression-fix'
"git clone $URL" in recent releases of Git contains a regression in the code that invents a new repository name incorrectly based on the $URL. This has been corrected. * jk/guess-repo-name-regression-fix: clone: use computed length in guess_dir_name clone: add tests for output directory
This commit is contained in:
commit
8259da5ea3
@ -174,7 +174,8 @@ static char *guess_dir_name(const char *repo, int is_bundle, int is_bare)
|
||||
/*
|
||||
* Strip .{bundle,git}.
|
||||
*/
|
||||
strip_suffix(start, is_bundle ? ".bundle" : ".git" , &len);
|
||||
len = end - start;
|
||||
strip_suffix_mem(start, &len, is_bundle ? ".bundle" : ".git");
|
||||
|
||||
if (is_bare)
|
||||
dir = xstrfmt("%.*s.git", (int)len, start);
|
||||
|
106
t/t5603-clone-dirname.sh
Executable file
106
t/t5603-clone-dirname.sh
Executable file
@ -0,0 +1,106 @@
|
||||
#!/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 fail
|
||||
test_clone_dir ssh://user@host/ host fail
|
||||
test_clone_dir host:/ host fail
|
||||
|
||||
# auth materials should be redacted
|
||||
test_clone_dir ssh://user:password@host/ host fail
|
||||
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
|
||||
|
||||
# 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
|
Loading…
Reference in New Issue
Block a user