contrib/editmerge
author Simon Heimberg <simohe@besonet.ch>
Sat, 08 Feb 2014 14:35:07 +0100
changeset 20425 ca6aa8362f33
parent 20010 34d720b3b33e
child 20831 864c56cb8945
permissions -rwxr-xr-x
win32: spawndetached returns pid of detached process and not of cmd.exe win32.spawndetached starts the detached process by `cmd.exe` (or COMSPEC). The pid it returned was the one of cmd.exe and not the one of the detached process. When this pid is used to kill the process, the detached process is not killed, but only cmd.exe. With this patch the pid of the detached process is written to the pid file. Killing the process works as expected. The pid is only evaluated on writing the pid file. It is unnecessary to search the pid when it is not needed. And more important, it probably does not yet exist right after the cmd.exe process was started. When the pid is written to the file, waiting for the start of the detached process has already happened. Use this functionality instead of writing a 2nd wait function. Many tests on windows will not fail anymore, all those with the first failing line "abort: child process failed to start". (The processes still hanging around from previous test runs have to be killed first. They still block a tcp port.) A good test for the functionality of this patch is test-treediscovery.t, because it starts and kills `hg serve -d` several times.

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