hgmerge
author mpm@selenic.com
Tue, 21 Jun 2005 18:35:32 -0800
changeset 406 d8abb687d501
parent 306 f06a4a3b86a7
child 544 3d4d5f2aba9a
child 547 4fc63e22b1fe
permissions -rwxr-xr-x
[PATCH] Using monotone-viz/git-viz with mercurial -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 [PATCH] Using monotone-viz/git-viz with mercurial From: Vincent Danjean <vdanjean.ml@free.fr> monotone-viz is a small GTK+ application that visualizes monotone ancestry graphs. Its home page is: http://oandrieu.nerim.net/monotone-viz/ As monotone and git are similar, the author adapted the 0.9 version to display git ancestry graphs and call it git-viz. I cannot see any link from the homepage, but looking in the archive of git ML, it can be found here: http://oandrieu.nerim.net/monotone-viz/git-viz-0.1.tar.gz I few days ago, I adapted it so that it works with the last versions of git/cogito. Patches and package are available here: http://dept-info.labri.fr/~danjean/deb.html#git-viz Today, I patched hgit so that it respects the output of git-diff-tree, I added git-{diff-tree,cat-file,rev-list,rev-tree} that call hgit (2 lines scripts), and added the script 'hg-viz'. hg-viz create a .git directory and store the SHA1 of the tip in .git/HEAD and then call my git-viz. All these modifications are in the attached patch. I try it in the mercurial repository. After applying the patch, you just have to add the contrib directory in your PATH and call hg-viz. An example of what we can see is on my web page (probably not for a long time) : http://dept-info.labri.fr/~danjean/temp/hg-viz.png Vincent -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCuM50ywK+sNU5EO8RAtlvAJ425JJI9chCdSi8D+R2Af/vJEOUpACffC9e fxjJ3umBkffj5g86jWaRGZ0= =LwA2 -----END PGP SIGNATURE-----

#!/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

EDITOR="${EDITOR:-vi}"

# 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
elif which diff3 > /dev/null ; then
    if diff3 -m $LOCAL.orig $BASE $OTHER > $LOCAL ; then
	# success
	exit 0
    fi
    cp $LOCAL.orig $LOCAL
fi

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
    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
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
    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
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