contrib/editmerge
author Peter Arrenbrecht <peter@arrenbrecht.ch>
Mon, 11 May 2020 08:13:40 +0200
branchstable
changeset 44820 f71c8eea7161
parent 26804 612502900a2d
permissions -rwxr-xr-x
bash_completion: do not use aliased hg if it sources a script (issue6308) I have an alias that sources a script around hg. Mercurial's bash_completion script tries to use this as its main hg binary. But sourcing a wrapper breaks Bash's completion. So this patch disables using the alias as the hg binary if it starts with "source ". Alias resolution was introduced in rev 191ab08e7099 for users with "alias hg='hg --some_opts'". See https://www.mercurial-scm.org/repo/hg/rev/191ab08e7099

#!/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 https://mercurial-scm.org/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