]> git.ipfire.org Git - thirdparty/git.git/blame - t/t1011-read-tree-sparse-checkout.sh
The third batch
[thirdparty/git.git] / t / t1011-read-tree-sparse-checkout.sh
CommitLineData
d6b38f61
NTND
1#!/bin/sh
2
7f71a6ae
JN
3test_description='sparse checkout tests
4
06d53148 5* (tag: removed, main) removed
7f71a6ae
JN
6| D sub/added
7* (HEAD, tag: top) modified and added
8| M init.t
9| A sub/added
10* (tag: init) init
11 A init.t
12'
d6b38f61 13
ead74601 14TEST_CREATE_REPO_NO_TEMPLATE=1
b5fcb1c0 15TEST_PASSES_SANITIZE_LEAK=true
d6b38f61 16. ./test-lib.sh
ea5070c9 17. "$TEST_DIRECTORY"/lib-read-tree.sh
d6b38f61 18
d6b38f61 19test_expect_success 'setup' '
d47125d4 20 test_commit init &&
21 echo modified >>init.t &&
22
378932d3 23 cat >expected <<-EOF &&
d47125d4 24 100644 $(git hash-object init.t) 0 init.t
378932d3
NTND
25 100644 $EMPTY_BLOB 0 sub/added
26 100644 $EMPTY_BLOB 0 sub/addedtoo
27 100644 $EMPTY_BLOB 0 subsub/added
7f71a6ae
JN
28 EOF
29 cat >expected.swt <<-\EOF &&
30 H init.t
31 H sub/added
d61ebbe8 32 H sub/addedtoo
ae3cdfe1 33 H subsub/added
7f71a6ae
JN
34 EOF
35
ae3cdfe1 36 mkdir sub subsub &&
d61ebbe8
NTND
37 touch sub/added sub/addedtoo subsub/added &&
38 git add init.t sub/added sub/addedtoo subsub/added &&
d6b38f61
NTND
39 git commit -m "modified and added" &&
40 git tag top &&
41 git rm sub/added &&
42 git commit -m removed &&
43 git tag removed &&
44 git checkout top &&
7f71a6ae 45 git ls-files --stage >result &&
d6b38f61
NTND
46 test_cmp expected result
47'
48
d6b38f61 49test_expect_success 'read-tree without .git/info/sparse-checkout' '
ea5070c9 50 read_tree_u_must_succeed -m -u HEAD &&
7f71a6ae 51 git ls-files --stage >result &&
d6b38f61 52 test_cmp expected result &&
7f71a6ae 53 git ls-files -t >result &&
d6b38f61
NTND
54 test_cmp expected.swt result
55'
56
57test_expect_success 'read-tree with .git/info/sparse-checkout but disabled' '
ead74601 58 mkdir .git/info &&
a48fcd83 59 echo >.git/info/sparse-checkout &&
ea5070c9 60 read_tree_u_must_succeed -m -u HEAD &&
7f71a6ae 61 git ls-files -t >result &&
d6b38f61 62 test_cmp expected.swt result &&
72315e43
SA
63 test_path_is_file init.t &&
64 test_path_is_file sub/added
d6b38f61
NTND
65'
66
67test_expect_success 'read-tree --no-sparse-checkout with empty .git/info/sparse-checkout and enabled' '
68 git config core.sparsecheckout true &&
7f71a6ae 69 echo >.git/info/sparse-checkout &&
ea5070c9 70 read_tree_u_must_succeed --no-sparse-checkout -m -u HEAD &&
7f71a6ae 71 git ls-files -t >result &&
d6b38f61 72 test_cmp expected.swt result &&
72315e43
SA
73 test_path_is_file init.t &&
74 test_path_is_file sub/added
d6b38f61
NTND
75'
76
d6b38f61
NTND
77test_expect_success 'read-tree with empty .git/info/sparse-checkout' '
78 git config core.sparsecheckout true &&
7f71a6ae 79 echo >.git/info/sparse-checkout &&
ace224ac 80 read_tree_u_must_succeed -m -u HEAD &&
7f71a6ae 81 git ls-files --stage >result &&
d6b38f61 82 test_cmp expected result &&
7f71a6ae 83 git ls-files -t >result &&
ace224ac
DS
84 cat >expected.swt <<-\EOF &&
85 S init.t
86 S sub/added
87 S sub/addedtoo
88 S subsub/added
89 EOF
d6b38f61 90 test_cmp expected.swt result &&
72315e43
SA
91 test_path_is_missing init.t &&
92 test_path_is_missing sub/added
d6b38f61
NTND
93'
94
d6b38f61 95test_expect_success 'match directories with trailing slash' '
7f71a6ae
JN
96 cat >expected.swt-noinit <<-\EOF &&
97 S init.t
98 H sub/added
d61ebbe8 99 H sub/addedtoo
ae3cdfe1 100 S subsub/added
7f71a6ae
JN
101 EOF
102
d6b38f61 103 echo sub/ > .git/info/sparse-checkout &&
ea5070c9 104 read_tree_u_must_succeed -m -u HEAD &&
d6b38f61 105 git ls-files -t > result &&
7f71a6ae 106 test_cmp expected.swt-noinit result &&
72315e43
SA
107 test_path_is_missing init.t &&
108 test_path_is_file sub/added
d6b38f61
NTND
109'
110
9037026d 111test_expect_success 'match directories without trailing slash' '
d61ebbe8 112 echo sub >.git/info/sparse-checkout &&
ea5070c9 113 read_tree_u_must_succeed -m -u HEAD &&
7f71a6ae 114 git ls-files -t >result &&
9037026d 115 test_cmp expected.swt-noinit result &&
72315e43
SA
116 test_path_is_missing init.t &&
117 test_path_is_file sub/added
9037026d
NTND
118'
119
28911091
NTND
120test_expect_success 'match directories with negated patterns' '
121 cat >expected.swt-negation <<\EOF &&
122S init.t
123S sub/added
124H sub/addedtoo
125S subsub/added
126EOF
127
128 cat >.git/info/sparse-checkout <<\EOF &&
129sub
130!sub/added
131EOF
132 git read-tree -m -u HEAD &&
133 git ls-files -t >result &&
134 test_cmp expected.swt-negation result &&
72315e43
SA
135 test_path_is_missing init.t &&
136 test_path_is_missing sub/added &&
137 test_path_is_file sub/addedtoo
28911091
NTND
138'
139
140test_expect_success 'match directories with negated patterns (2)' '
141 cat >expected.swt-negation2 <<\EOF &&
142H init.t
143H sub/added
144S sub/addedtoo
145H subsub/added
146EOF
147
148 cat >.git/info/sparse-checkout <<\EOF &&
149/*
150!sub
151sub/added
152EOF
153 git read-tree -m -u HEAD &&
154 git ls-files -t >result &&
155 test_cmp expected.swt-negation2 result &&
72315e43
SA
156 test_path_is_file init.t &&
157 test_path_is_file sub/added &&
158 test_path_is_missing sub/addedtoo
28911091
NTND
159'
160
9037026d 161test_expect_success 'match directory pattern' '
d61ebbe8 162 echo "s?b" >.git/info/sparse-checkout &&
ea5070c9 163 read_tree_u_must_succeed -m -u HEAD &&
9037026d
NTND
164 git ls-files -t >result &&
165 test_cmp expected.swt-noinit result &&
72315e43
SA
166 test_path_is_missing init.t &&
167 test_path_is_file sub/added
d6b38f61
NTND
168'
169
d6b38f61 170test_expect_success 'checkout area changes' '
7f71a6ae
JN
171 cat >expected.swt-nosub <<-\EOF &&
172 H init.t
173 S sub/added
d61ebbe8 174 S sub/addedtoo
ae3cdfe1 175 S subsub/added
7f71a6ae
JN
176 EOF
177
178 echo init.t >.git/info/sparse-checkout &&
ea5070c9 179 read_tree_u_must_succeed -m -u HEAD &&
7f71a6ae
JN
180 git ls-files -t >result &&
181 test_cmp expected.swt-nosub result &&
72315e43
SA
182 test_path_is_file init.t &&
183 test_path_is_missing sub/added
d6b38f61
NTND
184'
185
186test_expect_success 'read-tree updates worktree, absent case' '
7f71a6ae 187 echo sub/added >.git/info/sparse-checkout &&
d6b38f61 188 git checkout -f top &&
ea5070c9 189 read_tree_u_must_succeed -m -u HEAD^ &&
72315e43 190 test_path_is_missing init.t
d6b38f61
NTND
191'
192
b3df8c98
EN
193test_expect_success 'read-tree will not throw away dirty changes, non-sparse' '
194 echo "/*" >.git/info/sparse-checkout &&
195 read_tree_u_must_succeed -m -u HEAD &&
196
197 echo dirty >init.t &&
198 read_tree_u_must_fail -m -u HEAD^ &&
199 test_path_is_file init.t &&
200 grep -q dirty init.t
201'
202
26b5d6b0 203test_expect_success 'read-tree will not throw away dirty changes, sparse' '
b3df8c98
EN
204 echo "/*" >.git/info/sparse-checkout &&
205 read_tree_u_must_succeed -m -u HEAD &&
206
207 echo dirty >init.t &&
208 echo sub/added >.git/info/sparse-checkout &&
209 read_tree_u_must_fail -m -u HEAD^ &&
210 test_path_is_file init.t &&
211 grep -q dirty init.t
212'
213
d6b38f61 214test_expect_success 'read-tree updates worktree, dirty case' '
7f71a6ae 215 echo sub/added >.git/info/sparse-checkout &&
d6b38f61 216 git checkout -f top &&
7f71a6ae 217 echo dirty >init.t &&
af6a5187 218 read_tree_u_must_fail -m -u HEAD^ &&
d6b38f61
NTND
219 grep -q dirty init.t &&
220 rm init.t
221'
222
223test_expect_success 'read-tree removes worktree, dirty case' '
7f71a6ae 224 echo init.t >.git/info/sparse-checkout &&
d6b38f61 225 git checkout -f top &&
7f71a6ae 226 echo dirty >added &&
ea5070c9 227 read_tree_u_must_succeed -m -u HEAD^ &&
d6b38f61
NTND
228 grep -q dirty added
229'
230
231test_expect_success 'read-tree adds to worktree, absent case' '
7f71a6ae 232 echo init.t >.git/info/sparse-checkout &&
d6b38f61 233 git checkout -f removed &&
ea5070c9 234 read_tree_u_must_succeed -u -m HEAD^ &&
72315e43 235 test_path_is_missing sub/added
d6b38f61
NTND
236'
237
74da98f9 238test_expect_success 'read-tree adds to worktree, dirty case' '
7f71a6ae 239 echo init.t >.git/info/sparse-checkout &&
d6b38f61
NTND
240 git checkout -f removed &&
241 mkdir sub &&
7f71a6ae 242 echo dirty >sub/added &&
ea5070c9 243 read_tree_u_must_succeed -u -m HEAD^ &&
d6b38f61
NTND
244 grep -q dirty sub/added
245'
246
eec3fc03 247test_expect_success 'index removal and worktree narrowing at the same time' '
eec3fc03
NTND
248 echo init.t >.git/info/sparse-checkout &&
249 echo sub/added >>.git/info/sparse-checkout &&
250 git checkout -f top &&
251 echo init.t >.git/info/sparse-checkout &&
252 git checkout removed &&
253 git ls-files sub/added >result &&
72315e43 254 test_path_is_missing sub/added &&
ed254710 255 test_must_be_empty result
eec3fc03
NTND
256'
257
700e66d6 258test_expect_success 'read-tree --reset removes outside worktree' '
700e66d6
NTND
259 echo init.t >.git/info/sparse-checkout &&
260 git checkout -f top &&
261 git reset --hard removed &&
262 git ls-files sub/added >result &&
d3c6751b 263 test_must_be_empty result
700e66d6
NTND
264'
265
681c637b 266test_expect_success 'print warnings when some worktree updates disabled' '
17d26a4d
NTND
267 echo sub >.git/info/sparse-checkout &&
268 git checkout -f init &&
269 mkdir sub &&
270 touch sub/added sub/addedtoo &&
681c637b
EN
271 # Use -q to suppress "Previous HEAD position" and "Head is now at" msgs
272 git checkout -q top 2>actual &&
17d26a4d 273 cat >expected <<\EOF &&
681c637b 274warning: The following paths were already present and thus not updated despite sparse patterns:
17d26a4d
NTND
275 sub/added
276 sub/addedtoo
681c637b
EN
277
278After fixing the above paths, you may want to run `git sparse-checkout reapply`.
17d26a4d 279EOF
1108cea7 280 test_cmp expected actual
17d26a4d
NTND
281'
282
08d595dc
NTND
283test_expect_success 'checkout without --ignore-skip-worktree-bits' '
284 echo "*" >.git/info/sparse-checkout &&
285 git checkout -f top &&
286 test_path_is_file init.t &&
287 echo sub >.git/info/sparse-checkout &&
288 git checkout &&
289 echo modified >> sub/added &&
290 git checkout . &&
291 test_path_is_missing init.t &&
292 git diff --exit-code HEAD
293'
294
295test_expect_success 'checkout with --ignore-skip-worktree-bits' '
296 echo "*" >.git/info/sparse-checkout &&
297 git checkout -f top &&
298 test_path_is_file init.t &&
299 echo sub >.git/info/sparse-checkout &&
300 git checkout &&
301 echo modified >> sub/added &&
302 git checkout --ignore-skip-worktree-bits . &&
303 test_path_is_file init.t &&
304 git diff --exit-code HEAD
305'
306
d6b38f61 307test_done