mirror of
https://github.com/git/git.git
synced 2025-03-16 10:35:14 +00:00
Since b57fb80a7d (init, clone: support --separate-git-dir for .git file) git clone supports the --separate-git-dir option to create the git dir outside the work tree. But when that option is used, the git dir won't be deleted in case the clone fails like it would be without this option. This makes clone lose its atomicity as in case of a failure a partly set up git dir is left behind. A real world example where this leads to problems is when "git submodule update" fails to clone a submodule and later calls to "git submodule update" stumble over the partially set up git dir and try to revive the submodule from there, which then fails with a not very user friendly error message. Fix that by updating the junk_git_dir variable (used to remember if and what git dir should be removed in case of failure) to the new value given with the --seperate-git-dir option. Also add a test for this to t5600 (and while at it fix the former last test to not cd into a directory to test for its existence but use "test -d" instead). Reported-by: Manlio Perillo <manlio.perillo@gmail.com> Signed-off-by: Jens Lehmann <Jens.Lehmann@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
53 lines
1.5 KiB
Bash
Executable File
53 lines
1.5 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
|
|
#
|
|
|
|
test_description='test git clone to cleanup after failure
|
|
|
|
This test covers the fact that if git clone fails, it should remove
|
|
the directory it created, to avoid the user having to manually
|
|
remove the directory before attempting a clone again.'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success \
|
|
'clone of non-existent source should fail' \
|
|
'test_must_fail git clone foo bar'
|
|
|
|
test_expect_success \
|
|
'failed clone should not leave a directory' \
|
|
'! test -d bar'
|
|
|
|
# Need a repo to clone
|
|
test_create_repo foo
|
|
|
|
# clone doesn't like it if there is no HEAD. Is that a bug?
|
|
(cd foo && touch file && git add file && git commit -m 'add file' >/dev/null 2>&1)
|
|
|
|
# source repository given to git clone should be relative to the
|
|
# current path not to the target dir
|
|
test_expect_success \
|
|
'clone of non-existent (relative to $PWD) source should fail' \
|
|
'test_must_fail git clone ../foo baz'
|
|
|
|
test_expect_success \
|
|
'clone should work now that source exists' \
|
|
'git clone foo bar'
|
|
|
|
test_expect_success \
|
|
'successful clone must leave the directory' \
|
|
'test -d bar'
|
|
|
|
test_expect_success 'failed clone --separate-git-dir should not leave any directories' '
|
|
mkdir foo/.git/objects.bak/ &&
|
|
mv foo/.git/objects/* foo/.git/objects.bak/ &&
|
|
test_must_fail git clone --separate-git-dir gitdir foo worktree &&
|
|
test_must_fail test -e gitdir &&
|
|
test_must_fail test -e worktree &&
|
|
mv foo/.git/objects.bak/* foo/.git/objects/ &&
|
|
rmdir foo/.git/objects.bak
|
|
'
|
|
|
|
test_done
|