Skip to content

Commit 18acb3e

Browse files
author
Junio C Hamano
committed
Merge branch 'master' of git://repo.or.cz/git/mergetool.git
* 'master' of git://repo.or.cz/git/mergetool.git: mergetool: Clean up description of files and prompts for merge resolutions mergetool: Make git-rm quiet when resolving a deleted file conflict mergetool: Add support for Apple Mac OS X's opendiff command mergetool: Fix abort command when resolving symlinks and deleted files mergetool: Remove spurious error message if merge.tool config option not set mergetool: factor out common code mergetool: portability fix: don't use reserved word function mergetool: portability fix: don't assume true is in /bin mergetool: Don't error out in the merge case where the local file is deleted mergetool: Replace use of "echo -n" with printf(1) to be more portable Fix minor formatting issue in man page for git-mergetool
2 parents 7685227 + 27090aa commit 18acb3e

File tree

2 files changed

+87
-81
lines changed

2 files changed

+87
-81
lines changed

Documentation/git-mergetool.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ OPTIONS
2626
Use the merge resolution program specified by <tool>.
2727
Valid merge tools are:
2828
kdiff3, tkdiff, meld, xxdiff, emerge, and vimdiff.
29-
30-
If a merge resolution program is not specified, 'git mergetool'
31-
will use the configuration variable merge.tool. If the
32-
configuration variable merge.tool is not set, 'git mergetool'
33-
will pick a suitable default.
29+
+
30+
If a merge resolution program is not specified, 'git mergetool'
31+
will use the configuration variable merge.tool. If the
32+
configuration variable merge.tool is not set, 'git mergetool'
33+
will pick a suitable default.
3434

3535
Author
3636
------

git-mergetool.sh

Lines changed: 82 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,19 @@ SUBDIRECTORY_OK=Yes
1414
require_work_tree
1515

1616
# Returns true if the mode reflects a symlink
17-
function is_symlink () {
17+
is_symlink () {
1818
test "$1" = 120000
1919
}
2020

21-
function local_present () {
21+
local_present () {
2222
test -n "$local_mode"
2323
}
2424

25-
function remote_present () {
25+
remote_present () {
2626
test -n "$remote_mode"
2727
}
2828

29-
function base_present () {
29+
base_present () {
3030
test -n "$base_mode"
3131
}
3232

@@ -39,32 +39,29 @@ cleanup_temp_files () {
3939
fi
4040
}
4141

42-
function describe_file () {
42+
describe_file () {
4343
mode="$1"
4444
branch="$2"
4545
file="$3"
4646

47-
echo -n " "
47+
printf " {%s}: " "$branch"
4848
if test -z "$mode"; then
49-
echo -n "'$path' was deleted"
49+
echo "deleted"
5050
elif is_symlink "$mode" ; then
51-
echo -n "'$path' is a symlink containing '"
52-
cat "$file"
53-
echo -n "'"
51+
echo "a symbolic link -> '$(cat "$file")'"
5452
else
5553
if base_present; then
56-
echo -n "'$path' was created"
54+
echo "modified"
5755
else
58-
echo -n "'$path' was modified"
56+
echo "created"
5957
fi
6058
fi
61-
echo " in the $branch branch"
6259
}
6360

6461

6562
resolve_symlink_merge () {
66-
while /bin/true; do
67-
echo -n "Use (r)emote or (l)ocal, or (a)bort? "
63+
while true; do
64+
printf "Use (l)ocal or (r)emote, or (a)bort? "
6865
read ans
6966
case "$ans" in
7067
[lL]*)
@@ -73,52 +70,83 @@ resolve_symlink_merge () {
7370
cleanup_temp_files --save-backup
7471
return
7572
;;
76-
[rR]*)
73+
[rR]*)
7774
git-checkout-index -f --stage=3 -- "$path"
7875
git-add -- "$path"
7976
cleanup_temp_files --save-backup
8077
return
8178
;;
82-
[qQ]*)
79+
[aA]*)
8380
exit 1
8481
;;
8582
esac
8683
done
8784
}
8885

8986
resolve_deleted_merge () {
90-
while /bin/true; do
91-
echo -n "Use (m)odified or (d)eleted file, or (a)bort? "
87+
while true; do
88+
if base_present; then
89+
printf "Use (m)odified or (d)eleted file, or (a)bort? "
90+
else
91+
printf "Use (c)reated or (d)eleted file, or (a)bort? "
92+
fi
9293
read ans
9394
case "$ans" in
94-
[mM]*)
95+
[mMcC]*)
9596
git-add -- "$path"
9697
cleanup_temp_files --save-backup
9798
return
9899
;;
99-
[dD]*)
100-
git-rm -- "$path"
100+
[dD]*)
101+
git-rm -- "$path" > /dev/null
101102
cleanup_temp_files
102103
return
103104
;;
104-
[qQ]*)
105+
[aA]*)
105106
exit 1
106107
;;
107108
esac
108109
done
109110
}
110111

