[PATCH v6 0/2] merge-tree: allow specifying a base commit when --write-tree is passed
- From
Kyle Zhao via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Nov 3, 2022, 10:50 UTC
- Message-ID
- <pull.1397.v6.git.1667472621.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1397.v5.git.1667446182.gitgitgadget@gmail.com>
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