3 test_description
='git merge-tree --write-tree'
7 # This test is ort-specific
8 if test "$GIT_TEST_MERGE_ALGORITHM" != "ort"
10 skip_all
="GIT_TEST_MERGE_ALGORITHM != ort"
14 test_expect_success setup
'
15 test_write_lines 1 2 3 4 5 >numbers &&
16 echo hello >greeting &&
18 git add numbers greeting whatever &&
20 git commit -m initial &&
27 test_write_lines 1 2 3 4 5 6 >numbers &&
30 git add numbers greeting whatever &&
32 git commit -m modify-stuff &&
35 test_write_lines 0 1 2 3 4 5 >numbers &&
40 git add numbers greeting whatever/empty &&
42 git commit -m other-modifications &&
45 git mv numbers sequence &&
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
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
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 &&
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 &&
121 Auto-merging greeting
122 CONFLICT (content): Merge conflict in greeting
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"
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