]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reset: expand test coverage for sparse checkouts
authorVictoria Dye <vdye@github.com>
Mon, 29 Nov 2021 15:52:39 +0000 (15:52 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Nov 2021 20:51:26 +0000 (12:51 -0800)
Add new tests for `--merge` and `--keep` modes, as well as mixed reset with
pathspecs. New performance test cases exercise various execution paths for
`reset`.

Co-authored-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/perf/p2000-sparse-operations.sh
t/t1092-sparse-checkout-compatibility.sh

index 597626276fbeae0b91de04dc989b4573292718c5..bfd332120c8df8dc27c77a2b74c1e2bf02f9e1d0 100755 (executable)
@@ -110,5 +110,8 @@ test_perf_on_all git add -A
 test_perf_on_all git add .
 test_perf_on_all git commit -a -m A
 test_perf_on_all git checkout -f -
+test_perf_on_all git reset
+test_perf_on_all git reset --hard
+test_perf_on_all git reset -- does-not-exist
 
 test_done
index cab6340a9d026484e2bb1b70a70318a2af1c90f3..4125525ab86c18f6bee48d9636522c24cc933a0b 100755 (executable)
@@ -475,6 +475,104 @@ test_expect_success 'checkout and reset (mixed)' '
        run_on_sparse test_path_is_missing folder1
 '
 
+test_expect_success 'checkout and reset (merge)' '
+       init_repos &&
+
+       write_script edit-contents <<-\EOF &&
+       echo text >>$1
+       EOF
+
+       test_all_match git checkout -b reset-test update-deep &&
+       run_on_all ../edit-contents a &&
+       test_all_match git reset --merge deepest &&
+       test_all_match git status --porcelain=v2 &&
+
+       test_all_match git reset --hard update-deep &&
+       run_on_all ../edit-contents deep/a &&
+       test_all_match test_must_fail git reset --merge deepest
+'
+
+test_expect_success 'checkout and reset (keep)' '
+       init_repos &&
+
+       write_script edit-contents <<-\EOF &&
+       echo text >>$1
+       EOF
+
+       test_all_match git checkout -b reset-test update-deep &&
+       run_on_all ../edit-contents a &&
+       test_all_match git reset --keep deepest &&
+       test_all_match git status --porcelain=v2 &&
+
+       test_all_match git reset --hard update-deep &&
+       run_on_all ../edit-contents deep/a &&
+       test_all_match test_must_fail git reset --keep deepest
+'
+
+test_expect_success 'reset with pathspecs inside sparse definition' '
+       init_repos &&
+
+       write_script edit-contents <<-\EOF &&
+       echo text >>$1
+       EOF
+
+       test_all_match git checkout -b reset-test update-deep &&
+       run_on_all ../edit-contents deep/a &&
+
+       test_all_match git reset base -- deep/a &&
+       test_all_match git status --porcelain=v2 &&
+
+       test_all_match git reset base -- nonexistent-file &&
+       test_all_match git status --porcelain=v2 &&
+
+       test_all_match git reset deepest -- deep &&
+       test_all_match git status --porcelain=v2
+'
+
+# Although the working tree differs between full and sparse checkouts after
+# reset, the state of the index is the same.
+test_expect_success 'reset with pathspecs outside sparse definition' '
+       init_repos &&
+       test_all_match git checkout -b reset-test base &&
+
+       test_sparse_match git reset update-folder1 -- folder1 &&
+       git -C full-checkout reset update-folder1 -- folder1 &&
+       test_sparse_match git status --porcelain=v2 &&
+       test_all_match git rev-parse HEAD:folder1 &&
+
+       test_sparse_match git reset update-folder2 -- folder2/a &&
+       git -C full-checkout reset update-folder2 -- folder2/a &&
+       test_sparse_match git status --porcelain=v2 &&
+       test_all_match git rev-parse HEAD:folder2/a
+'
+
+test_expect_success 'reset with wildcard pathspec' '
+       init_repos &&
+
+       test_all_match git reset update-deep -- deep\* &&
+       test_all_match git ls-files -s -- deep &&
+
+       test_all_match git reset deepest -- deep\*\*\* &&
+       test_all_match git ls-files -s -- deep &&
+
+       # The following `git reset`s result in updating the index on files with
+       # `skip-worktree` enabled. To avoid failing due to discrepencies in reported
+       # "modified" files, `test_sparse_match` reset is performed separately from
+       # "full-checkout" reset, then the index contents of all repos are verified.
+
+       test_sparse_match git reset update-folder1 -- \*/a &&
+       git -C full-checkout reset update-folder1 -- \*/a &&
+       test_all_match git ls-files -s -- deep/a folder1/a &&
+
+       test_sparse_match git reset update-folder2 -- folder\* &&
+       git -C full-checkout reset update-folder2 -- folder\* &&
+       test_all_match git ls-files -s -- folder10 folder1 folder2 &&
+
+       test_sparse_match git reset base -- folder1/\* &&
+       git -C full-checkout reset base -- folder1/\* &&
+       test_all_match git ls-files -s -- folder1
+'
+
 test_expect_success 'merge, cherry-pick, and rebase' '
        init_repos &&