diff --git a/README b/README --- a/README +++ b/README @@ -19,10 +19,6 @@ Setting up Mercurial: $ export PYTHONPATH=${HOME}/lib/python # add this to your .bashrc $ export PATH=${HOME}/bin:$PATH # - You'll also need to set up a tool to handle three-way merges: - - $ export HGMERGE=tkmerge # customize this - And finally: $ hg # test installation, show help diff --git a/hgmerge b/hgmerge new file mode 100644 --- /dev/null +++ b/hgmerge @@ -0,0 +1,68 @@ +#!/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 + +# 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 +fi + +# 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 +fi + +# 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 +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 +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 + + diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -981,8 +981,8 @@ class localrepository: self.ui.debug("file %s: other %s ancestor %s\n" % (fn, short(other), short(base))) - cmd = os.environ["HGMERGE"] - r = os.system("%s %s %s %s %s" % (cmd, a, b, c, fn)) + cmd = os.environ.get("HGMERGE", "hgmerge") + r = os.system("%s %s %s %s" % (cmd, a, b, c)) if r: self.ui.warn("merging %s failed!\n" % f) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -29,4 +29,4 @@ setup(name='mercurial', glob.glob('templates/map-*') + glob.glob('templates/*.tmpl'))], cmdclass = { 'install_data' : install_package_data }, - scripts=['hg']) + scripts=['hg', 'hgmerge']) diff --git a/tkmerge b/tkmerge deleted file mode 100644 --- a/tkmerge +++ /dev/null @@ -1,2 +0,0 @@ -merge $1 $3 $2 || tkdiff -conflict $1 -o $1 -