hgmerge
98 lines
| 2.1 KiB
| text/plain
|
TextLexer
Thomas Arendsen Hein
|
r544 | #!/bin/sh | ||
mpm@selenic.com
|
r240 | # | ||
# 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 | ||||
Thomas Arendsen Hein
|
r795 | LOCAL="$1" | ||
BASE="$2" | ||||
OTHER="$3" | ||||
mpm@selenic.com
|
r240 | |||
Thomas Arendsen Hein
|
r795 | if [ -z "$EDITOR" ]; then | ||
EDITOR="vi" | ||||
fi | ||||
Thomas Arendsen Hein
|
r304 | |||
mpm@selenic.com
|
r240 | # Back up our file | ||
Thomas Arendsen Hein
|
r795 | cp "$LOCAL" "$LOCAL.orig" | ||
mpm@selenic.com
|
r240 | |||
# Attempt to do a non-interactive merge | ||||
Thomas Arendsen Hein
|
r828 | if type merge > /dev/null 2>&1; then | ||
Thomas Arendsen Hein
|
r795 | if merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null; then | ||
mpm@selenic.com
|
r240 | # success! | ||
exit 0 | ||||
fi | ||||
Thomas Arendsen Hein
|
r795 | cp "$LOCAL.orig" "$LOCAL" | ||
Thomas Arendsen Hein
|
r828 | elif type diff3 > /dev/null 2>&1; then | ||
Thomas Arendsen Hein
|
r795 | if diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" ; then | ||
mpm@selenic.com
|
r242 | # success | ||
exit 0 | ||||
fi | ||||
Thomas Arendsen Hein
|
r795 | cp "$LOCAL.orig" "$LOCAL" | ||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r303 | if [ -n "$DISPLAY" ]; then | ||
# try using kdiff3, which is fairly nice | ||||
Thomas Arendsen Hein
|
r828 | if type kdiff3 > /dev/null 2>&1; then | ||
Thomas Arendsen Hein
|
r795 | if kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" ; then | ||
Thomas Arendsen Hein
|
r303 | exit 0 | ||
else | ||||
exit 1 | ||||
fi | ||||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r303 | # try using tkdiff, which is a bit less sophisticated | ||
Thomas Arendsen Hein
|
r828 | if type tkdiff > /dev/null 2>&1; then | ||
Thomas Arendsen Hein
|
r795 | if tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" ; then | ||
Thomas Arendsen Hein
|
r303 | exit 0 | ||
else | ||||
exit 1 | ||||
fi | ||||
mpm@selenic.com
|
r240 | fi | ||
fi | ||||
# Attempt to do a merge with $EDITOR | ||||
Thomas Arendsen Hein
|
r828 | if type merge > /dev/null 2>&1; then | ||
mpm@selenic.com
|
r240 | echo "conflicts detected in $LOCAL" | ||
Thomas Arendsen Hein
|
r795 | merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" | ||
mpm@selenic.com
|
r242 | exit 0 | ||
fi | ||||
Thomas Arendsen Hein
|
r828 | if type diff3 > /dev/null 2>&1; then | ||
mpm@selenic.com
|
r242 | echo "conflicts detected in $LOCAL" | ||
Thomas Arendsen Hein
|
r795 | diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || $EDITOR "$LOCAL" | ||
mpm@selenic.com
|
r242 | exit 0 | ||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r795 | HGTMP="" | ||
cleanup_exit() { | ||||
rm -rf "$HGTMP" | ||||
exit $1 | ||||
} | ||||
mpm@selenic.com
|
r240 | # attempt to manually merge with diff and patch | ||
Thomas Arendsen Hein
|
r828 | if type diff > /dev/null 2>&1; then | ||
if type patch > /dev/null 2>&1; then | ||||
Thomas Arendsen Hein
|
r795 | # Remove temporary files even if we get interrupted | ||
trap "cleanup_exit 1" TERM KILL INT QUIT ABRT | ||||
HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" | ||||
(umask 077 && mkdir "$HGTMP") || { | ||||
echo "Could not create temporary directory! Exiting." 1>&2 | ||||
exit 1 | ||||
} | ||||
diff -u "$BASE" "$OTHER" > "$HGTMP/diff" | ||||
if patch "$LOCAL" < "$HGTMP/diff" ; then | ||||
cleanup_exit 0 | ||||
mpm@selenic.com
|
r240 | else | ||
Thomas Arendsen Hein
|
r795 | $EDITOR "$LOCAL" "$LOCAL.rej" | ||
mpm@selenic.com
|
r240 | fi | ||
Thomas Arendsen Hein
|
r795 | cleanup_exit 1 | ||
mpm@selenic.com
|
r240 | fi | ||
fi | ||||
echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" | ||||
exit 1 | ||||