@@ -47,7 +47,7 @@ test_expect_success 'setup' '
4747 git checkout -b base &&
4848 for dir in folder1 folder2 deep
4949 do
50- git checkout -b update-$dir &&
50+ git checkout -b update-$dir base &&
5151 echo "updated $dir" >$dir/a &&
5252 git commit -a -m "update $dir" || return 1
5353 done &&
@@ -481,14 +481,17 @@ test_expect_success 'checkout and reset (mixed) [sparse]' '
481481 test_sparse_match git reset update-folder2
482482'
483483
484- test_expect_success ' merge' '
484+ test_expect_success ' merge, cherry-pick, and rebase ' '
485485 init_repos &&
486486
487- test_all_match git checkout -b merge update-deep &&
488- test_all_match git merge -m "folder1" update-folder1 &&
489- test_all_match git rev-parse HEAD^{tree} &&
490- test_all_match git merge -m "folder2" update-folder2 &&
491- test_all_match git rev-parse HEAD^{tree}
487+ for OPERATION in "merge -m merge" cherry-pick rebase
488+ do
489+ test_all_match git checkout -B temp update-deep &&
490+ test_all_match git $OPERATION update-folder1 &&
491+ test_all_match git rev-parse HEAD^{tree} &&
492+ test_all_match git $OPERATION update-folder2 &&
493+ test_all_match git rev-parse HEAD^{tree} || return 1
494+ done
492495'
493496
494497# NEEDSWORK: This test is documenting current behavior, but that
@@ -524,6 +527,38 @@ test_expect_success 'merge with conflict outside cone' '
524527 test_all_match git rev-parse HEAD^{tree}
525528'
526529
530+ test_expect_success ' cherry-pick/rebase with conflict outside cone' '
531+ init_repos &&
532+
533+ for OPERATION in cherry-pick rebase
534+ do
535+ test_all_match git checkout -B tip &&
536+ test_all_match git reset --hard merge-left &&
537+ test_all_match git status --porcelain=v2 &&
538+ test_all_match test_must_fail git $OPERATION merge-right &&
539+ test_all_match git status --porcelain=v2 &&
540+
541+ # Resolve the conflict in different ways:
542+ # 1. Revert to the base
543+ test_all_match git checkout base -- deep/deeper2/a &&
544+ test_all_match git status --porcelain=v2 &&
545+
546+ # 2. Add the file with conflict markers
547+ test_all_match git add folder1/a &&
548+ test_all_match git status --porcelain=v2 &&
549+
550+ # 3. Rename the file to another sparse filename and
551+ # accept conflict markers as resolved content.
552+ run_on_all mv folder2/a folder2/z &&
553+ test_all_match git add folder2 &&
554+ test_all_match git status --porcelain=v2 &&
555+
556+ test_all_match git $OPERATION --continue &&
557+ test_all_match git status --porcelain=v2 &&
558+ test_all_match git rev-parse HEAD^{tree} || return 1
559+ done
560+ '
561+
527562test_expect_success ' merge with outside renames' '
528563 init_repos &&
529564
@@ -617,8 +652,17 @@ test_expect_success 'sparse-index is expanded and converted back' '
617652ensure_not_expanded () {
618653 rm -f trace2.txt &&
619654 echo >> sparse-index/untracked.txt &&
620- GIT_TRACE2_EVENT=" $( pwd) /trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
621- git -C sparse-index " $@ " &&
655+
656+ if test " $1 " = " !"
657+ then
658+ shift &&
659+ test_must_fail env \
660+ GIT_TRACE2_EVENT=" $( pwd) /trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
661+ git -C sparse-index " $@ " || return 1
662+ else
663+ GIT_TRACE2_EVENT=" $( pwd) /trace2.txt" GIT_TRACE2_EVENT_NESTING=10 \
664+ git -C sparse-index " $@ " || return 1
665+ fi &&
622666 test_region ! index ensure_full_index trace2.txt
623667}
624668
@@ -647,7 +691,35 @@ test_expect_success 'sparse-index is not expanded' '
647691 echo >>sparse-index/extra.txt &&
648692 ensure_not_expanded add extra.txt &&
649693 echo >>sparse-index/untracked.txt &&
650- ensure_not_expanded add .
694+ ensure_not_expanded add . &&
695+
696+ ensure_not_expanded checkout -f update-deep &&
697+ test_config -C sparse-index pull.twohead ort &&
698+ (
699+ sane_unset GIT_TEST_MERGE_ALGORITHM &&
700+ for OPERATION in "merge -m merge" cherry-pick rebase
701+ do
702+ ensure_not_expanded merge -m merge update-folder1 &&
703+ ensure_not_expanded merge -m merge update-folder2 || return 1
704+ done
705+ )
706+ '
707+
708+ test_expect_success ' sparse-index is not expanded: merge conflict in cone' '
709+ init_repos &&
710+
711+ for side in right left
712+ do
713+ git -C sparse-index checkout -b expand-$side base &&
714+ echo $side >sparse-index/deep/a &&
715+ git -C sparse-index commit -a -m "$side" || return 1
716+ done &&
717+
718+ (
719+ sane_unset GIT_TEST_MERGE_ALGORITHM &&
720+ git -C sparse-index config pull.twohead ort &&
721+ ensure_not_expanded ! merge -m merged expand-right
722+ )
651723'
652724
653725# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
0 commit comments