contrib/editmerge
changeset 20010 34d720b3b33e
child 20831 864c56cb8945
equal deleted inserted replaced
20008:e54a078153f7 20010:34d720b3b33e
       
     1 #!/bin/bash
       
     2 # A simple script for opening merge conflicts in the editor.
       
     3 # Use the following Mercurial settings to enable it.
       
     4 #
       
     5 # [ui]
       
     6 # merge = editmerge
       
     7 #
       
     8 # [merge-tools]
       
     9 # editmerge.args=$output
       
    10 # editmerge.check=changed
       
    11 # editmerge.premerge=keep
       
    12 
       
    13 FILE=$1
       
    14 
       
    15 getlines() {
       
    16   grep -n "<<<<<<" $FILE | cut -f1 -d:
       
    17 }
       
    18 
       
    19 # editor preference loosely based on http://mercurial.selenic.com/wiki/editor
       
    20 # hg showconfig is at the bottom though, since it's slow to run (0.15 seconds)
       
    21 ED=$HGEDITOR
       
    22 if [ "$ED" = "" ] ; then
       
    23   ED=$VISUAL
       
    24 fi
       
    25 if [ "$ED" = "" ] ; then
       
    26   ED=$EDITOR
       
    27 fi
       
    28 if [ "$ED" = "" ] ; then
       
    29   ED=$(hg showconfig ui.editor)
       
    30 fi
       
    31 if [ "$ED" = "" ] ; then
       
    32   echo "merge failed - unable to find editor"
       
    33   exit 1
       
    34 fi
       
    35 
       
    36 if [ "$ED" = "emacs" ] || [ "$ED" = "nano" ] || [ "$ED" = "vim" ] ; then
       
    37   FIRSTLINE=$(getlines | head -n 1)
       
    38   PREVIOUSLINE=""
       
    39 
       
    40   # open the editor to the first conflict until there are no more
       
    41   # or the user stops editing the file
       
    42   while [ ! "$FIRSTLINE" = "" ] && [ ! "$FIRSTLINE" = "$PREVIOUSLINE" ] ; do
       
    43     $ED +$FIRSTLINE $FILE
       
    44     PREVIOUSLINE=$FIRSTLINE
       
    45     FIRSTLINE=$(getlines | head -n 1)
       
    46   done
       
    47 else
       
    48   $ED $FILE
       
    49 fi
       
    50 
       
    51 # get the line numbers of the remaining conflicts
       
    52 CONFLICTS=$(getlines | sed ':a;N;$!ba;s/\n/, /g')
       
    53 if [ ! "$CONFLICTS" = "" ] ; then
       
    54   echo "merge failed - resolve the conflicts (line $CONFLICTS) then use 'hg resolve --mark'"
       
    55   exit 1
       
    56 fi
       
    57 
       
    58 exit 0