1#!/bin/sh
2#
3# Copyright (c) 2008 Charles Bailey
4#
5
6test_description='git mergetool
7
8Testing basic merge tool invocation'
9
10. ./test-lib.sh
11
12# All the mergetool test work by checking out a temporary branch based
13# off 'branch1' and then merging in master and checking the results of
14# running mergetool
15
16test_expect_success 'setup' '
17 git config rerere.enabled true &&
18 echo master >file1 &&
19 echo master file11 >file11 &&
20 echo master file12 >file12 &&
21 echo master file13 >file13 &&
22 echo master file14 >file14 &&
23 mkdir subdir &&
24 echo master sub >subdir/file3 &&
25 git add file1 file1[1-4] subdir/file3 &&
26 git commit -m "add initial versions" &&
27
28 git checkout -b branch1 master &&
29 echo branch1 change >file1 &&
30 echo branch1 newfile >file2 &&
31 echo branch1 change file11 >file11 &&
32 echo branch1 change file13 >file13 &&
33 echo branch1 sub >subdir/file3 &&
34 git add file1 file11 file13 file2 subdir/file3 &&
35 git rm file12 &&
36 git commit -m "branch1 changes" &&
37
38 git checkout master &&
39 echo master updated >file1 &&
40 echo master new >file2 &&
41 echo master updated file12 >file12 &&
42 echo master updated file14 >file14 &&
43 echo master new sub >subdir/file3 &&
44 git add file1 file12 file14 file2 subdir/file3 &&
45 git rm file11 &&
46 git commit -m "master updates" &&
47
48 git config merge.tool mytool &&
49 git config mergetool.mytool.cmd "cat \"\$REMOTE\" >\"\$MERGED\"" &&
50 git config mergetool.mytool.trustExitCode true
51'
52
53test_expect_success 'custom mergetool' '
54 git checkout -b test1 branch1 &&
55 test_must_fail git merge master >/dev/null 2>&1 &&
56 ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
57 ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
58 ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
59 ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
60 ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
61 test "$(cat file1)" = "master updated" &&
62 test "$(cat file2)" = "master new" &&
63 test "$(cat subdir/file3)" = "master new sub" &&
64 git commit -m "branch1 resolved with mergetool"
65'
66
67test_expect_success 'mergetool crlf' '
68 git config core.autocrlf true &&
69 git checkout -b test2 branch1 &&
70 test_must_fail git merge master >/dev/null 2>&1 &&
71 ( yes "" | git mergetool file1 >/dev/null 2>&1 ) &&
72 ( yes "" | git mergetool file2 >/dev/null 2>&1 ) &&
73 ( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) &&
74 ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
75 ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
76 test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
77 test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
78 test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
79 git commit -m "branch1 resolved with mergetool - autocrlf" &&
80 git config core.autocrlf false &&
81 git reset --hard
82'
83
84test_expect_success 'mergetool in subdir' '
85 git checkout -b test3 branch1 &&
86 (
87 cd subdir &&
88 test_must_fail git merge master >/dev/null 2>&1 &&
89 ( yes "" | git mergetool file3 >/dev/null 2>&1 ) &&
90 test "$(cat file3)" = "master new sub"
91 )
92'
93
94test_expect_success 'mergetool on file in parent dir' '
95 (
96 cd subdir &&
97 ( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) &&
98 ( yes "" | git mergetool ../file2 >/dev/null 2>&1 ) &&
99 ( yes "d" | git mergetool ../file11 >/dev/null 2>&1 ) &&
100 ( yes "d" | git mergetool ../file12 >/dev/null 2>&1 ) &&
101 test "$(cat ../file1)" = "master updated" &&
102 test "$(cat ../file2)" = "master new" &&
103 git commit -m "branch1 resolved with mergetool - subdir"
104 )
105'
106
107test_expect_success 'mergetool skips autoresolved' '
108 git checkout -b test4 branch1 &&
109 test_must_fail git merge master &&
110 test -n "$(git ls-files -u)" &&
111 ( yes "d" | git mergetool file11 >/dev/null 2>&1 ) &&
112 ( yes "d" | git mergetool file12 >/dev/null 2>&1 ) &&
113 output="$(git mergetool --no-prompt)" &&
114 test "$output" = "No files need merging" &&
115 git reset --hard
116'
117
118test_expect_success 'mergetool merges all from subdir' '
119 (
120 cd subdir &&
121 git config rerere.enabled false &&
122 test_must_fail git merge master &&
123 ( yes "d" "d" | git mergetool --no-prompt ) &&
124 test "$(cat ../file1)" = "master updated" &&
125 test "$(cat ../file2)" = "master new" &&
126 test "$(cat file3)" = "master new sub" &&
127 git commit -m "branch2 resolved by mergetool from subdir"
128 )
129'
130
131test_expect_success 'mergetool skips resolved paths when rerere is active' '
132 git config rerere.enabled true &&
133 rm -rf .git/rr-cache &&
134 git checkout -b test5 branch1
135 test_must_fail git merge master >/dev/null 2>&1 &&
136 ( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) &&
137 output="$(yes "n" | git mergetool --no-prompt)" &&
138 test "$output" = "No files need merging" &&
139 git reset --hard
140'
141
142test_done