Mercurial > hg-stable
view hgmerge @ 1770:4eea6a747c27
hgmerge: fix diff+patch detection; cleanups
Details:
- actually show help message when no tools are found
- whitespace cleanup (stupid emacs)
- quote more variables
- simplify merge/diff3 error handling
author | Radoslaw Szkodzinski <astralstorm@gorzow.mm.pl> |
---|---|
date | Tue, 21 Feb 2006 15:48:09 -0600 |
parents | 4ba8fe499df2 |
children | e22bbca2e82b |
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 # find decent versions of our utilities, insisting on the GNU versions where we # need to MERGE="merge" DIFF3="gdiff3" DIFF="gdiff" PATCH="gpatch" type "$MERGE" >/dev/null 2>&1 || MERGE= type "$DIFF3" >/dev/null 2>&1 || DIFF3="diff3" $DIFF3 --version >/dev/null 2>&1 || DIFF3= 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= # find optional visual utilities FILEMERGE="/Developer/Applications/Utilities/FileMerge.app/Contents/MacOS/FileMerge" KDIFF3="kdiff3" TKDIFF="tkdiff" type "$FILEMERGE" >/dev/null 2>&1 || FILEMERGE= type "$KDIFF3" >/dev/null 2>&1 || KDIFF3= type "$TKDIFF" >/dev/null 2>&1 || TKDIFF= # random part of names RAND="$RANDOM$RANDOM" # temporary directory for diff+patch merge HGTMP="${TMPDIR-'/tmp'}/hgmerge.$RAND" # backup file BACKUP="$LOCAL.orig.$RAND" # file used to test for file change CHGTEST="$LOCAL.chg.$RAND" # put all your required cleanup here cleanup() { rm -f "$BACKUP" "$CHGTEST" rm -rf "$HGTMP" } # functions concerning program exit success() { cleanup exit 0 } failure() { echo "merge failed" 1>&2 mv "$BACKUP" "$LOCAL" cleanup exit 1 } # Clean up when interrupted trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM # Back up our file (and try hard to keep the mtime unchanged) mv "$LOCAL" "$BACKUP" cp "$BACKUP" "$LOCAL" # Attempt to do a non-interactive merge 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 failure fi fi cp "$BACKUP" "$LOCAL" # on MacOS X try FileMerge.app, shipped with Apple's developer tools if [ -n "$FILEMERGE" ]; then cp "$BACKUP" "$LOCAL" cp "$BACKUP" "$CHGTEST" # filemerge prefers the right by default $FILEMERGE -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" [ $? -ne 0 ] && echo "FileMerge failed to launch" && failure if test "$LOCAL" -nt "$CHGTEST" then success else echo "$LOCAL seems unchanged. Was the merge successful?" select answer in yes no do test "$answer" == "yes" && success || failure done fi failure fi if [ -n "$DISPLAY" ]; then # try using kdiff3, which is fairly nice if [ -n "$KDIFF3" ]; then $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || failure success fi # try using tkdiff, which is a bit less sophisticated if [ -n "$TKDIFF" ]; then $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure success fi fi # Attempt to do a merge with $EDITOR if [ -n "$MERGE" ]; then echo "conflicts detected in $LOCAL" $MERGE "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" success fi if [ -n "$DIFF3" ]; then echo "conflicts detected in $LOCAL" $DIFF3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" || { case $? in 1) $EDITOR "$LOCAL" ;; 2) echo "$DIFF3 failed! Exiting." 1>&2 cp "$BACKUP" "$LOCAL" failure ;; esac success } fi # attempt to manually merge with diff and patch if [ -n "$DIFF" -a -n "$PATCH" ]; then (umask 077 && mkdir "$HGTMP") || { echo "Could not create temporary directory $HGTMP" 1>&2 failure } $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : if $PATCH "$LOCAL" < "$HGTMP/diff"; then success else # If rejects are empty after using the editor, merge was ok $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || success fi failure fi echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" failure