t: expand tests around sparse merges and clean

With the current implementation of 'git sparse-checkout clean', we notice that a file that was in a conflicted state does not get cleaned up because of some internal details around the SKIP_WORKTREE bit. This test is documenting the current behavior before we update it in the following change. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Derrick Stolee committed Sep 12, 2025 at 10:30 UTC 592d2a93af8a0af047d2212004ca474855096d5f
1 file changed +34 -22
t/t1091-sparse-checkout-builtin.sh
+34 -22
@@ -1183,35 +1183,47 @@ test_expect_success 'clean with sparse file states' '
1183 test_must_be_empty out
1184 '
1185
1186 -test_expect_success 'clean with merge conflict status' '
1187 - git clone repo clean-merge &&
1186 +test_expect_success 'sparse-checkout operations with merge conflicts' '
1187 + git clone repo merge &&
1188
1189 - echo dirty >clean-merge/deep/deeper2/a &&
1190 - touch clean-merge/folder2/extra &&
1189 + (
1190 + cd merge &&
1191 + mkdir -p folder1/even/more/dirs &&
1192 + echo base >folder1/even/more/dirs/file &&
1193 + git add folder1 &&
1194 + git commit -m "base" &&
1195
1192 - cat >input <<-EOF &&
1193 - 0 $ZERO_OID folder1/a
1194 - 100644 $(git -C clean-merge rev-parse HEAD:folder1/a) 1 folder1/a
1195 - EOF
1196 - git -C clean-merge update-index --index-info <input &&
1196 + git checkout -b right&&
1197 + echo right >folder1/even/more/dirs/file &&
1198 + git commit -a -m "right" &&
1199
1198 - git -C clean-merge sparse-checkout set deep/deeper1 &&
1200 + git checkout -b left HEAD~1 &&
1201 + echo left >folder1/even/more/dirs/file &&
1202 + git commit -a -m "left" &&
1203
1200 - test_must_fail git -C clean-merge sparse-checkout clean -f 2>err &&
1201 - grep "failed to convert index to a sparse index" err &&
1204 + git checkout -b merge &&
1205 + git sparse-checkout set deep/deeper1 &&
1206
1203 - mkdir -p clean-merge/folder1/ &&
1204 - echo merged >clean-merge/folder1/a &&
1205 - git -C clean-merge add --sparse folder1/a &&
1207 + test_must_fail git merge -m "will-conflict" right &&
1208
1207 - # deletes folder2/ but leaves staged change in folder1
1208 - # and dirty change in deep/deeper2/
1209 - cat >expect <<-\EOF &&
1210 - Removing folder2/
1211 - EOF
1209 + test_must_fail git sparse-checkout clean -f 2>err &&
1210 + grep "failed to convert index to a sparse index" err &&
1211
1213 - git -C clean-merge sparse-checkout clean -f >out &&
1214 - test_cmp expect out
1212 + echo merged >folder1/even/more/dirs/file &&
1213 + git add --sparse folder1 &&
1214 + git merge --continue &&
1215 +
1216 + test_path_exists folder1/even/more/dirs/file &&
1217 +
1218 + # clean does not remove the file, because the
1219 + # SKIP_WORKTREE bit was not cleared by the merge command.
1220 + git sparse-checkout clean -f >out &&
1221 + test_line_count = 0 out &&
1222 + test_path_exists folder1/even/more/dirs/file &&
1223 +
1224 + git sparse-checkout reapply &&
1225 + test_path_is_missing folder1
1226 + )
1227 '
1228
1229 test_done