hgmerge
83 lines
| 1.7 KiB
| text/plain
|
TextLexer
mpm@selenic.com
|
r240 | #!/bin/bash | ||
# | ||||
# hgmerge - default merge helper for Mercurial | ||||
# | ||||
# This tries to find a way to do three-way merge on the current system. | ||||
# The result ought to end up in $1. | ||||
set -e # bail out quickly on failure | ||||
LOCAL=$1 | ||||
BASE=$2 | ||||
OTHER=$3 | ||||
Thomas Arendsen Hein
|
r304 | EDITOR="${EDITOR:-vi}" | ||
mpm@selenic.com
|
r240 | # Back up our file | ||
cp $LOCAL $LOCAL.orig | ||||
# Attempt to do a non-interactive merge | ||||
if which merge > /dev/null ; then | ||||
if merge $LOCAL $BASE $OTHER 2> /dev/null; then | ||||
# success! | ||||
exit 0 | ||||
fi | ||||
cp $LOCAL.orig $LOCAL | ||||
mpm@selenic.com
|
r242 | elif which diff3 > /dev/null ; then | ||
if diff3 -m $LOCAL.orig $BASE $OTHER > $LOCAL ; then | ||||
# success | ||||
exit 0 | ||||
fi | ||||
cp $LOCAL.orig $LOCAL | ||||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r303 | if [ -n "$DISPLAY" ]; then | ||
# try using kdiff3, which is fairly nice | ||||
if which kdiff3 > /dev/null ; then | ||||
if kdiff3 --auto $BASE $LOCAL $OTHER -o $LOCAL ; then | ||||
exit 0 | ||||
else | ||||
exit 1 | ||||
fi | ||||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r303 | # try using tkdiff, which is a bit less sophisticated | ||
if which tkdiff > /dev/null ; then | ||||
if tkdiff $LOCAL $OTHER -a $BASE -o $LOCAL ; then | ||||
exit 0 | ||||
else | ||||
exit 1 | ||||
fi | ||||
mpm@selenic.com
|
r240 | fi | ||
fi | ||||
# Attempt to do a merge with $EDITOR | ||||
if which merge > /dev/null ; then | ||||
echo "conflicts detected in $LOCAL" | ||||
merge $LOCAL $BASE $OTHER 2>/dev/null || $EDITOR $LOCAL | ||||
mpm@selenic.com
|
r242 | exit 0 | ||
fi | ||||
if which diff3 > /dev/null ; then | ||||
echo "conflicts detected in $LOCAL" | ||||
diff3 -m $LOCAL.orig $BASE $OTHER > $LOCAL || $EDITOR $LOCAL | ||||
exit 0 | ||||
mpm@selenic.com
|
r240 | fi | ||
# attempt to manually merge with diff and patch | ||||
if which diff > /dev/null ; then | ||||
if which patch > /dev/null ; then | ||||
T=`mktemp` | ||||
diff -u $BASE $OTHER > $T | ||||
if patch $LOCAL < $T ; then | ||||
exit 0 | ||||
else | ||||
$EDITOR $LOCAL $LOCAL.rej | ||||
fi | ||||
rm $T | ||||
exit 1 | ||||
fi | ||||
fi | ||||
echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" | ||||
exit 1 | ||||