##// END OF EJS Templates
Use smerge minor mode in emacs to resolve conflicts....
Use smerge minor mode in emacs to resolve conflicts. The condition-case is used to suppress errors with emacs versions before 21.

File last commit:

r5172:f53d97d6 default
r5172:f53d97d6 default
Show More
hgmerge
209 lines | 5.6 KiB | text/plain | TextLexer
Thomas Arendsen Hein
Remove bashisms and use /bin/sh instead of /bin/bash....
r544 #!/bin/sh
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 #
# hgmerge - default merge helper for Mercurial
#
# This tries to find a way to do three-way merge on the current system.
Vadim Gelfer
run merge program in repo root....
r1885 # The result ought to end up in $1. Script is run in root directory of
# repository.
Vadim Gelfer
give more info to hgmerge script.
r1883 #
# Environment variables set by Mercurial:
# HG_FILE name of file within repo
# HG_MY_NODE revision being merged
# HG_OTHER_NODE revision being merged
mpm@selenic.com
Replace tkmerge with hgmerge...
r240
set -e # bail out quickly on failure
Thomas Arendsen Hein
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
r795 LOCAL="$1"
BASE="$2"
OTHER="$3"
mpm@selenic.com
Replace tkmerge with hgmerge...
r240
Thomas Arendsen Hein
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
r795 if [ -z "$EDITOR" ]; then
EDITOR="vi"
fi
Thomas Arendsen Hein
Use vi if $EDITOR is unset.
r304
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434 # find decent versions of our utilities, insisting on the GNU versions where we
# need to
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 MERGE="merge"
DIFF3="gdiff3"
DIFF="gdiff"
PATCH="gpatch"
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 type "$MERGE" >/dev/null 2>&1 || MERGE=
type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3"
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434 $DIFF3 --version >/dev/null 2>&1 || DIFF3=
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 type "$DIFF" >/dev/null 2>&1 || DIFF="diff"
type "$DIFF" >/dev/null 2>&1 || DIFF=
type "$PATCH" >/dev/null 2>&1 || PATCH="patch"
type "$PATCH" >/dev/null 2>&1 || PATCH=
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699 # find optional visual utilities
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge"
KDIFF3="kdiff3"
TKDIFF="tkdiff"
Radoslaw Szkodzinski
hgmerge: add meld support
r1774 MELD="meld"
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE=
type "$KDIFF3" >/dev/null 2>&1 || KDIFF3=
type "$TKDIFF" >/dev/null 2>&1 || TKDIFF=
Radoslaw Szkodzinski
hgmerge: add meld support
r1774 type "$MELD" >/dev/null 2>&1 || MELD=
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699
Radoslaw Szkodzinski
Try to use /usr/bin/test or /bin/test to work around missing features....
r2051 # Hack for Solaris
TEST="/usr/bin/test"
type "$TEST" >/dev/null 2>&1 || TEST="/bin/test"
type "$TEST" >/dev/null 2>&1 || TEST="test"
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 # random part of names
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 RAND="$RANDOM$RANDOM"
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 # temporary directory for diff+patch merge
Thomas Arendsen Hein
Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
r1797 HGTMP="${TMPDIR-/tmp}/hgmerge.$RAND"
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701
# backup file
BACKUP="$LOCAL.orig.$RAND"
# file used to test for file change
CHGTEST="$LOCAL.chg.$RAND"
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700
# put all your required cleanup here
cleanup() {
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 rm -f "$BACKUP" "$CHGTEST"
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 rm -rf "$HGTMP"
}
# functions concerning program exit
success() {
cleanup
exit 0
}
failure() {
echo "merge failed" 1>&2
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 mv "$BACKUP" "$LOCAL"
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 cleanup
exit 1
}
Radoslaw Szkodzinski
hgmerge: add and use ask_if_merged function...
r1771 # Ask if the merge was successful
ask_if_merged() {
Thomas Arendsen Hein
Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
r1797 while true; do
echo "$LOCAL seems unchanged."
echo "Was the merge successful? [y/n]"
Radoslaw Szkodzinski
hgmerge: add and use ask_if_merged function...
r1771 read answer
Thomas Arendsen Hein
Fix hgmerge: mkdir "'/tmp'/hgmerge..." and ask_if_merged() didn't work.
r1797 case "$answer" in
Radoslaw Szkodzinski
hgmerge: add and use ask_if_merged function...
r1771 y*|Y*) success;;
n*|N*) failure;;
esac
done
}
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 # Check if conflict markers are present and ask if the merge was successful
conflicts_or_success() {
while egrep '^(<<<<<<< .*|=======|>>>>>>> .*)$' "$LOCAL" >/dev/null; do
echo "$LOCAL contains conflict markers."
echo "Keep this version? [y/n]"
read answer
case "$answer" in
y*|Y*) success;;
n*|N*) failure;;
esac
done
success
}
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 # Clean up when interrupted
trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 # Back up our file (and try hard to keep the mtime unchanged)
mv "$LOCAL" "$BACKUP"
cp "$BACKUP" "$LOCAL"
mpm@selenic.com
Replace tkmerge with hgmerge...
r240
# Attempt to do a non-interactive merge
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
if [ -n "$MERGE" ]; then
$MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success
elif [ -n "$DIFF3" ]; then
$DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" && success
fi
if [ $? -gt 1 ]; then
echo "automatic merge failed! Exiting." 1>&2
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 failure
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434 fi
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
Brendan Cully
Safer version of FileMerge merge
r1664 # on MacOS X try FileMerge.app, shipped with Apple's developer tools
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699 if [ -n "$FILEMERGE" ]; then
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 cp "$BACKUP" "$LOCAL"
cp "$BACKUP" "$CHGTEST"
Brendan Cully
Safer version of FileMerge merge
r1664 # filemerge prefers the right by default
Radoslaw Szkodzinski
hgmerge: various cleanups...
r1701 $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL"
[ $? -ne 0 ] && echo "FileMerge failed to launch" && failure
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
Christian Ebert
Use of opendiff as merge program on MacOS X...
r1647 fi
Thomas Arendsen Hein
Check if $DISPLAY is set before using tkdiff or kdiff3.
r303 if [ -n "$DISPLAY" ]; then
# try using kdiff3, which is fairly nice
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699 if [ -n "$KDIFF3" ]; then
Radoslaw Szkodzinski
hgmerge: do not use file with markers in tools merging themselves...
r1798 $KDIFF3 --auto "$BASE" "$BACKUP" "$OTHER" -o "$LOCAL" || failure
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 conflicts_or_success
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
Thomas Arendsen Hein
Check if $DISPLAY is set before using tkdiff or kdiff3.
r303 # try using tkdiff, which is a bit less sophisticated
Radoslaw Szkodzinski
hgmerge: add and use more tool variables...
r1699 if [ -n "$TKDIFF" ]; then
Radoslaw Szkodzinski
hgmerge: do not use file with markers in tools merging themselves...
r1798 $TKDIFF "$BACKUP" "$OTHER" -a "$BASE" -o "$LOCAL" || failure
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 conflicts_or_success
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
Radoslaw Szkodzinski
hgmerge: add meld support
r1774
if [ -n "$MELD" ]; then
cp "$BACKUP" "$CHGTEST"
# protect our feet - meld allows us to save to the left file
cp "$BACKUP" "$LOCAL.tmp.$RAND"
# Meld doesn't have automatic merging, so to reduce intervention
# use the file with conflicts
$MELD "$LOCAL.tmp.$RAND" "$LOCAL" "$OTHER" || failure
# Also it doesn't return good error code
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
Radoslaw Szkodzinski
hgmerge: add meld support
r1774 fi
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
# Attempt to do a merge with $EDITOR
Radoslaw Szkodzinski
hgmerge: logic changes...
r1772 if [ -n "$MERGE" -o -n "$DIFF3" ]; then
mpm@selenic.com
hgmerge: use diff3 if available...
r242 echo "conflicts detected in $LOCAL"
Radoslaw Szkodzinski
hgmerge: logic changes...
r1772 cp "$BACKUP" "$CHGTEST"
Sascha Wilde
Use smerge minor mode in emacs to resolve conflicts....
r5172 case "$EDITOR" in
"emacs")
$EDITOR "$LOCAL" --eval '(condition-case nil (smerge-mode 1) (error nil))' || failure
;;
*)
$EDITOR "$LOCAL" || failure
;;
esac
Radoslaw Szkodzinski
hgmerge: logic changes...
r1772 # Some editors do not return meaningful error codes
# Do not take any chances
Thomas Arendsen Hein
Check for conflict markers in hgmerge (issue471)
r4855 $TEST "$LOCAL" -nt "$CHGTEST" && conflicts_or_success || ask_if_merged
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
# attempt to manually merge with diff and patch
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434 if [ -n "$DIFF" -a -n "$PATCH" ]; then
Thomas Arendsen Hein
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
r795
Thomas Arendsen Hein
Shortened hgmerge a little bit.
r829 (umask 077 && mkdir "$HGTMP") || {
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 echo "Could not create temporary directory $HGTMP" 1>&2
failure
Thomas Arendsen Hein
Shortened hgmerge a little bit.
r829 }
Thomas Arendsen Hein
Remove usage of ${par:-word}, which and mktemp. Quote filenames.
r795
levon@movementarian.org
Fix use of diff(1) triggered by set -e....
r1434 $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || :
if $PATCH "$LOCAL" < "$HGTMP/diff"; then
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 success
Thomas Arendsen Hein
Shortened hgmerge a little bit.
r829 else
Radoslaw Szkodzinski
hgmerge: fix diff+patch detection; cleanups...
r1770 # If rejects are empty after using the editor, merge was ok
Radoslaw Szkodzinski
hgmerge: logic changes...
r1772 $EDITOR "$LOCAL" "$LOCAL.rej" || failure
Radoslaw Szkodzinski
Try to use /usr/bin/test or /bin/test to work around missing features....
r2051 $TEST -s "$LOCAL.rej" || success
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 failure
mpm@selenic.com
Replace tkmerge with hgmerge...
r240 fi
Radoslaw Szkodzinski
hgmerge: improve "apps not found" message
r1773 echo
echo "hgmerge: unable to find any merge utility!"
echo "supported programs:"
Radoslaw Szkodzinski
hgmerge: add meld support
r1774 echo "merge, FileMerge, tkdiff, kdiff3, meld, diff+patch"
Radoslaw Szkodzinski
hgmerge: improve "apps not found" message
r1773 echo
Radoslaw Szkodzinski
hgmerge: add cleanup functions...
r1700 failure