mirror of
https://github.com/facebook/sapling.git
synced 2024-10-07 15:27:13 +03:00
73585d70f6
Hello, If one has the developer tools installed on MacOS X there's another alternative for the merge program. Invocation could be done somehow like in the attached patch for hgmerge.
121 lines
3.1 KiB
Bash
Executable File
121 lines
3.1 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# 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"
|
|
|
|
if [ -z "$EDITOR" ]; then
|
|
EDITOR="vi"
|
|
fi
|
|
|
|
# find decent versions of our utilities, insisting on the GNU versions where we
|
|
# need to
|
|
DIFF3=gdiff3
|
|
DIFF=gdiff
|
|
PATCH=gpatch
|
|
|
|
type $DIFF3 >/dev/null 2>&1 || DIFF3=diff3
|
|
type $DIFF >/dev/null 2>&1 || DIFF=diff
|
|
type $PATCH >/dev/null 2>&1 || PATCH=patch
|
|
$DIFF3 --version >/dev/null 2>&1 || DIFF3=
|
|
|
|
# Back up our file
|
|
cp "$LOCAL" "$LOCAL.orig"
|
|
|
|
# Attempt to do a non-interactive merge
|
|
if type merge > /dev/null 2>&1; then
|
|
merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0
|
|
cp "$LOCAL.orig" "$LOCAL"
|
|
elif [ -n "$DIFF3" ]; then
|
|
echo $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER"
|
|
$DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0
|
|
if [ $? -eq 2 ]; then
|
|
echo "$DIFF3 failed! Exiting." 1>&2
|
|
cp "$LOCAL.orig" "$LOCAL"
|
|
exit 1
|
|
fi
|
|
cp "$LOCAL.orig" "$LOCAL"
|
|
fi
|
|
|
|
# on MacOS X try opendiff
|
|
# (uses FileMerge.app, shipped with Apple's developer tools)
|
|
if type opendiff > /dev/null 2>&1; then
|
|
opendiff "$LOCAL.orig" "$OTHER" -ancestor "$BASE" -merge "$LOCAL" || exit 1
|
|
# prevent $OTHER from being removed too early
|
|
# can surely be done in a more elegant way
|
|
sleep 1
|
|
exit 0
|
|
fi
|
|
|
|
if [ -n "$DISPLAY" ]; then
|
|
# try using kdiff3, which is fairly nice
|
|
if type kdiff3 > /dev/null 2>&1; then
|
|
kdiff3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1
|
|
exit 0
|
|
fi
|
|
|
|
# try using tkdiff, which is a bit less sophisticated
|
|
if type tkdiff > /dev/null 2>&1; then
|
|
tkdiff "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || exit 1
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# Attempt to do a merge with $EDITOR
|
|
if type merge > /dev/null 2>&1; then
|
|
echo "conflicts detected in $LOCAL"
|
|
merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL"
|
|
exit 0
|
|
fi
|
|
|
|
if [ -n "$DIFF3" ]; then
|
|
echo "conflicts detected in $LOCAL"
|
|
$DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || {
|
|
case $? in
|
|
1)
|
|
$EDITOR "$LOCAL" ;;
|
|
2) echo "$DIFF3 failed! Exiting." 1>&2
|
|
cp "$LOCAL.orig" "$LOCAL"
|
|
exit 1 ;;
|
|
esac
|
|
exit 0
|
|
}
|
|
fi
|
|
|
|
HGTMP=""
|
|
cleanup_exit() {
|
|
rm -rf "$HGTMP"
|
|
}
|
|
|
|
# attempt to manually merge with diff and patch
|
|
if [ -n "$DIFF" -a -n "$PATCH" ]; then
|
|
# Remove temporary files even if we get interrupted
|
|
trap "cleanup_exit" 0 # normal exit
|
|
trap "exit 1" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
|
|
|
|
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
|
|
exit 0
|
|
else
|
|
# If rejects are empty after using the editor, merge was ok
|
|
$EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!"
|
|
exit 1
|