hgeditor
author Patrick Mezard <pmezard@gmail.com>
Thu, 19 Aug 2010 22:51:09 +0200
branchstable
changeset 11991 50523b4407f6
parent 11266 2b440bb8a66b
child 26781 1aee2ab0f902
permissions -rwxr-xr-x
win32: correctly break hardlinks on network drives (issue761) win32.nlinks() was often returning 1 instead of the correct hardlinks count when reading from network drives. This made commit or push to a repository on a network share to fail breaking the hardlinks in the datastore, possibly causing integrity errors in repositories linked locally on the remote side. Here is what the MSDN says about GetFileInformationByHandle(): Depending on the underlying network features of the operating system and the type of server connected to, the GetFileInformationByHandle function may fail, return partial information, or full information for the given file. In practice, we never got the correct hardlinks count when reading from and to many combinations of Window XP, 2003, Vista and 7, via network drives or RDP shares. It always returned 1 instead. The only setup returning an accurate links count was a samba on Debian. To avoid this, Mercurial now breaks the hardlinks unconditionally when writing to a network drive.

#!/bin/sh
#
# This is an example of using HGEDITOR to create of diff to review the
# changes while commiting.

# If you want to pass your favourite editor some other parameters
# only for Mercurial, modify this:
case "${EDITOR}" in
    "")
        EDITOR="vi"
        ;;
    emacs)
        EDITOR="$EDITOR -nw"
        ;;
    gvim|vim)
        EDITOR="$EDITOR -f -o"
        ;;
esac


HGTMP=""
cleanup_exit() {
    rm -rf "$HGTMP"
}

# Remove temporary files even if we get interrupted
trap "cleanup_exit" 0 # normal exit
trap "exit 255" HUP INT QUIT ABRT TERM

HGTMP=$(mktemp -d ${TMPDIR-/tmp}/hgeditor.XXXXXX)
[ x$HGTMP != x -a -d $HGTMP ] || {
  echo "Could not create temporary directory! Exiting." 1>&2
  exit 1
}

(
    grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
        "$HG" diff "$changed" >> "$HGTMP/diff"
    done
)

cat "$1" > "$HGTMP/msg"

MD5=$(which md5sum 2>/dev/null) || \
    MD5=$(which md5 2>/dev/null)
[ -x "${MD5}" ] && CHECKSUM=`${MD5} "$HGTMP/msg"`
if [ -s "$HGTMP/diff" ]; then
    $EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $?
else
    $EDITOR "$HGTMP/msg" || exit $?
fi
[ -x "${MD5}" ] && (echo "$CHECKSUM" | ${MD5} -c >/dev/null 2>&1 && exit 13)

mv "$HGTMP/msg" "$1"

exit $?