mirror of
https://github.com/git/git
synced 2024-08-24 02:11:08 +00:00
![Jeff King](/assets/img/avatar_default.png)
Once upon a time, git-clone would refuse to write into a
directory that it did not itself create. The cleanup
routines for a failed clone could therefore just remove the
git and worktree dirs completely.
In 55892d2398
(Allow cloning to an existing empty directory,
2009-01-11), we learned to write into an existing directory.
Which means that doing:
mkdir foo
git clone will-fail foo
ends up deleting foo. This isn't a huge catastrophe, since
by definition foo must be empty. But it's somewhat
confusing; we should leave the filesystem as we found it.
Because we know that the only directory we'll write into is
an empty one, we can handle this case by just passing the
KEEP_TOPLEVEL flag to our recursive delete (if we could
write into populated directories, we'd have to keep track of
what we wrote and what we did not, which would be much
harder).
Note that we need to handle the work-tree and git-dir
separately, though, as only one might exist (and the new
tests in t5600 cover all cases).
Reported-by: Stephan Janssen <sjanssen@you-get.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
101 lines
2.7 KiB
Bash
Executable file
101 lines
2.7 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.
|
|
|
|
Unless the directory already exists, in which case we clean up only what we
|
|
wrote.
|
|
'
|
|
|
|
. ./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
|
|
'
|
|
|
|
# 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_done
|