]> git.ipfire.org Git - thirdparty/git.git/blobdiff - t/t1091-sparse-checkout-builtin.sh
Merge branch 'sg/commit-graph-progress-fix' into master
[thirdparty/git.git] / t / t1091-sparse-checkout-builtin.sh
index 44a91205d600e85c575a0debacdd5e2ff086b5f0..7cd45fc13946b35af307c7735c7ecd8a1ae52563 100755 (executable)
@@ -100,16 +100,36 @@ test_expect_success 'clone --sparse' '
        check_files clone a
 '
 
+test_expect_success 'interaction with clone --no-checkout (unborn index)' '
+       git clone --no-checkout "file://$(pwd)/repo" clone_no_checkout &&
+       git -C clone_no_checkout sparse-checkout init --cone &&
+       git -C clone_no_checkout sparse-checkout set folder1 &&
+
+       git -C clone_no_checkout sparse-checkout list >actual &&
+       cat >expect <<-\EOF &&
+       folder1
+       EOF
+       test_cmp expect actual &&
+
+       # nothing checked out, expect "No such file or directory"
+       ! ls clone_no_checkout/* >actual &&
+       test_must_be_empty actual &&
+       test_path_is_missing clone_no_checkout/.git/index &&
+
+       # No branch is checked out until we manually switch to one
+       git -C clone_no_checkout switch master &&
+       test_path_is_file clone_no_checkout/.git/index &&
+       check_files clone_no_checkout a folder1
+'
+
 test_expect_success 'set enables config' '
        git init empty-config &&
        (
                cd empty-config &&
                test_commit test file &&
                test_path_is_missing .git/config.worktree &&
-               test_must_fail git sparse-checkout set nothing &&
+               git sparse-checkout set nothing &&
                test_path_is_file .git/config.worktree &&
-               test_must_fail git config core.sparseCheckout &&
-               git sparse-checkout set "/*" &&
                test_cmp_config true core.sparseCheckout
        )
 '
@@ -277,15 +297,23 @@ test_expect_success 'cone mode: add parent path' '
        check_files repo a deep folder1
 '
 
-test_expect_success 'revert to old sparse-checkout on bad update' '
+test_expect_success 'not-up-to-date does not block rest of sparsification' '
+       test_when_finished git -C repo sparse-checkout disable &&
        test_when_finished git -C repo reset --hard &&
        git -C repo sparse-checkout set deep &&
+
        echo update >repo/deep/deeper2/a &&
        cp repo/.git/info/sparse-checkout expect &&
-       test_must_fail git -C repo sparse-checkout set deep/deeper1 2>err &&
-       test_i18ngrep "cannot set sparse-checkout patterns" err &&
-       test_cmp repo/.git/info/sparse-checkout expect &&
-       check_files repo/deep a deeper1 deeper2
+       test_write_lines "!/deep/*/" "/deep/deeper1/" >>expect &&
+
+       git -C repo sparse-checkout set deep/deeper1 2>err &&
+
+       test_i18ngrep "The following paths are not up to date" err &&
+       test_cmp expect repo/.git/info/sparse-checkout &&
+       check_files repo/deep a deeper1 deeper2 &&
+       check_files repo/deep/deeper1 a deepest &&
+       check_files repo/deep/deeper1/deepest a &&
+       check_files repo/deep/deeper2 a
 '
 
 test_expect_success 'revert to old sparse-checkout on empty update' '
@@ -294,8 +322,8 @@ test_expect_success 'revert to old sparse-checkout on empty update' '
                echo >file &&
                git add file &&
                git commit -m "test" &&
-               test_must_fail git sparse-checkout set nothing 2>err &&
-               test_i18ngrep "Sparse checkout leaves no entry on working directory" err &&
+               git sparse-checkout set nothing 2>err &&
+               test_i18ngrep "Sparse checkout leaves no entry on working directory" err &&
                test_i18ngrep ! ".git/index.lock" err &&
                git sparse-checkout set file
        )
@@ -315,19 +343,96 @@ test_expect_success '.gitignore should not warn about cone mode' '
        test_i18ngrep ! "disabling cone patterns" err
 '
 