111-
merge_file () {
112-
path="$1"
112+
check_unchanged () {
113+
if test "$path" -nt "$BACKUP" ; then
114+
status=0;
115+
else
116+
while true; do
117+
echo "$path seems unchanged."
118+
printf "Was the merge successful? [y/n] "
119+
read answer < /dev/tty
120+
case "$answer" in
121+
y*|Y*) status=0; break ;;
122+
n*|N*) status=1; break ;;
123+
esac
124+
done
125+
fi
126+
}
113127

114-
if test ! -f "$path" ; then
115-
echo "$path: file not found"
116-
exit 1
128+
save_backup () {
129+
if test "$status" -eq 0; then
130+
mv -- "$BACKUP" "$path.orig"
131+
fi
132+
}
133+
134+
remove_backup () {
135+
if test "$status" -eq 0; then
136+
rm "$BACKUP"
117137
fi
138+
}
139+
140+
merge_file () {
141+
path="$1"
118142

119143
f=`git-ls-files -u -- "$path"`
120144
if test -z "$f" ; then
121-
echo "$path: file does not need merging"
145+
if test ! -f "$path" ; then
146+
echo "$path: file not found"
147+
else
148+
echo "$path: file does not need merging"
149+
fi
122150
exit 1
123151
fi
124152

@@ -139,25 +167,25 @@ merge_file () {
139167
remote_present && git cat-file blob ":3:$path" > "$REMOTE" 2>/dev/null
140168

141169
if test -z "$local_mode" -o -z "$remote_mode"; then
142-
echo "Deleted merge conflict for $path:"
170+
echo "Deleted merge conflict for '$path':"
143171
describe_file "$local_mode" "local" "$LOCAL"
144172
describe_file "$remote_mode" "remote" "$REMOTE"
145173
resolve_deleted_merge
146174
return
147175
fi
148176

149177
if is_symlink "$local_mode" || is_symlink "$remote_mode"; then
150-
echo "Symlink merge conflict for $path:"
178+
echo "Symbolic link merge conflict for '$path':"
151179
describe_file "$local_mode" "local" "$LOCAL"
152180
describe_file "$remote_mode" "remote" "$REMOTE"
153181
resolve_symlink_merge
154182
return
155183
fi
156184

157-
echo "Normal merge conflict for $path:"
185+
echo "Normal merge conflict for '$path':"
158186
describe_file "$local_mode" "local" "$LOCAL"
159187
describe_file "$remote_mode" "remote" "$REMOTE"
160-
echo -n "Hit return to start merge resolution tool ($merge_tool): "
188+
printf "Hit return to start merge resolution tool (%s): " "$merge_tool"
161189
read ans
162190

163191
case "$merge_tool" in
@@ -170,9 +198,7 @@ merge_file () {
170198
-o "$path" -- "$LOCAL" "$REMOTE" > /dev/null 2>&1)
171199
fi
172200
status=$?
173-
if test "$status" -eq 0; then
174-
rm "$BACKUP"
175-
fi
201+
remove_backup
176202
;;
177203
tkdiff)
178204
if base_present ; then
@@ -181,29 +207,13 @@ merge_file () {
181207
tkdiff -o "$path" -- "$LOCAL" "$REMOTE"
182208
fi
183209
status=$?
184-
if test "$status" -eq 0; then
185-
mv -- "$BACKUP" "$path.orig"
186-
fi
210+
save_backup
187211
;;
188212
meld|vimdiff)
189213
touch "$BACKUP"
190214
$merge_tool -- "$LOCAL" "$path" "$REMOTE"
191-
if test "$path" -nt "$BACKUP" ; then
192-
status=0;
193-
else
194-
while true; do
195-
echo "$path seems unchanged."
196-
echo -n "Was the merge successful? [y/n] "
197-
read answer < /dev/tty
198-
case "$answer" in
199-
y*|Y*) status=0; break ;;
200-
n*|N*) status=1; break ;;
201-
esac
202-
done
203-
fi
204-
if test "$status" -eq 0; then
205-
mv -- "$BACKUP" "$path.orig"
206-
fi
215+
check_unchanged
216+
save_backup
207217
;;
208218
xxdiff)
209219
touch "$BACKUP"
@@ -220,22 +230,18 @@ merge_file () {
220230
-R 'Accel.SearchForward: "Ctrl-G"' \
221231
--merged-file "$path" -- "$LOCAL" "$REMOTE"
222232
fi
223-
if test "$path" -nt "$BACKUP" ; then
224-
status=0;
233+
check_unchanged
234+
save_backup
235+
;;
236+
opendiff)
237+
touch "$BACKUP"
238+
if base_present; then
239+
opendiff "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$path" | cat
225240
else
226-
while true; do
227-
echo "$path seems unchanged."
228-
echo -n "Was the merge successful? [y/n] "
229-
read answer < /dev/tty
230-
case "$answer" in
231-
y*|Y*) status=0; break ;;
232-
n*|N*) status=1; break ;;
233-
esac
234-
done
235-
fi
236-
if test "$status" -eq 0; then
237-
mv -- "$BACKUP" "$path.orig"
241+
opendiff "$LOCAL" "$REMOTE" -merge "$path" | cat
238242
fi
243+
check_unchanged
244+
save_backup
239245
;;
240246
emerge)
241247
if base_present ; then
@@ -244,9 +250,7 @@ merge_file () {
244250
emacs -f emerge-files-command "$LOCAL" "$REMOTE" "$path"
245251
fi
246252
status=$?
247-
if test "$status" -eq 0; then
248-
mv -- "$BACKUP" "$path.orig"
249-
fi
253+
save_backup
250254
;;
251255
esac
252256
if test "$status" -ne 0; then
@@ -289,7 +293,7 @@ done
289293
if test -z "$merge_tool"; then
290294
merge_tool=`git-config merge.tool`
291295
case "$merge_tool" in
292-
kdiff3 | tkdiff | xxdiff | meld | emerge | vimdiff)
296+
kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | "")
293297
;; # happy
294298
*)
295299
echo >&2 "git config option merge.tool set to unknown tool: $merge_tool"
@@ -308,6 +312,8 @@ if test -z "$merge_tool" ; then
308312
merge_tool=xxdiff
309313
elif type meld >/dev/null 2>&1 && test -n "$DISPLAY"; then
310314
merge_tool=meld
315+
elif type opendiff >/dev/null 2>&1; then
316+
merge_tool=opendiff
311317
elif type emacs >/dev/null 2>&1; then
312318
merge_tool=emerge
313319
elif type vimdiff >/dev/null 2>&1; then
@@ -319,7 +325,7 @@ if test -z "$merge_tool" ; then
319325
fi
320326

321327
case "$merge_tool" in
322-
kdiff3|tkdiff|meld|xxdiff|vimdiff)
328+
kdiff3|tkdiff|meld|xxdiff|vimdiff|opendiff)
323329
if ! type "$merge_tool" > /dev/null 2>&1; then
324330
echo "The merge tool $merge_tool is not available"
325331
exit 1
@@ -346,12 +352,12 @@ if test $# -eq 0 ; then
346352
echo Merging the files: $files
347353
git ls-files -u | sed -e 's/^[^ ]* //' | sort -u | while read i
348354
do
349-
echo ""
355+
printf "\n"
350356
merge_file "$i" < /dev/tty > /dev/tty
351357
done
352358
else
353359
while test $# -gt 0; do
354-
echo ""
360+
printf "\n"
355361
merge_file "$1"
356362
shift
357363
done

0 commit comments

Comments
 (0)