2014-03-26 14:59:13 +04:00
|
|
|
#!/usr/bin/env bash
|
2013-11-16 01:20:49 +04:00
|
|
|
# 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
|