merge-tree: support including merge messages in output
[git.git] / t / t4301-merge-tree-write-tree.sh
blob719d81e71738c2ecacef37c92652aaff68a4a92f
1 #!/bin/sh
3 test_description='git merge-tree --write-tree'
5 . ./test-lib.sh
7 # This test is ort-specific
8 if test "$GIT_TEST_MERGE_ALGORITHM" != "ort"
9 then
10 skip_all="GIT_TEST_MERGE_ALGORITHM != ort"
11 test_done
14 test_expect_success setup '
15 test_write_lines 1 2 3 4 5 >numbers &&
16 echo hello >greeting &&
17 echo foo >whatever &&
18 git add numbers greeting whatever &&
19 test_tick &&
20 git commit -m initial &&
22 git branch side1 &&
23 git branch side2 &&
24 git branch side3 &&
26 git checkout side1 &&
27 test_write_lines 1 2 3 4 5 6 >numbers &&
28 echo hi >greeting &&
29 echo bar >whatever &&
30 git add numbers greeting whatever &&
31 test_tick &&
32 git commit -m modify-stuff &&
34 git checkout side2 &&
35 test_write_lines 0 1 2 3 4 5 >numbers &&
36 echo yo >greeting &&
37 git rm whatever &&
38 mkdir whatever &&
39 >whatever/empty &&
40 git add numbers greeting whatever/empty &&
41 test_tick &&
42 git commit -m other-modifications &&
44 git checkout side3 &&
45 git mv numbers sequence &&
46 test_tick &&
47 git commit -m rename-numbers
50 test_expect_success 'Clean merge' '
51 TREE_OID=$(git merge-tree --write-tree side1 side3) &&
52 q_to_tab <<-EOF >expect &&
53 100644 blob $(git rev-parse side1:greeting)Qgreeting
54 100644 blob $(git rev-parse side1:numbers)Qsequence
55 100644 blob $(git rev-parse side1:whatever)Qwhatever
56 EOF
58 git ls-tree $TREE_OID >actual &&
59 test_cmp expect actual
62 test_expect_success 'Content merge and a few conflicts' '
63 git checkout side1^0 &&
64 test_must_fail git merge side2 &&
65 expected_tree=$(git rev-parse AUTO_MERGE) &&
67 # We will redo the merge, while we are still in a conflicted state!
68 test_when_finished "git reset --hard" &&
70 test_expect_code 1 git merge-tree --write-tree side1 side2 >RESULT &&
71 actual_tree=$(head -n 1 RESULT) &&
73 # Due to differences of e.g. "HEAD" vs "side1", the results will not
74 # exactly match. Dig into individual files.
76 # Numbers should have three-way merged cleanly
77 test_write_lines 0 1 2 3 4 5 6 >expect &&
78 git show ${actual_tree}:numbers >actual &&
79 test_cmp expect actual &&
81 # whatever and whatever~<branch> should have same HASHES
82 git rev-parse ${expected_tree}:whatever ${expected_tree}:whatever~HEAD >expect &&
83 git rev-parse ${actual_tree}:whatever ${actual_tree}:whatever~side1 >actual &&
84 test_cmp expect actual &&
86 # greeting should have a merge conflict
87 git show ${expected_tree}:greeting >tmp &&
88 sed -e s/HEAD/side1/ tmp >expect &&
89 git show ${actual_tree}:greeting >actual &&
90 test_cmp expect actual
93 test_expect_success 'Barf on misspelled option, with exit code other than 0 or 1' '
94 # Mis-spell with single "s" instead of double "s"
95 test_expect_code 129 git merge-tree --write-tree --mesages FOOBAR side1 side2 2>expect &&
97 grep "error: unknown option.*mesages" expect
100 test_expect_success 'Barf on too many arguments' '
101 test_expect_code 129 git merge-tree --write-tree side1 side2 invalid 2>expect &&
103 grep "^usage: git merge-tree" expect
106 anonymize_hash() {
107 sed -e "s/[0-9a-f]\{40,\}/HASH/g" "$@"
110 test_expect_success 'test conflict notices and such' '
111 test_expect_code 1 git merge-tree --write-tree side1 side2 >out &&
112 anonymize_hash out >actual &&
114 # Expected results:
115 # "greeting" should merge with conflicts
116 # "numbers" should merge cleanly
117 # "whatever" has *both* a modify/delete and a file/directory conflict
118 cat <<-EOF >expect &&
119 HASH
121 Auto-merging greeting
122 CONFLICT (content): Merge conflict in greeting
123 Auto-merging numbers
124 CONFLICT (file/directory): directory in the way of whatever from side1; moving it to whatever~side1 instead.
125 CONFLICT (modify/delete): whatever~side1 deleted in side2 and modified in side1. Version side1 of whatever~side1 left in tree.
128 test_cmp expect actual
131 for opt in $(git merge-tree --git-completion-helper-all)
133 if test $opt = "--trivial-merge" || test $opt = "--write-tree"
134 then
135 continue
138 test_expect_success "usage: --trivial-merge is incompatible with $opt" '
139 test_expect_code 128 git merge-tree --trivial-merge $opt side1 side2 side3
141 done
143 test_done