Thanks for Elijah's work. I'm very excited that merge-ort is integrated into the git merge-tree, which means that we can use merge-ort in bare repositories to optimize merge performance. In this patch, I introduce a new --merge-base=<commit> option to allow callers to specify a merge-base for the merge. This may allow users to implement git cherry-pick and git rebase in bare repositories with git merge-tree cmd. Changes since v1: * Changed merge_incore_recursive() to merge_incore_nonrecursive() when merge-base is specified. * Fixed c style problem. * Moved commit lookup/die logic out to the parsing logic in cmd_merge_tree(). * use test_commit for test Changes since v2: * commit message * Rebased on top of en/merge-tree-sequence. * Set opt.ancestor to o->merge_base. Because opt.ancestor is a *char. To make it easier to pass parameters, I moved lookup_commit_reference_by_name() to real_ merge() again. * Added test comment. Changes since v3: * support --merge-base in conjunction with --stdin Changes since v4: * commit message * added input format document * changed the input format for specifying the merge-base when --stdin is passed * changed the output when --stdin and --merge-base are used at the same time * add comment for test Changes since v5: * improved test: remove the test repo after the test; avoid sub-shell. Kyle Zhao (2): merge-tree.c: add --merge-base=<commit> option merge-tree.c: allow specifying the merge-base when --stdin is passed Documentation/git-merge-tree.txt | 16 ++++++++ builtin/merge-tree.c | 65 ++++++++++++++++++++++++++------ t/t4301-merge-tree-write-tree.sh | 61 ++++++++++++++++++++++++++++++ 3 files changed, 130 insertions(+), 12 deletions(-) base-commit: ec1edbcb56ac05e9980299b05924c5c1b51d68b4 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1397%2Fkeyu98%2Fkz%2Fmerge-tree-option-merge-base-v6 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1397/keyu98/kz/merge-tree-option-merge-base-v6 Pull-Request: https://github.com/gitgitgadget/git/pull/1397 Range-diff vs v5: 1: 01df0d1a6a7 ! 1: 1cf1c69b8e8 merge-tree.c: add --merge-base=<commit> option @@ t/t4301-merge-tree-write-tree.sh: test_expect_success '--stdin with both a succe + +test_expect_success 'specify merge-base as parent of branch2' ' + # Setup -+ git init base-b2-p && ( -+ cd base-b2-p && -+ test_commit c1 file1 && -+ test_commit c2 file2 && -+ test_commit c3 file3 -+ ) && ++ test_when_finished "rm -rf base-b2-p" && ++ git init base-b2-p && ++ test_commit -C base-b2-p c1 file1 && ++ test_commit -C base-b2-p c2 file2 && ++ test_commit -C base-b2-p c3 file3 && ++ + # Testing -+ ( -+ cd base-b2-p && -+ TREE_OID=$(git merge-tree --write-tree --merge-base=c2 c1 c3) && ++ TREE_OID=$(git -C base-b2-p merge-tree --write-tree --merge-base=c2 c1 c3) && + -+ q_to_tab <<-EOF >expect && -+ 100644 blob $(git rev-parse c1:file1)Qfile1 -+ 100644 blob $(git rev-parse c3:file3)Qfile3 -+ EOF ++ q_to_tab <<-EOF >expect && ++ 100644 blob $(git -C base-b2-p rev-parse c1:file1)Qfile1 ++ 100644 blob $(git -C base-b2-p rev-parse c3:file3)Qfile3 ++ EOF + -+ git ls-tree $TREE_OID >actual && -+ test_cmp expect actual -+ ) ++ git -C base-b2-p ls-tree $TREE_OID >actual && ++ test_cmp expect actual +' + test_done 2: 3bdfad03cca ! 2: 40d56544e6e merge-tree.c: allow specifying the merge-base when --stdin is passed @@ t/t4301-merge-tree-write-tree.sh: test_expect_success '--stdin with both a succe # git merge-tree --write-tree --merge-base=c2 c1 c3 # Commit c1: add file1 @@ t/t4301-merge-tree-write-tree.sh: test_expect_success 'specify merge-base as parent of branch2' ' - ) + test_cmp expect actual ' +# Since the earlier tests have verified that individual merge-tree calls +# are doing the right thing, this test case is only used to test whether +# the input format is available. + -+test_expect_success '--stdin with both a normal merge and a merge-base specified merge' ' -+ cd base-b2-p && -+ printf "c1 c3\nc2 -- c1 c3" | git merge-tree --stdin >actual && ++test_expect_success 'check the input format when --stdin is passed' ' ++ test_when_finished "rm -rf repo" && ++ git init repo && ++ test_commit -C repo c1 && ++ test_commit -C repo c2 && ++ test_commit -C repo c3 && ++ printf "c1 c3\nc2 -- c1 c3\nc2 c3" | git -C repo merge-tree --stdin >actual && + + printf "1\0" >expect && -+ git merge-tree --write-tree -z c1 c3 >>expect && ++ git -C repo merge-tree --write-tree -z c1 c3 >>expect && + printf "\0" >>expect && + + printf "1\0" >>expect && -+ git merge-tree --write-tree -z --merge-base=c2 c1 c3 >>expect && ++ git -C repo merge-tree --write-tree -z --merge-base=c2 c1 c3 >>expect && + printf "\0" >>expect && ++ ++ printf "1\0" >>expect && ++ git -C repo merge-tree --write-tree -z c2 c3 >>expect && ++ printf "\0" >>expect && ++ + test_cmp expect actual +' + -- gitgitgadget