contrib/editmerge
author Durham Goode <durham@fb.com>
Wed, 17 Aug 2016 13:25:13 -0700
changeset 29837 93b44aa17691
parent 26804 612502900a2d
permissions -rwxr-xr-x
manifest: use property instead of field for manifest revlog storage The file caches we're using to avoid reloading the manifest from disk everytime has an annoying bug that causes the in memory structure to not be reloaded if the mtime and the size haven't changed. This causes a breakage in the tests because the manifestlog is not being reloaded after a commit+strip operation in mq (the mtime is the same because it all happens in the same second, and the resulting size is the same because we add 1 and remove 1). The only reason this doesn't affect the manifest itself is because we touch it so often that we had already reloaded it after the commit, but before the strip. Once the entire manifest has migrated to manifestlog, we can get rid of these properties, since then the manifestlog will be touched after the commit, but before the strip, as well.

#!/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