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