Merge branch 'sg/t4051-fix'
[git] / t / t5600-clone-fail-cleanup.sh
1 #!/bin/sh
2 #
3 # Copyright (C) 2006 Carl D. Worth <cworth@cworth.org>
4 #
5
6 test_description='test git clone to cleanup after failure
7
8 This test covers the fact that if git clone fails, it should remove
9 the directory it created, to avoid the user having to manually
10 remove the directory before attempting a clone again.
11
12 Unless the directory already exists, in which case we clean up only what we
13 wrote.
14 '
15
16 . ./test-lib.sh
17
18 corrupt_repo () {
19         test_when_finished "rmdir foo/.git/objects.bak" &&
20         mkdir foo/.git/objects.bak/ &&
21         test_when_finished "mv foo/.git/objects.bak/* foo/.git/objects/" &&
22         mv foo/.git/objects/* foo/.git/objects.bak/
23 }
24
25 test_expect_success 'clone of non-existent source should fail' '
26         test_must_fail git clone foo bar
27 '
28
29 test_expect_success 'failed clone should not leave a directory' '
30         test_path_is_missing bar
31 '
32
33 test_expect_success 'create a repo to clone' '
34         test_create_repo foo
35 '
36
37 test_expect_success 'create objects in repo for later corruption' '
38         test_commit -C foo file
39 '
40
41 # source repository given to git clone should be relative to the
42 # current path not to the target dir
43 test_expect_success 'clone of non-existent (relative to $PWD) source should fail' '
44         test_must_fail git clone ../foo baz
45 '
46
47 test_expect_success 'clone should work now that source exists' '
48         git clone foo bar
49 '
50
51 test_expect_success 'successful clone must leave the directory' '
52         test_path_is_dir bar
53 '
54
55 test_expect_success 'failed clone --separate-git-dir should not leave any directories' '
56         corrupt_repo &&
57         test_must_fail git clone --separate-git-dir gitdir foo worktree &&
58         test_path_is_missing gitdir &&
59         test_path_is_missing worktree
60 '
61
62 test_expect_success 'failed clone into empty leaves directory (vanilla)' '
63         mkdir -p empty &&
64         corrupt_repo &&
65         test_must_fail git clone foo empty &&
66         test_dir_is_empty empty
67 '
68
69 test_expect_success 'failed clone into empty leaves directory (bare)' '
70         mkdir -p empty &&
71         corrupt_repo &&
72         test_must_fail git clone --bare foo empty &&
73         test_dir_is_empty empty
74 '
75
76 test_expect_success 'failed clone into empty leaves directory (separate)' '
77         mkdir -p empty-git empty-wt &&
78         corrupt_repo &&
79         test_must_fail git clone --separate-git-dir empty-git foo empty-wt &&
80         test_dir_is_empty empty-git &&
81         test_dir_is_empty empty-wt
82 '
83
84 test_expect_success 'failed clone into empty leaves directory (separate, git)' '
85         mkdir -p empty-git &&
86         corrupt_repo &&
87         test_must_fail git clone --separate-git-dir empty-git foo no-wt &&
88         test_dir_is_empty empty-git &&
89         test_path_is_missing no-wt
90 '
91
92 test_expect_success 'failed clone into empty leaves directory (separate, wt)' '
93         mkdir -p empty-wt &&
94         corrupt_repo &&
95         test_must_fail git clone --separate-git-dir no-git foo empty-wt &&
96         test_path_is_missing no-git &&
97         test_dir_is_empty empty-wt
98 '
99
100 test_done