author | Matt Mackall <mpm@selenic.com> |
Sun, 29 Jan 2006 20:30:41 +1300 | |
changeset 1660 | b2df93c56ac4 |
parent 1647 | 64a1169c927d |
child 1664 | 4338e33c973b |
permissions | -rwxr-xr-x |
544
3d4d5f2aba9a
Remove bashisms and use /bin/sh instead of /bin/bash.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
306
diff
changeset
|
1 |
#!/bin/sh |
240 | 2 |
# |
3 |
# hgmerge - default merge helper for Mercurial |
|
4 |
# |
|
5 |
# This tries to find a way to do three-way merge on the current system. |
|
6 |
# The result ought to end up in $1. |
|
7 |
||
8 |
set -e # bail out quickly on failure |
|
9 |
||
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
10 |
LOCAL="$1" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
11 |
BASE="$2" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
12 |
OTHER="$3" |
240 | 13 |
|
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
14 |
if [ -z "$EDITOR" ]; then |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
15 |
EDITOR="vi" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
16 |
fi |
304
38fb7d23b78d
Use vi if $EDITOR is unset.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
303
diff
changeset
|
17 |
|
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
18 |
# find decent versions of our utilities, insisting on the GNU versions where we |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
19 |
# need to |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
20 |
DIFF3=gdiff3 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
21 |
DIFF=gdiff |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
22 |
PATCH=gpatch |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
23 |
|
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
24 |
type $DIFF3 >/dev/null 2>&1 || DIFF3=diff3 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
25 |
type $DIFF >/dev/null 2>&1 || DIFF=diff |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
26 |
type $PATCH >/dev/null 2>&1 || PATCH=patch |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
27 |
$DIFF3 --version >/dev/null 2>&1 || DIFF3= |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
28 |
|
240 | 29 |
# Back up our file |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
30 |
cp "$LOCAL" "$LOCAL.orig" |
240 | 31 |
|
32 |
# Attempt to do a non-interactive merge |
|
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
33 |
if type merge > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
34 |
merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0 |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
35 |
cp "$LOCAL.orig" "$LOCAL" |
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
36 |
elif [ -n "$DIFF3" ]; then |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
37 |
echo $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
38 |
$DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
39 |
if [ $? -eq 2 ]; then |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
40 |
echo "$DIFF3 failed! Exiting." 1>&2 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
41 |
cp "$LOCAL.orig" "$LOCAL" |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
42 |
exit 1 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
43 |
fi |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
44 |
cp "$LOCAL.orig" "$LOCAL" |
240 | 45 |
fi |
46 |
||
1647
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
47 |
# on MacOS X try opendiff |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
48 |
# (uses FileMerge.app, shipped with Apple's developer tools) |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
49 |
if type opendiff > /dev/null 2>&1; then |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
50 |
opendiff "$LOCAL.orig" "$OTHER" -ancestor "$BASE" -merge "$LOCAL" || exit 1 |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
51 |
# prevent $OTHER from being removed too early |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
52 |
# can surely be done in a more elegant way |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
53 |
sleep 1 |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
54 |
exit 0 |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
55 |
fi |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
56 |
|
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
57 |
if [ -n "$DISPLAY" ]; then |
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
58 |
# try using kdiff3, which is fairly nice |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
59 |
if type kdiff3 > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
60 |
kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
61 |
exit 0 |
240 | 62 |
fi |
63 |
||
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
64 |
# try using tkdiff, which is a bit less sophisticated |
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
65 |
if type tkdiff > /dev/null 2>&1; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
66 |
tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
67 |
exit 0 |
240 | 68 |
fi |
69 |
fi |
|
70 |
||
71 |
# Attempt to do a merge with $EDITOR |
|
828
7a6acd56cd5a
Hide error message of type command.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
814
diff
changeset
|
72 |
if type merge > /dev/null 2>&1; then |
240 | 73 |
echo "conflicts detected in $LOCAL" |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
74 |
merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" |
242 | 75 |
exit 0 |
76 |
fi |
|
77 |
||
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
78 |
if [ -n "$DIFF3" ]; then |
242 | 79 |
echo "conflicts detected in $LOCAL" |
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
80 |
$DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || { |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
81 |
case $? in |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
82 |
1) |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
83 |
$EDITOR "$LOCAL" ;; |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
84 |
2) echo "$DIFF3 failed! Exiting." 1>&2 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
85 |
cp "$LOCAL.orig" "$LOCAL" |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
86 |
exit 1 ;; |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
87 |
esac |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
88 |
exit 0 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
89 |
} |
240 | 90 |
fi |
91 |
||
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
92 |
HGTMP="" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
93 |
cleanup_exit() { |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
94 |
rm -rf "$HGTMP" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
95 |
} |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
96 |
|
240 | 97 |
# attempt to manually merge with diff and patch |
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
98 |
if [ -n "$DIFF" -a -n "$PATCH" ]; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
99 |
# Remove temporary files even if we get interrupted |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
100 |
trap "cleanup_exit" 0 # normal exit |
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
101 |
trap "exit 1" 1 2 3 6 15 # HUP INT QUIT ABRT TERM |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
102 |
|
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
103 |
HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
104 |
(umask 077 && mkdir "$HGTMP") || { |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
105 |
echo "Could not create temporary directory! Exiting." 1>&2 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
106 |
exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
107 |
} |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
108 |
|
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
109 |
$DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
110 |
if $PATCH "$LOCAL" < "$HGTMP/diff"; then |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
111 |
exit 0 |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
112 |
else |
830
ca080d28d0af
If rejects are empty after using the editor, merge with diff+patch was ok.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
829
diff
changeset
|
113 |
# If rejects are empty after using the editor, merge was ok |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
114 |
$EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0 |
240 | 115 |
fi |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
116 |
exit 1 |
240 | 117 |
fi |
118 |
||
119 |
echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" |
|
120 |
exit 1 |