]>
Commit | Line | Data |
---|---|---|
58142c09 NTND |
1 | #!/bin/sh |
2 | ||
3 | test_description='test git worktree move, remove, lock and unlock' | |
4 | ||
d40c42e0 | 5 | TEST_PASSES_SANITIZE_LEAK=true |
58142c09 NTND |
6 | . ./test-lib.sh |
7 | ||
8 | test_expect_success 'setup' ' | |
9 | test_commit init && | |
10 | git worktree add source && | |
7f19def0 ES |
11 | git worktree list --porcelain >out && |
12 | grep "^worktree" out >actual && | |
58142c09 NTND |
13 | cat <<-EOF >expected && |
14 | worktree $(pwd) | |
15 | worktree $(pwd)/source | |
16 | EOF | |
17 | test_cmp expected actual | |
18 | ' | |
19 | ||
20 | test_expect_success 'lock main worktree' ' | |
21 | test_must_fail git worktree lock . | |
22 | ' | |
23 | ||
24 | test_expect_success 'lock linked worktree' ' | |
25 | git worktree lock --reason hahaha source && | |
26 | echo hahaha >expected && | |
27 | test_cmp expected .git/worktrees/source/locked | |
28 | ' | |
29 | ||
30 | test_expect_success 'lock linked worktree from another worktree' ' | |
31 | rm .git/worktrees/source/locked && | |
32 | git worktree add elsewhere && | |
33 | git -C elsewhere worktree lock --reason hahaha ../source && | |
34 | echo hahaha >expected && | |
35 | test_cmp expected .git/worktrees/source/locked | |
36 | ' | |
37 | ||
38 | test_expect_success 'lock worktree twice' ' | |
39 | test_must_fail git worktree lock source && | |
40 | echo hahaha >expected && | |
41 | test_cmp expected .git/worktrees/source/locked | |
42 | ' | |
43 | ||
44 | test_expect_success 'lock worktree twice (from the locked worktree)' ' | |
45 | test_must_fail git -C source worktree lock . && | |
46 | echo hahaha >expected && | |
47 | test_cmp expected .git/worktrees/source/locked | |
48 | ' | |
49 | ||
6d308627 NTND |
50 | test_expect_success 'unlock main worktree' ' |
51 | test_must_fail git worktree unlock . | |
52 | ' | |
53 | ||
54 | test_expect_success 'unlock linked worktree' ' | |
55 | git worktree unlock source && | |
56 | test_path_is_missing .git/worktrees/source/locked | |
57 | ' | |
58 | ||
59 | test_expect_success 'unlock worktree twice' ' | |
60 | test_must_fail git worktree unlock source && | |
61 | test_path_is_missing .git/worktrees/source/locked | |
62 | ' | |
63 | ||
9f792bb4 NTND |
64 | test_expect_success 'move non-worktree' ' |
65 | mkdir abc && | |
66 | test_must_fail git worktree move abc def | |
67 | ' | |
68 | ||
69 | test_expect_success 'move locked worktree' ' | |
70 | git worktree lock source && | |
71 | test_when_finished "git worktree unlock source" && | |
72 | test_must_fail git worktree move source destination | |
73 | ' | |
74 | ||
75 | test_expect_success 'move worktree' ' | |
9f792bb4 NTND |
76 | git worktree move source destination && |
77 | test_path_is_missing source && | |
7f19def0 | 78 | git worktree list --porcelain >out && |
b1801b85 ES |
79 | grep "^worktree.*/destination$" out && |
80 | ! grep "^worktree.*/source$" out && | |
9f792bb4 NTND |
81 | git -C destination log --format=%s >actual2 && |
82 | echo init >expected2 && | |
83 | test_cmp expected2 actual2 | |
84 | ' | |
85 | ||
86 | test_expect_success 'move main worktree' ' | |
87 | test_must_fail git worktree move . def | |
88 | ' | |
89 | ||
c64a8d20 | 90 | test_expect_success 'move worktree to another dir' ' |
c64a8d20 NTND |
91 | mkdir some-dir && |
92 | git worktree move destination some-dir && | |
7f19def0 ES |
93 | test_when_finished "git worktree move some-dir/destination destination" && |
94 | test_path_is_missing destination && | |
95 | git worktree list --porcelain >out && | |
b1801b85 | 96 | grep "^worktree.*/some-dir/destination$" out && |
c64a8d20 NTND |
97 | git -C some-dir/destination log --format=%s >actual2 && |
98 | echo init >expected2 && | |
99 | test_cmp expected2 actual2 | |
100 | ' | |
101 | ||
68a6b3a1 ES |
102 | test_expect_success 'move locked worktree (force)' ' |
103 | test_when_finished " | |
104 | git worktree unlock flump || : | |
105 | git worktree remove flump || : | |
106 | git worktree unlock ploof || : | |
107 | git worktree remove ploof || : | |
108 | " && | |
109 | git worktree add --detach flump && | |
110 | git worktree lock flump && | |
111 | test_must_fail git worktree move flump ploof" && | |
112 | test_must_fail git worktree move --force flump ploof" && | |
113 | git worktree move --force --force flump ploof | |
114 | ' | |
115 | ||
810382ed ES |
116 | test_expect_success 'refuse to move worktree atop existing path' ' |
117 | >bobble && | |
118 | git worktree add --detach beeble && | |
119 | test_must_fail git worktree move beeble bobble | |
120 | ' | |
121 | ||
122 | test_expect_success 'move atop existing but missing worktree' ' | |
123 | git worktree add --detach gnoo && | |
124 | git worktree add --detach pneu && | |
125 | rm -fr pneu && | |
126 | test_must_fail git worktree move gnoo pneu && | |
127 | git worktree move --force gnoo pneu && | |
128 | ||
129 | git worktree add --detach nu && | |
130 | git worktree lock nu && | |
131 | rm -fr nu && | |
132 | test_must_fail git worktree move pneu nu && | |
133 | test_must_fail git worktree --force move pneu nu && | |
134 | git worktree move --force --force pneu nu | |
135 | ' | |
136 | ||
00a6d4d1 NTND |
137 | test_expect_success 'move a repo with uninitialized submodule' ' |
138 | git init withsub && | |
139 | ( | |
140 | cd withsub && | |
141 | test_commit initial && | |
142 | git submodule add "$PWD"/.git sub && | |
143 | git commit -m withsub && | |
144 | git worktree add second HEAD && | |
145 | git worktree move second third | |
146 | ) | |
147 | ' | |
148 | ||
149 | test_expect_success 'not move a repo with initialized submodule' ' | |
150 | ( | |
151 | cd withsub && | |
152 | git -C third submodule update && | |
153 | test_must_fail git worktree move third forth | |
154 | ) | |
155 | ' | |
156 | ||
cc73385c NTND |
157 | test_expect_success 'remove main worktree' ' |
158 | test_must_fail git worktree remove . | |
159 | ' | |
160 | ||
cc73385c NTND |
161 | test_expect_success 'remove locked worktree' ' |
162 | git worktree lock destination && | |
163 | test_when_finished "git worktree unlock destination" && | |
164 | test_must_fail git worktree remove destination | |
165 | ' | |
166 | ||
167 | test_expect_success 'remove worktree with dirty tracked file' ' | |
168 | echo dirty >>destination/init.t && | |
169 | test_when_finished "git -C destination checkout init.t" && | |
170 | test_must_fail git worktree remove destination | |
171 | ' | |
172 | ||
173 | test_expect_success 'remove worktree with untracked file' ' | |
174 | : >destination/untracked && | |
175 | test_must_fail git worktree remove destination | |
176 | ' | |
177 | ||
178 | test_expect_success 'force remove worktree with untracked file' ' | |
179 | git worktree remove --force destination && | |
180 | test_path_is_missing destination | |
181 | ' | |
182 | ||
ee6763af NTND |
183 | test_expect_success 'remove missing worktree' ' |
184 | git worktree add to-be-gone && | |
185 | test -d .git/worktrees/to-be-gone && | |
186 | mv to-be-gone gone && | |
187 | git worktree remove to-be-gone && | |
188 | test_path_is_missing .git/worktrees/to-be-gone | |
189 | ' | |
190 | ||
191 | test_expect_success 'NOT remove missing-but-locked worktree' ' | |
192 | git worktree add gone-but-locked && | |
193 | git worktree lock gone-but-locked && | |
194 | test -d .git/worktrees/gone-but-locked && | |
195 | mv gone-but-locked really-gone-now && | |
196 | test_must_fail git worktree remove gone-but-locked && | |
197 | test_path_is_dir .git/worktrees/gone-but-locked | |
198 | ' | |
199 | ||
4c5fa9e6 ES |
200 | test_expect_success 'proper error when worktree not found' ' |
201 | for i in noodle noodle/bork | |
202 | do | |
203 | test_must_fail git worktree lock $i 2>err && | |
204 | test_i18ngrep "not a working tree" err || return 1 | |
205 | done | |
206 | ' | |
207 | ||
f4143101 ES |
208 | test_expect_success 'remove locked worktree (force)' ' |
209 | git worktree add --detach gumby && | |
210 | test_when_finished "git worktree remove gumby || :" && | |
211 | git worktree lock gumby && | |
212 | test_when_finished "git worktree unlock gumby || :" && | |
213 | test_must_fail git worktree remove gumby && | |
214 | test_must_fail git worktree remove --force gumby && | |
215 | git worktree remove --force --force gumby | |
216 | ' | |
217 | ||
3a540433 ES |
218 | test_expect_success 'remove cleans up .git/worktrees when empty' ' |
219 | git init moog && | |
220 | ( | |
221 | cd moog && | |
222 | test_commit bim && | |
223 | git worktree add --detach goom && | |
224 | test_path_exists .git/worktrees && | |
225 | git worktree remove goom && | |
226 | test_path_is_missing .git/worktrees | |
227 | ) | |
228 | ' | |
229 | ||
00a6d4d1 NTND |
230 | test_expect_success 'remove a repo with uninitialized submodule' ' |
231 | ( | |
232 | cd withsub && | |
233 | git worktree add to-remove HEAD && | |
234 | git worktree remove to-remove | |
235 | ) | |
236 | ' | |
237 | ||
238 | test_expect_success 'not remove a repo with initialized submodule' ' | |
239 | ( | |
240 | cd withsub && | |
241 | git worktree add to-remove HEAD && | |
242 | git -C to-remove submodule update && | |
243 | test_must_fail git worktree remove to-remove | |
244 | ) | |
245 | ' | |
246 | ||
58142c09 | 247 | test_done |