aboutsummaryrefslogtreecommitdiffstats
path: root/t/t1091-sparse-checkout-builtin.sh
diff options
context:
space:
mode:
authorDerrick Stolee <stolee@gmail.com>2025-09-12 10:30:07 +0000
committerJunio C Hamano <gitster@pobox.com>2025-09-12 08:59:52 -0700
commita8077c19131a86fa123c5be2c8b735acdb5dacf4 (patch)
treee7404b92f0294a0965bf282216f02a04a5c6a247 /t/t1091-sparse-checkout-builtin.sh
parent2520efd3bc8c81cb4bd8f832b241c3b2b8c0630f (diff)
downloadgit-a8077c19131a86fa123c5be2c8b735acdb5dacf4.tar.gz
sparse-checkout: match some 'clean' behavior
The 'git sparse-checkout clean' subcommand is somewhat similar to 'git clean' in that it will delete files that should not be in the worktree. The big difference is that it focuses on the directories that should not be in the worktree due to cone-mode sparse-checkout. It also does not discriminate in the kinds of files and focuses on deleting entire directories. However, there are some restrictions that would be good to bring over from 'git clean', specifically how it refuses to do anything without the '-f'/'--force' or '-n'/'--dry-run' arguments. The 'clean.requireForce' config can be set to 'false' to imply '--force'. Add this behavior to avoid accidental deletion of files that cannot be recovered from Git. Signed-off-by: Derrick Stolee <stolee@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/t1091-sparse-checkout-builtin.sh')
-rwxr-xr-xt/t1091-sparse-checkout-builtin.sh54
1 files changed, 53 insertions, 1 deletions
diff --git a/t/t1091-sparse-checkout-builtin.sh b/t/t1091-sparse-checkout-builtin.sh
index bdb7b21e32..e6b768a8da 100755
--- a/t/t1091-sparse-checkout-builtin.sh
+++ b/t/t1091-sparse-checkout-builtin.sh
@@ -1059,12 +1059,29 @@ test_expect_success 'clean' '
touch repo/deep/deeper2/file &&
touch repo/folder1/file &&
+ test_must_fail git -C repo sparse-checkout clean 2>err &&
+ grep "refusing to clean" err &&
+
+ git -C repo config clean.requireForce true &&
+ test_must_fail git -C repo sparse-checkout clean 2>err &&
+ grep "refusing to clean" err &&
+
+ cat >expect <<-\EOF &&
+ Would remove deep/deeper2/
+ Would remove folder1/
+ EOF
+
+ git -C repo sparse-checkout clean --dry-run >out &&
+ test_cmp expect out &&
+ test_path_exists repo/deep/deeper2 &&
+ test_path_exists repo/folder1 &&
+
cat >expect <<-\EOF &&
Removing deep/deeper2/
Removing folder1/
EOF
- git -C repo sparse-checkout clean >out &&
+ git -C repo sparse-checkout clean -f >out &&
test_cmp expect out &&
test_path_is_missing repo/deep/deeper2 &&
@@ -1076,6 +1093,10 @@ test_expect_success 'clean with sparse file states' '
git -C repo sparse-checkout set --cone deep/deeper1 &&
mkdir repo/folder2 &&
+ # The previous test case checked the -f option, so
+ # test the config option in this one.
+ git -C repo config clean.requireForce false &&
+
# create an untracked file and a modified file
touch repo/folder2/file &&
echo dirty >repo/folder2/a &&
@@ -1154,4 +1175,35 @@ test_expect_success 'clean with sparse file states' '
test_must_be_empty out
'
+test_expect_success 'clean with merge conflict status' '
+ git clone repo clean-merge &&
+
+ echo dirty >clean-merge/deep/deeper2/a &&
+ touch clean-merge/folder2/extra &&
+
+ cat >input <<-EOF &&
+ 0 $ZERO_OID folder1/a
+ 100644 $(git -C clean-merge rev-parse HEAD:folder1/a) 1 folder1/a
+ EOF
+ git -C clean-merge update-index --index-info <input &&
+
+ git -C clean-merge sparse-checkout set deep/deeper1 &&
+
+ test_must_fail git -C clean-merge sparse-checkout clean -f 2>err &&
+ grep "failed to convert index to a sparse index" err &&
+
+ mkdir -p clean-merge/folder1/ &&
+ echo merged >clean-merge/folder1/a &&
+ git -C clean-merge add --sparse folder1/a &&
+
+ # deletes folder2/ but leaves staged change in folder1
+ # and dirty change in deep/deeper2/
+ cat >expect <<-\EOF &&
+ Removing folder2/
+ EOF
+
+ git -C clean-merge sparse-checkout clean -f >out &&
+ test_cmp expect out
+'
+
test_done