diff options
Diffstat (limited to '')
-rwxr-xr-x | t/t5600-clone-fail-cleanup.sh | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/t/t5600-clone-fail-cleanup.sh b/t/t5600-clone-fail-cleanup.sh new file mode 100755 index 0000000..c814afa --- /dev/null +++ b/t/t5600-clone-fail-cleanup.sh @@ -0,0 +1,110 @@ +#!/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. + +Unless the directory already exists, in which case we clean up only what we +wrote. +' + +TEST_PASSES_SANITIZE_LEAK=true +. ./test-lib.sh + +corrupt_repo () { + test_when_finished "rmdir foo/.git/objects.bak" && + mkdir foo/.git/objects.bak/ && + test_when_finished "mv foo/.git/objects.bak/* foo/.git/objects/" && + mv foo/.git/objects/* foo/.git/objects.bak/ +} + +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_path_is_missing bar +' + +test_expect_success 'create a repo to clone' ' + test_create_repo foo +' + +test_expect_success 'create objects in repo for later corruption' ' + test_commit -C foo file && + git -C foo checkout --detach && + test_commit -C foo detached +' + +# 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_path_is_dir bar +' + +test_expect_success 'failed clone --separate-git-dir should not leave any directories' ' + corrupt_repo && + test_must_fail git clone --separate-git-dir gitdir foo worktree && + test_path_is_missing gitdir && + test_path_is_missing worktree +' + +test_expect_success 'failed clone into empty leaves directory (vanilla)' ' + mkdir -p empty && + corrupt_repo && + test_must_fail git clone foo empty && + test_dir_is_empty empty +' + +test_expect_success 'failed clone into empty leaves directory (bare)' ' + mkdir -p empty && + corrupt_repo && + test_must_fail git clone --bare foo empty && + test_dir_is_empty empty +' + +test_expect_success 'failed clone into empty leaves directory (separate)' ' + mkdir -p empty-git empty-wt && + corrupt_repo && + test_must_fail git clone --separate-git-dir empty-git foo empty-wt && + test_dir_is_empty empty-git && + test_dir_is_empty empty-wt +' + +test_expect_success 'failed clone into empty leaves directory (separate, git)' ' + mkdir -p empty-git && + corrupt_repo && + test_must_fail git clone --separate-git-dir empty-git foo no-wt && + test_dir_is_empty empty-git && + test_path_is_missing no-wt +' + +test_expect_success 'failed clone into empty leaves directory (separate, wt)' ' + mkdir -p empty-wt && + corrupt_repo && + test_must_fail git clone --separate-git-dir no-git foo empty-wt && + test_path_is_missing no-git && + test_dir_is_empty empty-wt +' + +test_expect_success 'transport failure cleans up directory' ' + test_must_fail git clone --no-local \ + -u "f() { git-upload-pack \"\$@\"; return 1; }; f" \ + foo broken-clone && + test_path_is_missing broken-clone +' + +test_done |