]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'sl/worktree-sparse'
authorJunio C Hamano <gitster@pobox.com>
Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 23 Jun 2023 18:21:16 +0000 (11:21 -0700)
"git worktree" learned to work better with sparse index feature.

* sl/worktree-sparse:
  worktree: integrate with sparse-index

1  2 
builtin/worktree.c
t/perf/p2000-sparse-operations.sh
t/t1092-sparse-checkout-compatibility.sh

Simple merge
index 5a11910189c9d0270fff0e4debd85dc37cc29529,1422136c73e906f63713fa15e3a0a99882f8db38..96ed3e1d69881541c82bdaf8c7f6b6fd8af97ef5
@@@ -131,7 -131,6 +131,8 @@@ test_perf_on_all git describe --dirt
  test_perf_on_all 'echo >>new && git describe --dirty'
  test_perf_on_all git diff-files
  test_perf_on_all git diff-files -- $SPARSE_CONE/a
 +test_perf_on_all git diff-tree HEAD
 +test_perf_on_all git diff-tree HEAD -- $SPARSE_CONE/a
+ test_perf_on_all "git worktree add ../temp && git worktree remove ../temp"
  
  test_done
index 0deeae3fc98a64c07acc42351234d371b427b4f9,746203d375a0874a7eb4ed48edc27b4ac9da7784..8a95adf4b50de6b543598ceac84f8515d9442f4d
@@@ -2180,46 -2180,41 +2180,83 @@@ test_expect_success 'sparse index is no
        ensure_not_expanded diff-files -- "deep/*"
  '
  
 +test_expect_success 'diff-tree' '
 +      init_repos &&
 +
 +      # Test change inside sparse cone
 +      tree1=$(git -C sparse-index rev-parse HEAD^{tree}) &&
 +      tree2=$(git -C sparse-index rev-parse update-deep^{tree}) &&
 +      test_all_match git diff-tree $tree1 $tree2 &&
 +      test_all_match git diff-tree $tree1 $tree2 -- deep/a &&
 +      test_all_match git diff-tree HEAD update-deep &&
 +      test_all_match git diff-tree HEAD update-deep -- deep/a &&
 +
 +      # Test change outside sparse cone
 +      tree3=$(git -C sparse-index rev-parse update-folder1^{tree}) &&
 +      test_all_match git diff-tree $tree1 $tree3 &&
 +      test_all_match git diff-tree $tree1 $tree3 -- folder1/a &&
 +      test_all_match git diff-tree HEAD update-folder1 &&
 +      test_all_match git diff-tree HEAD update-folder1 -- folder1/a &&
 +
 +      # Check that SKIP_WORKTREE files are not materialized
 +      test_path_is_missing sparse-checkout/folder1/a &&
 +      test_path_is_missing sparse-index/folder1/a &&
 +      test_path_is_missing sparse-checkout/folder2/a &&
 +      test_path_is_missing sparse-index/folder2/a
 +'
 +
 +test_expect_success 'sparse-index is not expanded: diff-tree' '
 +      init_repos &&
 +
 +      tree1=$(git -C sparse-index rev-parse HEAD^{tree}) &&
 +      tree2=$(git -C sparse-index rev-parse update-deep^{tree}) &&
 +      tree3=$(git -C sparse-index rev-parse update-folder1^{tree}) &&
 +
 +      ensure_not_expanded diff-tree $tree1 $tree2 &&
 +      ensure_not_expanded diff-tree $tree1 $tree2 -- deep/a &&
 +      ensure_not_expanded diff-tree HEAD update-deep &&
 +      ensure_not_expanded diff-tree HEAD update-deep -- deep/a &&
 +      ensure_not_expanded diff-tree $tree1 $tree3 &&
 +      ensure_not_expanded diff-tree $tree1 $tree3 -- folder1/a &&
 +      ensure_not_expanded diff-tree HEAD update-folder1 &&
 +      ensure_not_expanded diff-tree HEAD update-folder1 -- folder1/a
 +'
 +
+ test_expect_success 'worktree' '
+       init_repos &&
+       write_script edit-contents <<-\EOF &&
+       echo text >>"$1"
+       EOF
+       for repo in full-checkout sparse-checkout sparse-index
+       do
+               worktree=${repo}-wt &&
+               git -C $repo worktree add ../$worktree &&
+               # Compare worktree content with "ls"
+               (cd $repo && ls) >worktree_contents &&
+               (cd $worktree && ls) >new_worktree_contents &&
+               test_cmp worktree_contents new_worktree_contents &&
+               # Compare index content with "ls-files --sparse"
+               git -C $repo ls-files --sparse >index_contents &&
+               git -C $worktree ls-files --sparse >new_index_contents &&
+               test_cmp index_contents new_index_contents &&
+               git -C $repo worktree remove ../$worktree || return 1
+       done &&
+       test_all_match git worktree add .worktrees/hotfix &&
+       run_on_all ../edit-contents .worktrees/hotfix/deep/a &&
+       test_all_match test_must_fail git worktree remove .worktrees/hotfix
+ '
+ test_expect_success 'worktree is not expanded' '
+       init_repos &&
+       ensure_not_expanded worktree add .worktrees/hotfix &&
+       ensure_not_expanded worktree remove .worktrees/hotfix
+ '
  test_done