contrib/editmerge
author Matt Harbison <matt_harbison@yahoo.com>
Fri, 28 Nov 2014 21:03:44 -0500
changeset 23766 ce0731e58ac9
parent 20831 864c56cb8945
child 26421 4b0fc75f9403
permissions -rwxr-xr-x
largefiles: align the output messages for a removed file with core methods Both cmdutil.remove() and scmutil.addremove() require verbose mode or an inexact match to print the filename. Core addremove also prints the file relative to cwd only if patterns are provided to the command. And finally, both methods print the subrepo prefix when needed.

#!/usr/bin/env bash
# A simple script for opening merge conflicts in the editor.
# Use the following Mercurial settings to enable it.
#
# [ui]
# merge = editmerge
#
# [merge-tools]
# editmerge.args=$output
# editmerge.check=changed
# editmerge.premerge=keep

FILE=$1

getlines() {
  grep -n "<<<<<<" $FILE | cut -f1 -d:
}

# editor preference loosely based on http://mercurial.selenic.com/wiki/editor
# hg showconfig is at the bottom though, since it's slow to run (0.15 seconds)
ED=$HGEDITOR
if [ "$ED" = "" ] ; then
  ED=$VISUAL
fi
if [ "$ED" = "" ] ; then
  ED=$EDITOR
fi
if [ "$ED" = "" ] ; then
  ED=$(hg showconfig ui.editor)
fi
if [ "$ED" = "" ] ; then
  echo "merge failed - unable to find editor"
  exit 1
fi

if [ "$ED" = "emacs" ] || [ "$ED" = "nano" ] || [ "$ED" = "vim" ] ; then
  FIRSTLINE=$(getlines | head -n 1)
  PREVIOUSLINE=""

  # open the editor to the first conflict until there are no more
  # or the user stops editing the file
  while [ ! "$FIRSTLINE" = "" ] && [ ! "$FIRSTLINE" = "$PREVIOUSLINE" ] ; do
    $ED +$FIRSTLINE $FILE
    PREVIOUSLINE=$FIRSTLINE
    FIRSTLINE=$(getlines | head -n 1)
  done
else
  $ED $FILE
fi

# get the line numbers of the remaining conflicts
CONFLICTS=$(getlines | sed ':a;N;$!ba;s/\n/, /g')
if [ ! "$CONFLICTS" = "" ] ; then
  echo "merge failed - resolve the conflicts (line $CONFLICTS) then use 'hg resolve --mark'"
  exit 1
fi

exit 0