diff --git a/hgmerge b/hgmerge --- a/hgmerge +++ b/hgmerge @@ -37,20 +37,45 @@ type $FILEMERGE >/dev/null 2>&1 || FILEM type $KDIFF3 >/dev/null 2>&1 || KDIFF3= type $TKDIFF >/dev/null 2>&1 || TKDIFF= +# temporary directory for diff+patch merge +HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" + +# put all your required cleanup here +cleanup() { + rm -f "$LOCAL.orig" + rm -rf "$HGTMP" +} + +# functions concerning program exit +success() { + cleanup + exit 0 +} + +failure() { + echo "merge failed" 1>&2 + cp "$LOCAL.orig" "$LOCAL" + cleanup + exit 1 +} + +# Clean up when interrupted +trap "failure" 1 2 3 6 15 # HUP INT QUIT ABRT TERM + # Back up our file cp "$LOCAL" "$LOCAL.orig" # Attempt to do a non-interactive merge if [ -n "$MERGE" ]; then - $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && exit 0 + $MERGE "$LOCAL" "$BASE" "$OTHER" 2> /dev/null && success cp "$LOCAL.orig" "$LOCAL" elif [ -n "$DIFF3" ]; then echo $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" - $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && exit 0 + $DIFF3 -m "$LOCAL.orig" "$BASE" "$OTHER" > "$LOCAL" && success if [ $? -eq 2 ]; then echo "$DIFF3 failed! Exiting." 1>&2 cp "$LOCAL.orig" "$LOCAL" - exit 1 + failure fi cp "$LOCAL.orig" "$LOCAL" fi @@ -65,12 +90,12 @@ if [ -n "$FILEMERGE" ]; then if ! "$FILEMERGE" -left "$OTHER" -right "$LOCAL" -ancestor "$BASE" -merge "$LOCAL" then echo "FileMerge failed to launch" - exit 1 + failure fi if ! test "$LOCAL" -ef "$LOCAL.link" then rm "$LOCAL.orig" "$LOCAL.link" - exit 0 + success else rm "$LOCAL.link" echo "$LOCAL is unchanged. Was the merge successful?" @@ -79,26 +104,26 @@ if [ -n "$FILEMERGE" ]; then if test "$answer" == "yes" then rm "$LOCAL.orig" - exit 0 + success else - exit 1 + failure fi done - exit 1 + failure fi fi if [ -n "$DISPLAY" ]; then # try using kdiff3, which is fairly nice if [ -n "$KDIFF3" ]; then - $KDIFF3 --auto "$BASE" "$LOCAL" "$OTHER" -o "$LOCAL" || exit 1 - exit 0 + $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" || exit 1 - exit 0 + $TKDIFF "$LOCAL" "$OTHER" -a "$BASE" -o "$LOCAL" || failure + success fi fi @@ -106,7 +131,7 @@ fi if [ -n "$MERGE" ]; then echo "conflicts detected in $LOCAL" $MERGE "$LOCAL" "$BASE" "$OTHER" 2>/dev/null || $EDITOR "$LOCAL" - exit 0 + success fi if [ -n "$DIFF3" ]; then @@ -117,38 +142,29 @@ if [ -n "$DIFF3" ]; then $EDITOR "$LOCAL" ;; 2) echo "$DIFF3 failed! Exiting." 1>&2 cp "$LOCAL.orig" "$LOCAL" - exit 1 ;; + failure ;; esac - exit 0 + success } fi -HGTMP="" -cleanup_exit() { - rm -rf "$HGTMP" -} - # attempt to manually merge with diff and patch if [ -n "$DIFF" -a -n "$PATCH" ]; then - # Remove temporary files even if we get interrupted - trap "cleanup_exit" 0 # normal exit - trap "exit 1" 1 2 3 6 15 # HUP INT QUIT ABRT TERM - HGTMP="${TMPDIR-/tmp}/hgmerge.$RANDOM.$RANDOM.$RANDOM.$$" (umask 077 && mkdir "$HGTMP") || { - echo "Could not create temporary directory! Exiting." 1>&2 - exit 1 + echo "Could not create temporary directory $HGTMP" 1>&2 + failure } $DIFF -u "$BASE" "$OTHER" > "$HGTMP/diff" || : if $PATCH "$LOCAL" < "$HGTMP/diff"; then - exit 0 + success else # If rejects are empty after using the editor, merge was ok - $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || exit 0 + $EDITOR "$LOCAL" "$LOCAL.rej" && test -s "$LOCAL.rej" || success fi - exit 1 + failure fi echo "hgmerge: unable to find merge, tkdiff, kdiff3, or diff+patch!" -exit 1 +failure