]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t1091-sparse-checkout-builtin.sh
Sync with 2.33.5
[thirdparty/git.git] / t / t1091-sparse-checkout-builtin.sh
index ab7b6049983e4aa48b5ca425b35d48df89b17106..3db9fd3c8cb5ea108e88b11232e0a0c4e630dd02 100755 (executable)
@@ -206,16 +206,21 @@ test_expect_success 'sparse-checkout disable' '
 '
 
 test_expect_success 'sparse-index enabled and disabled' '
-       git -C repo sparse-checkout init --cone --sparse-index &&
-       test_cmp_config -C repo true index.sparse &&
-       test-tool -C repo read-cache --table >cache &&
-       grep " tree " cache &&
-
-       git -C repo sparse-checkout disable &&
-       test-tool -C repo read-cache --table >cache &&
-       ! grep " tree " cache &&
-       git -C repo config --list >config &&
-       ! grep index.sparse config
+       (
+               sane_unset GIT_TEST_SPLIT_INDEX &&
+               git -C repo update-index --no-split-index &&
+
+               git -C repo sparse-checkout init --cone --sparse-index &&
+               test_cmp_config -C repo true index.sparse &&
+               test-tool -C repo read-cache --table >cache &&
+               grep " tree " cache &&
+
+               git -C repo sparse-checkout disable &&
+               test-tool -C repo read-cache --table >cache &&
+               ! grep " tree " cache &&
+               git -C repo config --list >config &&
+               ! grep index.sparse config
+       )
 '
 
 test_expect_success 'cone mode: init and set' '
@@ -406,7 +411,7 @@ test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged stat
        git -C unmerged sparse-checkout disable
 '
 
-test_expect_success 'sparse-checkout reapply' '
+test_expect_failure 'sparse-checkout reapply' '
        git clone repo tweak &&
 
        echo dirty >tweak/deep/deeper2/a &&
@@ -438,6 +443,8 @@ test_expect_success 'sparse-checkout reapply' '
        test_i18ngrep "warning.*The following paths are unmerged" err &&
        test_path_is_file tweak/folder1/a &&
 
+       # NEEDSWORK: We are asking to update a file outside of the
+       # sparse-checkout cone, but this is no longer allowed.
        git -C tweak add folder1/a &&
        git -C tweak sparse-checkout reapply 2>err &&
        test_must_be_empty err &&
@@ -643,4 +650,63 @@ test_expect_success MINGW 'cone mode replaces backslashes with slashes' '
        check_files repo/deep a deeper1
 '
 
+test_expect_success 'cone mode clears ignored subdirectories' '
+       rm repo/.git/info/sparse-checkout &&
+
+       git -C repo sparse-checkout init --cone &&
+       git -C repo sparse-checkout set deep/deeper1 &&
+
+       cat >repo/.gitignore <<-\EOF &&
+       obj/
+       *.o
+       EOF
+
+       git -C repo add .gitignore &&
+       git -C repo commit -m ".gitignore" &&
+
+       mkdir -p repo/obj repo/folder1/obj repo/deep/deeper2/obj &&
+       for file in folder1/obj/a obj/a folder1/file.o folder1.o \
+                   deep/deeper2/obj/a deep/deeper2/file.o file.o
+       do
+               echo ignored >repo/$file || return 1
+       done &&
+
+       git -C repo status --porcelain=v2 >out &&
+       test_must_be_empty out &&
+
+       git -C repo sparse-checkout reapply &&
+       test_path_is_missing repo/folder1 &&
+       test_path_is_missing repo/deep/deeper2 &&
+       test_path_is_dir repo/obj &&
+       test_path_is_file repo/file.o &&
+
+       git -C repo status --porcelain=v2 >out &&
+       test_must_be_empty out &&
+
+       git -C repo sparse-checkout set deep/deeper2 &&
+       test_path_is_missing repo/deep/deeper1 &&
+       test_path_is_dir repo/deep/deeper2 &&
+       test_path_is_dir repo/obj &&
+       test_path_is_file repo/file.o &&
+
+       >repo/deep/deeper2/ignored.o &&
+       >repo/deep/deeper2/untracked &&
+
+       # When an untracked file is in the way, all untracked files
+       # (even ignored files) are preserved.
+       git -C repo sparse-checkout set folder1 2>err &&
+       grep "contains untracked files" err &&
+       test_path_is_file repo/deep/deeper2/ignored.o &&
+       test_path_is_file repo/deep/deeper2/untracked &&
+
+       # The rest of the cone matches expectation
+       test_path_is_missing repo/deep/deeper1 &&
+       test_path_is_dir repo/obj &&
+       test_path_is_file repo/file.o &&
+
+       git -C repo status --porcelain=v2 >out &&
+       echo "? deep/deeper2/untracked" >expect &&
+       test_cmp expect out
+'
+
 test_done