-test_expect_success 'sparse-checkout (init|set|disable) fails with dirty status' '
+test_expect_success 'sparse-checkout (init|set|disable) warns with dirty status' '
        git clone repo dirty &&
        echo dirty >dirty/folder1/a &&
-       test_must_fail git -C dirty sparse-checkout init &&
-       test_must_fail git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* &&
-       test_must_fail git -C dirty sparse-checkout disable &&
+
+       git -C dirty sparse-checkout init 2>err &&
+       test_i18ngrep "warning.*The following paths are not up to date" err &&
+
+       git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* 2>err &&
+       test_i18ngrep "warning.*The following paths are not up to date" err &&
+       test_path_is_file dirty/folder1/a &&
+
+       git -C dirty sparse-checkout disable 2>err &&
+       test_must_be_empty err &&
+
        git -C dirty reset --hard &&
        git -C dirty sparse-checkout init &&
        git -C dirty sparse-checkout set /folder2/* /deep/deeper1/* &&
-       git -C dirty sparse-checkout disable
+       test_path_is_missing dirty/folder1/a &&
+       git -C dirty sparse-checkout disable &&
+       test_path_is_file dirty/folder1/a
+'
+
+test_expect_success 'sparse-checkout (init|set|disable) warns with unmerged status' '
+       git clone repo unmerged &&
+
+       cat >input <<-EOF &&
+       0 0000000000000000000000000000000000000000      folder1/a
+       100644 $(git -C unmerged rev-parse HEAD:folder1/a) 1    folder1/a
+       EOF
+       git -C unmerged update-index --index-info <input &&
+
+       git -C unmerged sparse-checkout init 2>err &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+
+       git -C unmerged sparse-checkout set /folder2/* /deep/deeper1/* 2>err &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+       test_path_is_file dirty/folder1/a &&
+
+       git -C unmerged sparse-checkout disable 2>err &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+
+       git -C unmerged reset --hard &&
+       git -C unmerged sparse-checkout init &&
+       git -C unmerged sparse-checkout set /folder2/* /deep/deeper1/* &&
+       git -C unmerged sparse-checkout disable
+'
+
+test_expect_success 'sparse-checkout reapply' '
+       git clone repo tweak &&
+
+       echo dirty >tweak/deep/deeper2/a &&
+
+       cat >input <<-EOF &&
+       0 0000000000000000000000000000000000000000      folder1/a
+       100644 $(git -C tweak rev-parse HEAD:folder1/a) 1       folder1/a
+       EOF
+       git -C tweak update-index --index-info <input &&
+
+       git -C tweak sparse-checkout init --cone 2>err &&
+       test_i18ngrep "warning.*The following paths are not up to date" err &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+
+       git -C tweak sparse-checkout set folder2 deep/deeper1 2>err &&
+       test_i18ngrep "warning.*The following paths are not up to date" err &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+
+       git -C tweak sparse-checkout reapply 2>err &&
+       test_i18ngrep "warning.*The following paths are not up to date" err &&
+       test_path_is_file tweak/deep/deeper2/a &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+       test_path_is_file tweak/folder1/a &&
+
+       git -C tweak checkout HEAD deep/deeper2/a &&
+       git -C tweak sparse-checkout reapply 2>err &&
+       test_i18ngrep ! "warning.*The following paths are not up to date" err &&
+       test_path_is_missing tweak/deep/deeper2/a &&
+       test_i18ngrep "warning.*The following paths are unmerged" err &&
+       test_path_is_file tweak/folder1/a &&
+
+       git -C tweak add folder1/a &&
+       git -C tweak sparse-checkout reapply 2>err &&
+       test_must_be_empty err &&
+       test_path_is_missing tweak/deep/deeper2/a &&
+       test_path_is_missing tweak/folder1/a &&
+
+       git -C tweak sparse-checkout disable
 '
 
 test_expect_success 'cone mode: set with core.ignoreCase=true' '
+       rm repo/.git/info/sparse-checkout &&
        git -C repo sparse-checkout init --cone &&
        git -C repo -c core.ignoreCase=true sparse-checkout set folder1 &&
        cat >expect <<-\EOF &&