hgeditor
author Bryan O'Sullivan <bos@serpentine.com>
Sun, 18 Sep 2005 15:03:07 -0700
changeset 1276 25e5b1086624
parent 1009 1bc619b12025
child 1599 f93fde8f5027
permissions -rwxr-xr-x
Fix dirstate.changes for ignored directories. Do a second walking pass to examine any leftover files in the dirstate map that are in the .hgignore file but match our search criteria. This fixes the case of entire directories never being examined due to their presence in the .hgignore file, and should hopefully not add any significant overhead.

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

# 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" 1 2 3 6 15 # HUP INT QUIT ABRT TERM

HGTMP="${TMPDIR-/tmp}/hgeditor.$RANDOM.$RANDOM.$RANDOM.$$"
(umask 077 && mkdir "$HGTMP") || {
    echo "Could not create temporary directory! Exiting." 1>&2
    exit 1
}

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

echo > "$HGTMP/msg"
if [ "$SIGN" == "1" ]; then
    MANIFEST=`grep '^HG: manifest hash' "$1" | cut -b 19-`
    echo -e "\nmanifest hash: $MANIFEST" >> "$HGTMP/msg"
fi
grep -vE '^(HG: manifest hash .*)?$' "$1" >> "$HGTMP/msg"

CHECKSUM=`md5sum "$HGTMP/msg"`
if [ -s "$HGTMP/diff" ]; then
    $EDITOR "$HGTMP/msg" "$HGTMP/diff" || exit $?
else
    $EDITOR "$HGTMP/msg" || exit $?
fi
echo "$CHECKSUM" | md5sum -c >/dev/null 2>&1 && exit 13

if [ "$SIGN" == "1" ]; then
    {
        head -n 1 "$HGTMP/msg"
        echo
        grep -v "^HG:" "$HGTMP/msg" | gpg -t -a -u "${HGUSER}" --clearsign
    } > "$HGTMP/msg.gpg" && mv "$HGTMP/msg.gpg" "$1"
else
    mv "$HGTMP/msg" "$1"
fi

exit $?