Differences between revisions 1 and 11 (spanning 10 versions)
Revision 1 as of 2005-08-26 00:58:13
Size: 2269
Editor: waste
Comment:
Revision 11 as of 2008-03-27 20:30:35
Size: 2099
Comment: Stop emacs-merge from removing the .orig file; as of 1.0 this breaks "hg merge"
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
[http://www.gnu.org/software/emacs/ Emacs] is bundled with an elisp program called Ediff which purpose is to help developers to visually apply patches. One of the various ediff commands is well suited to three way merging and can be used as a merger program with ["Mercurial"]. [http://www.gnu.org/software/emacs/ Emacs] is bundled with an elisp program called Ediff which purpose is to help developers to visually apply patches. One of the various ediff commands is well suited to three way merging and can be used as a [:MergeProgram:merger program] with ["Mercurial"].
Line 13: Line 13:
   LOCAL=$1
   BASE=$2
   OTHER=$3
}}}
   LOCAL="$1"
   BASE="$2"
   OTHER="$3"
Line 18: Line 17:
{{{
BACKUP=$LOCAL.orig
   BACKUP="$LOCAL.orig"
Line 21: Line 19:
   Rm ()
   {
       if [ -f $BACKUP ]; then
           rm -f $BACKUP
       else
           :
       fi
   }
}}}

{{{
Line 34: Line 21:
       cp $BACKUP $LOCAL        cp "$BACKUP" "$LOCAL"
Line 36: Line 23:
}}}
Line 38: Line 24:
{{{
Line 41: Line 26:
       Rm
       E
xit $?
       exit $?
Line 44: Line 28:
}}}
Line 46: Line 29:
{{{
Line 48: Line 30:
   cp $LOCAL $BACKUP
}}}
   cp "$LOCAL" "$BACKUP"
Line 51: Line 32:
{{{
Line 54: Line 34:
       if merge $LOCAL $BASE $OTHER 2> /dev/null; then        if merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null; then
Line 60: Line 40:
       if diff3 -m $BACKUP $BASE $OTHER > $LOCAL ; then        if diff3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" ; then
Line 66: Line 46:
}}}
Line 68: Line 47:
{{{
Line 73: Line 51:
}}}
Line 75: Line 52:
{{{
Line 78: Line 54:
}}}
Line 80: Line 55:
{{{
Line 83: Line 57:

Using Emacs as a merger program

[http://www.gnu.org/software/emacs/ Emacs] is bundled with an elisp program called Ediff which purpose is to help developers to visually apply patches. One of the various ediff commands is well suited to three way merging and can be used as a [:MergeProgram:merger program] with ["Mercurial"].

Wrapping Emacs+Ediff call in a script

So to use [http://www.gnu.org/software/emacs/ Emacs] as ["Mercurial"] merger program, dump the following content into a file in your PATH (don't forget to turn on the execute bit):

   #!/bin/sh
   
   set -e # bail out quickly on failure
   
   LOCAL="$1"
   BASE="$2"
   OTHER="$3"

   BACKUP="$LOCAL.orig"
   
   Restore ()
   {
       cp "$BACKUP" "$LOCAL" 
   }

   ExitOK ()
   {
       exit $?
   }

   # Back up our file
   cp "$LOCAL" "$BACKUP"

   # Attempt to do a non-interactive merge
   if which merge > /dev/null 2>&1 ; then
       if merge "$LOCAL" "$BASE" "$OTHER" 2> /dev/null; then
           # success!
           ExitOK 
       fi
       Restore
   elif which diff3 > /dev/null 2>&1 ; then
       if diff3 -m "$BACKUP" "$BASE" "$OTHER" > "$LOCAL" ; then
           # success
           ExitOK
       fi
       Restore
   fi

   if emacs -q --no-site-file --eval "(ediff-merge-with-ancestor \"$BACKUP\" \"$OTHER\" \"$BASE\" nil \"$LOCAL\")" 
   then       
       ExitOK
   fi

   echo "emacs-merge: failed to merge files"
   exit 1

   # End of file

How the script works

This script tries first to automatically merge the files using the RCS merge program or the diff3 program. If the automatic merger fails merging the files because of a conflict or, neither merge nor diff3 are available on the system, then emacs is launched to let the developer resolve the conflicts.

Enabling the script usage

Don't forget to add an entry in your hgrc file (either ~/.hgrc or the local working copy .hg/hgrc) to point ["Mercurial"] at your merge command (let's call it emacs-merge)

MergingWithEmacs (last edited 2015-08-18 22:49:33 by mpm)