checkout: do not fail if target is an empty directory
[git] / t / t2026-prune-linked-checkouts.sh
1 #!/bin/sh
2
3 test_description='prune $GIT_DIR/worktrees'
4
5 . ./test-lib.sh
6
7 test_expect_success 'prune --worktrees on normal repo' '
8         git prune --worktrees &&
9         test_must_fail git prune --worktrees abc
10 '
11
12 test_expect_success 'prune files inside $GIT_DIR/worktrees' '
13         mkdir .git/worktrees &&
14         : >.git/worktrees/abc &&
15         git prune --worktrees --verbose >actual &&
16         cat >expect <<EOF &&
17 Removing worktrees/abc: not a valid directory
18 EOF
19         test_i18ncmp expect actual &&
20         ! test -f .git/worktrees/abc &&
21         ! test -d .git/worktrees
22 '
23
24 test_expect_success 'prune directories without gitdir' '
25         mkdir -p .git/worktrees/def/abc &&
26         : >.git/worktrees/def/def &&
27         cat >expect <<EOF &&
28 Removing worktrees/def: gitdir file does not exist
29 EOF
30         git prune --worktrees --verbose >actual &&
31         test_i18ncmp expect actual &&
32         ! test -d .git/worktrees/def &&
33         ! test -d .git/worktrees
34 '
35
36 test_expect_success POSIXPERM 'prune directories with unreadable gitdir' '
37         mkdir -p .git/worktrees/def/abc &&
38         : >.git/worktrees/def/def &&
39         : >.git/worktrees/def/gitdir &&
40         chmod u-r .git/worktrees/def/gitdir &&
41         git prune --worktrees --verbose >actual &&
42         test_i18ngrep "Removing worktrees/def: unable to read gitdir file" actual &&
43         ! test -d .git/worktrees/def &&
44         ! test -d .git/worktrees
45 '
46
47 test_expect_success 'prune directories with invalid gitdir' '
48         mkdir -p .git/worktrees/def/abc &&
49         : >.git/worktrees/def/def &&
50         : >.git/worktrees/def/gitdir &&
51         git prune --worktrees --verbose >actual &&
52         test_i18ngrep "Removing worktrees/def: invalid gitdir file" actual &&
53         ! test -d .git/worktrees/def &&
54         ! test -d .git/worktrees
55 '
56
57 test_expect_success 'prune directories with gitdir pointing to nowhere' '
58         mkdir -p .git/worktrees/def/abc &&
59         : >.git/worktrees/def/def &&
60         echo "$(pwd)"/nowhere >.git/worktrees/def/gitdir &&
61         git prune --worktrees --verbose >actual &&
62         test_i18ngrep "Removing worktrees/def: gitdir file points to non-existent location" actual &&
63         ! test -d .git/worktrees/def &&
64         ! test -d .git/worktrees
65 '
66
67 test_expect_success 'not prune locked checkout' '
68         test_when_finished rm -r .git/worktrees
69         mkdir -p .git/worktrees/ghi &&
70         : >.git/worktrees/ghi/locked &&
71         git prune --worktrees &&
72         test -d .git/worktrees/ghi
73 '
74
75 test_expect_success 'not prune recent checkouts' '
76         test_when_finished rm -r .git/worktrees
77         mkdir zz &&
78         mkdir -p .git/worktrees/jlm &&
79         echo "$(pwd)"/zz >.git/worktrees/jlm/gitdir &&
80         git prune --worktrees --verbose --expire=2.days.ago &&
81         test -d .git/worktrees/jlm
82 '
83
84 test_done