]>
Commit | Line | Data |
---|---|---|
d6b38f61 NTND |
1 | #!/bin/sh |
2 | ||
7f71a6ae JN |
3 | test_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 | 14 | TEST_CREATE_REPO_NO_TEMPLATE=1 |
d6b38f61 | 15 | . ./test-lib.sh |
ea5070c9 | 16 | . "$TEST_DIRECTORY"/lib-read-tree.sh |
d6b38f61 | 17 | |
d6b38f61 | 18 | test_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 | 48 | test_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 | ||
56 | test_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 | ||
66 | test_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 |
76 | test_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 | 94 | test_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 | 110 | test_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 |
119 | test_expect_success 'match directories with negated patterns' ' |
120 | cat >expected.swt-negation <<\EOF && | |
121 | S init.t | |
122 | S sub/added | |
123 | H sub/addedtoo | |
124 | S subsub/added | |
125 | EOF | |
126 | ||
127 | cat >.git/info/sparse-checkout <<\EOF && | |
128 | sub | |
129 | !sub/added | |
130 | EOF | |
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 | ||
139 | test_expect_success 'match directories with negated patterns (2)' ' | |
140 | cat >expected.swt-negation2 <<\EOF && | |
141 | H init.t | |
142 | H sub/added | |
143 | S sub/addedtoo | |
144 | H subsub/added | |
145 | EOF | |
146 | ||
147 | cat >.git/info/sparse-checkout <<\EOF && | |
148 | /* | |
149 | !sub | |
150 | sub/added | |
151 | EOF | |
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 | 160 | test_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 | 169 | test_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 | ||
185 | test_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 |
192 | test_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 | 202 | test_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 | 213 | test_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 | ||
222 | test_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 | ||
230 | test_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 | 237 | test_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 | 246 | test_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 | 257 | test_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 | 265 | test_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 | 273 | warning: The following paths were already present and thus not updated despite sparse patterns: |
17d26a4d NTND |
274 | sub/added |
275 | sub/addedtoo | |
681c637b EN |
276 | |
277 | After fixing the above paths, you may want to run `git sparse-checkout reapply`. | |
17d26a4d | 278 | EOF |
1108cea7 | 279 | test_cmp expected actual |
17d26a4d NTND |
280 | ' |
281 | ||
08d595dc NTND |
282 | test_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 | ||
294 | test_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 | 306 | test_done |