Mercurial > hg
view hgmerge @ 822:b678e6d4f92d
Attempt to yield names in sorted order when walking.
This is an improvement in behaviour, but the walk and changes code still
has some flaws that make sorted name presentation difficult:
- changes returns tuples of names, instead of a sorted list of (name,
status) pairs.
- walk yields deleted names after all others.
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Sun, 31 Jul 2005 18:03:46 -0800 |
parents | 0902ffece4b4 |
children | 7a6acd56cd5a 1fe3b14c7044 9c918287d10b |
line wrap: on
line source
#!/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 # Back up our file cp "$LOCAL" "$LOCAL.orig" # Attempt to do a non-interactive merge if type merge > /dev/null ; then if merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null; then # success! exit 0 fi cp "$LOCAL.orig" "$LOCAL" elif type 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 type 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 type 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 type merge > /dev/null ; then echo "conflicts detected in $LOCAL" merge "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" exit 0 fi if type diff3 > /dev/null ; then echo "conflicts detected in $LOCAL" diff3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" || $EDITOR "$LOCAL" exit 0 fi HGTMP="" cleanup_exit() { rm -rf "$HGTMP" exit $1 } # attempt to manually merge with diff and patch if type diff > /dev/null ; then if type patch > /dev/null ; then # 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 else $EDITOR "$LOCAL" "$LOCAL.rej" fi cleanup_exit 1 fi fi echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" exit 1