author | Josef "Jeff" Sipek <jeffpc@optonline.net> |
Sun, 05 Feb 2006 20:52:55 -0500 | |
changeset 1668 | 586b50294ea8 |
parent 1664 | 4338e33c973b |
child 1699 | 83e8cd97b9f9 |
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 |
||
1664
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
47 |
# on MacOS X try FileMerge.app, shipped with Apple's developer tools |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
48 |
# TODO: make proper temp files. foo.orig and foo.link are dangerous |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
49 |
FILEMERGE='/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge' |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
50 |
if type "$FILEMERGE" > /dev/null 2>&1; then |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
51 |
cp "$LOCAL.orig" "$LOCAL" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
52 |
ln "$LOCAL" "$LOCAL.link" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
53 |
# filemerge prefers the right by default |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
54 |
if ! "$FILEMERGE" -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
55 |
then |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
56 |
echo "FileMerge failed to launch" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
57 |
exit 1 |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
58 |
fi |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
59 |
if ! test "$LOCAL" -ef "$LOCAL.link" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
60 |
then |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
61 |
rm "$LOCAL.orig" "$LOCAL.link" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
62 |
exit 0 |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
63 |
else |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
64 |
rm "$LOCAL.link" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
65 |
echo "$LOCAL is unchanged. Was the merge successful?" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
66 |
select answer in yes no |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
67 |
do |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
68 |
if test "$answer" == "yes" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
69 |
then |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
70 |
rm "$LOCAL.orig" |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
71 |
exit 0 |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
72 |
else |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
73 |
exit 1 |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
74 |
fi |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
75 |
done |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
76 |
exit 1 |
4338e33c973b
Safer version of FileMerge merge
Brendan Cully <brendan@kublai.com>
parents:
1647
diff
changeset
|
77 |
fi |
1647
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
78 |
fi |
64a1169c927d
Use of opendiff as merge program on MacOS X
Christian Ebert <blacktrash@gmx.net>
parents:
1434
diff
changeset
|
79 |
|
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
80 |
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
|
81 |
# 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
|
82 |
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
|
83 |
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
|
84 |
exit 0 |
240 | 85 |
fi |
86 |
||
303
15a9e55e7ea5
Check if $DISPLAY is set before using tkdiff or kdiff3.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
280
diff
changeset
|
87 |
# 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
|
88 |
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
|
89 |
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
|
90 |
exit 0 |
240 | 91 |
fi |
92 |
fi |
|
93 |
||
94 |
# 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
|
95 |
if type merge > /dev/null 2>&1; then |
240 | 96 |
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
|
97 |
merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" |
242 | 98 |
exit 0 |
99 |
fi |
|
100 |
||
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
101 |
if [ -n "$DIFF3" ]; then |
242 | 102 |
echo "conflicts detected in $LOCAL" |
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
103 |
$DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || { |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
104 |
case $? in |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
105 |
1) |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
106 |
$EDITOR "$LOCAL" ;; |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
107 |
2) echo "$DIFF3 failed! Exiting." 1>&2 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
108 |
cp "$LOCAL.orig" "$LOCAL" |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
109 |
exit 1 ;; |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
110 |
esac |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
111 |
exit 0 |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
112 |
} |
240 | 113 |
fi |
114 |
||
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
115 |
HGTMP="" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
116 |
cleanup_exit() { |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
117 |
rm -rf "$HGTMP" |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
118 |
} |
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
119 |
|
240 | 120 |
# 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
|
121 |
if [ -n "$DIFF" -a -n "$PATCH" ]; then |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
122 |
# Remove temporary files even if we get interrupted |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
123 |
trap "cleanup_exit" 0 # normal exit |
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
124 |
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
|
125 |
|
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
126 |
HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
127 |
(umask 077 && mkdir "$HGTMP") || { |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
128 |
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
|
129 |
exit 1 |
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
130 |
} |
795
cd0ad12d9e42
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
547
diff
changeset
|
131 |
|
1434
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
132 |
$DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : |
696851b1bba9
Fix use of diff(1) triggered by set -e.
levon@movementarian.org
parents:
839
diff
changeset
|
133 |
if $PATCH "$LOCAL" < "$HGTMP/diff"; then |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
134 |
exit 0 |
829
764b0350acb8
Shortened hgmerge a little bit.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
828
diff
changeset
|
135 |
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
|
136 |
# 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
|
137 |
$EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0 |
240 | 138 |
fi |
831
232d0616a80a
Cleaned up trap handling:
Thomas Arendsen Hein <thomas@intevation.de>
parents:
830
diff
changeset
|
139 |
exit 1 |
240 | 140 |
fi |
141 |
||
142 |
echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" |
|
143 |
exit 1 |