hgeditor
author Bryan O'Sullivan <bos@serpentine.com>
Tue, 19 Jul 2005 07:15:59 -0800
changeset 726 809a870a0e73
parent 684 4ccf3de52989
child 754 3e73bf876f17
permissions -rwxr-xr-x
Add a source designator to the walk methods. If the source is 'f' (the filesystem), the file definitely exists in the filesystem. If 'm' (a rev or dirstate manifest), the file may not still exist with the given name.

#!/bin/sh
#
# This is an example of using HGEDITOR to automate the signing of
# commits and so on.

# change this to one to turn on GPG support
SIGN=0

T1=""; T2=""
cleanup_exit() {
    rm -f "$T1" "$T2"
    exit $1
}

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

if grep -q "^HG: merge resolve" "$1" ; then
    # we don't sign merges
    exec $EDITOR "$1"
else
    # Remove temporary files even if we get interrupted
    trap "cleanup_exit 255" TERM KILL INT QUIT ABRT
    T1=`mktemp`; T2=`mktemp`
    MANIFEST=`grep '^HG: manifest hash' "$1" | cut -b 19-`

    echo -e "\n\nmanifest hash: $MANIFEST" >> "$T1"
    grep -vE '^(HG: manifest hash .*)?$' "$1" >> "$T1"
    (
        cd "`hg root`"
        grep '^HG: changed' "$1" | cut -b 13- | while read changed; do
            hg diff "$changed" >> "$T2"
        done
    )

    CHECKSUM=`md5sum "$T1"`
    $EDITOR "$T1" "$T2" || cleanup_exit $?

    if [ "$SIGN" == "1" ] ; then
	echo "$CHECKSUM" | md5sum -c 2>/dev/null && cleanup_exit 13
	{
	    head -n 1 "$T1"
	    echo
	    grep -v "^HG:" "$T1" | gpg -t -a -u "${HGUSER}" --clearsign
	} > "$T2" && mv "$T2" "$1"
    else
	mv "$T1" "$1"
    fi
    cleanup_exit $?
fi