]>
Commit | Line | Data |
---|---|---|
e8e1ff24 ES |
1 | #!/bin/sh |
2 | ||
3 | test_description='test git worktree repair' | |
4 | ||
9f24f3c7 | 5 | TEST_PASSES_SANITIZE_LEAK=true |
e8e1ff24 ES |
6 | . ./test-lib.sh |
7 | ||
8 | test_expect_success setup ' | |
9 | test_commit init | |
10 | ' | |
11 | ||
bdd1f3e4 ES |
12 | test_expect_success 'skip missing worktree' ' |
13 | test_when_finished "git worktree prune" && | |
14 | git worktree add --detach missing && | |
15 | rm -rf missing && | |
16 | git worktree repair >out 2>err && | |
17 | test_must_be_empty out && | |
18 | test_must_be_empty err | |
19 | ' | |
20 | ||
21 | test_expect_success 'worktree path not directory' ' | |
22 | test_when_finished "git worktree prune" && | |
23 | git worktree add --detach notdir && | |
24 | rm -rf notdir && | |
25 | >notdir && | |
26 | test_must_fail git worktree repair >out 2>err && | |
27 | test_must_be_empty out && | |
6789275d | 28 | test_grep "not a directory" err |
bdd1f3e4 ES |
29 | ' |
30 | ||
31 | test_expect_success "don't clobber .git repo" ' | |
32 | test_when_finished "rm -rf repo && git worktree prune" && | |
33 | git worktree add --detach repo && | |
34 | rm -rf repo && | |
35 | test_create_repo repo && | |
36 | test_must_fail git worktree repair >out 2>err && | |
37 | test_must_be_empty out && | |
6789275d | 38 | test_grep ".git is not a file" err |
bdd1f3e4 ES |
39 | ' |
40 | ||
41 | test_corrupt_gitfile () { | |
42 | butcher=$1 && | |
43 | problem=$2 && | |
44 | repairdir=${3:-.} && | |
45 | test_when_finished 'rm -rf corrupt && git worktree prune' && | |
46 | git worktree add --detach corrupt && | |
47 | git -C corrupt rev-parse --absolute-git-dir >expect && | |
48 | eval "$butcher" && | |
da8fb6be | 49 | git -C "$repairdir" worktree repair 2>err && |
6789275d | 50 | test_grep "$problem" err && |
bdd1f3e4 ES |
51 | git -C corrupt rev-parse --absolute-git-dir >actual && |
52 | test_cmp expect actual | |
53 | } | |
54 | ||
55 | test_expect_success 'repair missing .git file' ' | |
56 | test_corrupt_gitfile "rm -f corrupt/.git" ".git file broken" | |
57 | ' | |
58 | ||
59 | test_expect_success 'repair bogus .git file' ' | |
60 | test_corrupt_gitfile "echo \"gitdir: /nowhere\" >corrupt/.git" \ | |
61 | ".git file broken" | |
62 | ' | |
63 | ||
64 | test_expect_success 'repair incorrect .git file' ' | |
65 | test_when_finished "rm -rf other && git worktree prune" && | |
66 | test_create_repo other && | |
67 | other=$(git -C other rev-parse --absolute-git-dir) && | |
68 | test_corrupt_gitfile "echo \"gitdir: $other\" >corrupt/.git" \ | |
69 | ".git file incorrect" | |
70 | ' | |
71 | ||
72 | test_expect_success 'repair .git file from main/.git' ' | |
73 | test_corrupt_gitfile "rm -f corrupt/.git" ".git file broken" .git | |
74 | ' | |
75 | ||
76 | test_expect_success 'repair .git file from linked worktree' ' | |
77 | test_when_finished "rm -rf other && git worktree prune" && | |
78 | git worktree add --detach other && | |
79 | test_corrupt_gitfile "rm -f corrupt/.git" ".git file broken" other | |
80 | ' | |
81 | ||
82 | test_expect_success 'repair .git file from bare.git' ' | |
83 | test_when_finished "rm -rf bare.git corrupt && git worktree prune" && | |
84 | git clone --bare . bare.git && | |
85 | git -C bare.git worktree add --detach ../corrupt && | |
86 | git -C corrupt rev-parse --absolute-git-dir >expect && | |
87 | rm -f corrupt/.git && | |
88 | git -C bare.git worktree repair && | |
89 | git -C corrupt rev-parse --absolute-git-dir >actual && | |
90 | test_cmp expect actual | |
91 | ' | |
92 | ||
b214ab5a ES |
93 | test_expect_success 'invalid worktree path' ' |
94 | test_must_fail git worktree repair /notvalid >out 2>err && | |
95 | test_must_be_empty out && | |
6789275d | 96 | test_grep "not a valid path" err |
b214ab5a ES |
97 | ' |
98 | ||
99 | test_expect_success 'repo not found; .git not file' ' | |
100 | test_when_finished "rm -rf not-a-worktree" && | |
101 | test_create_repo not-a-worktree && | |
102 | test_must_fail git worktree repair not-a-worktree >out 2>err && | |
103 | test_must_be_empty out && | |
6789275d | 104 | test_grep ".git is not a file" err |
b214ab5a ES |
105 | ' |
106 | ||
cf76baea ES |
107 | test_expect_success 'repo not found; .git not referencing repo' ' |
108 | test_when_finished "rm -rf side not-a-repo && git worktree prune" && | |
109 | git worktree add --detach side && | |
110 | sed s,\.git/worktrees/side$,not-a-repo, side/.git >side/.newgit && | |
111 | mv side/.newgit side/.git && | |
112 | mkdir not-a-repo && | |
113 | test_must_fail git worktree repair side 2>err && | |
6789275d | 114 | test_grep ".git file does not reference a repository" err |
cf76baea ES |
115 | ' |
116 | ||
b214ab5a ES |
117 | test_expect_success 'repo not found; .git file broken' ' |
118 | test_when_finished "rm -rf orig moved && git worktree prune" && | |
119 | git worktree add --detach orig && | |
120 | echo /invalid >orig/.git && | |
121 | mv orig moved && | |
122 | test_must_fail git worktree repair moved >out 2>err && | |
123 | test_must_be_empty out && | |
6789275d | 124 | test_grep ".git file broken" err |
b214ab5a ES |
125 | ' |
126 | ||
127 | test_expect_success 'repair broken gitdir' ' | |
128 | test_when_finished "rm -rf orig moved && git worktree prune" && | |
129 | git worktree add --detach orig && | |
130 | sed s,orig/\.git$,moved/.git, .git/worktrees/orig/gitdir >expect && | |
131 | rm .git/worktrees/orig/gitdir && | |
132 | mv orig moved && | |
da8fb6be | 133 | git worktree repair moved 2>err && |
b214ab5a | 134 | test_cmp expect .git/worktrees/orig/gitdir && |
6789275d | 135 | test_grep "gitdir unreadable" err |
b214ab5a ES |
136 | ' |
137 | ||
138 | test_expect_success 'repair incorrect gitdir' ' | |
139 | test_when_finished "rm -rf orig moved && git worktree prune" && | |
140 | git worktree add --detach orig && | |
141 | sed s,orig/\.git$,moved/.git, .git/worktrees/orig/gitdir >expect && | |
142 | mv orig moved && | |
da8fb6be | 143 | git worktree repair moved 2>err && |
b214ab5a | 144 | test_cmp expect .git/worktrees/orig/gitdir && |
6789275d | 145 | test_grep "gitdir incorrect" err |
b214ab5a ES |
146 | ' |
147 | ||
148 | test_expect_success 'repair gitdir (implicit) from linked worktree' ' | |
149 | test_when_finished "rm -rf orig moved && git worktree prune" && | |
150 | git worktree add --detach orig && | |
151 | sed s,orig/\.git$,moved/.git, .git/worktrees/orig/gitdir >expect && | |
152 | mv orig moved && | |
da8fb6be | 153 | git -C moved worktree repair 2>err && |
b214ab5a | 154 | test_cmp expect .git/worktrees/orig/gitdir && |
6789275d | 155 | test_grep "gitdir incorrect" err |
b214ab5a ES |
156 | ' |
157 | ||
158 | test_expect_success 'unable to repair gitdir (implicit) from main worktree' ' | |
159 | test_when_finished "rm -rf orig moved && git worktree prune" && | |
160 | git worktree add --detach orig && | |
161 | cat .git/worktrees/orig/gitdir >expect && | |
162 | mv orig moved && | |
da8fb6be | 163 | git worktree repair 2>err && |
b214ab5a | 164 | test_cmp expect .git/worktrees/orig/gitdir && |
b214ab5a ES |
165 | test_must_be_empty err |
166 | ' | |
167 | ||
168 | test_expect_success 'repair multiple gitdir files' ' | |
169 | test_when_finished "rm -rf orig1 orig2 moved1 moved2 && | |
170 | git worktree prune" && | |
171 | git worktree add --detach orig1 && | |
172 | git worktree add --detach orig2 && | |
173 | sed s,orig1/\.git$,moved1/.git, .git/worktrees/orig1/gitdir >expect1 && | |
174 | sed s,orig2/\.git$,moved2/.git, .git/worktrees/orig2/gitdir >expect2 && | |
175 | mv orig1 moved1 && | |
176 | mv orig2 moved2 && | |
da8fb6be | 177 | git worktree repair moved1 moved2 2>err && |
b214ab5a ES |
178 | test_cmp expect1 .git/worktrees/orig1/gitdir && |
179 | test_cmp expect2 .git/worktrees/orig2/gitdir && | |
6789275d JH |
180 | test_grep "gitdir incorrect:.*orig1/gitdir$" err && |
181 | test_grep "gitdir incorrect:.*orig2/gitdir$" err | |
b214ab5a ES |
182 | ' |
183 | ||
cf76baea ES |
184 | test_expect_success 'repair moved main and linked worktrees' ' |
185 | test_when_finished "rm -rf main side mainmoved sidemoved" && | |
186 | test_create_repo main && | |
187 | test_commit -C main init && | |
188 | git -C main worktree add --detach ../side && | |
189 | sed "s,side/\.git$,sidemoved/.git," \ | |
190 | main/.git/worktrees/side/gitdir >expect-gitdir && | |
191 | sed "s,main/.git/worktrees/side$,mainmoved/.git/worktrees/side," \ | |
192 | side/.git >expect-gitfile && | |
193 | mv main mainmoved && | |
194 | mv side sidemoved && | |
195 | git -C mainmoved worktree repair ../sidemoved && | |
196 | test_cmp expect-gitdir mainmoved/.git/worktrees/side/gitdir && | |
197 | test_cmp expect-gitfile sidemoved/.git | |
198 | ' | |
199 | ||
e8e1ff24 | 200 | test_done |