]>
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 |
b5fcb1c0 | 15 | TEST_PASSES_SANITIZE_LEAK=true |
d6b38f61 | 16 | . ./test-lib.sh |
ea5070c9 | 17 | . "$TEST_DIRECTORY"/lib-read-tree.sh |
d6b38f61 | 18 | |
d6b38f61 | 19 | test_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 | 49 | test_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 | ||
57 | test_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 | ||
67 | test_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 |
77 | test_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 | 95 | test_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 | 111 | test_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 |
120 | test_expect_success 'match directories with negated patterns' ' |
121 | cat >expected.swt-negation <<\EOF && | |
122 | S init.t | |
123 | S sub/added | |
124 | H sub/addedtoo | |
125 | S subsub/added | |
126 | EOF | |
127 | ||
128 | cat >.git/info/sparse-checkout <<\EOF && | |
129 | sub | |
130 | !sub/added | |
131 | EOF | |
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 | ||
140 | test_expect_success 'match directories with negated patterns (2)' ' | |
141 | cat >expected.swt-negation2 <<\EOF && | |
142 | H init.t | |
143 | H sub/added | |
144 | S sub/addedtoo | |
145 | H subsub/added | |
146 | EOF | |
147 | ||
148 | cat >.git/info/sparse-checkout <<\EOF && | |
149 | /* | |
150 | !sub | |
151 | sub/added | |
152 | EOF | |
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 | 161 | test_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 | 170 | test_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 | ||
186 | test_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 |
193 | test_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 | 203 | test_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 | 214 | test_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 | ||
223 | test_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 | ||
231 | test_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 | 238 | test_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 | 247 | test_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 | 258 | test_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 | 266 | test_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 | 274 | warning: The following paths were already present and thus not updated despite sparse patterns: |
17d26a4d NTND |
275 | sub/added |
276 | sub/addedtoo | |
681c637b EN |
277 | |
278 | After fixing the above paths, you may want to run `git sparse-checkout reapply`. | |
17d26a4d | 279 | EOF |
1108cea7 | 280 | test_cmp expected actual |
17d26a4d NTND |
281 | ' |
282 | ||
08d595dc NTND |
283 | test_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 | ||
295 | test_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 | 307 | test_done |