#!/bin/sh setvar USAGE = ""(edit [-F | -m ] | show) [commit]"" source git-sh-setup test -z $1 && usage setvar ACTION = "$1"; shift test -z $GIT_NOTES_REF && setvar GIT_NOTES_REF = "$(git config core.notesref)" test -z $GIT_NOTES_REF && setvar GIT_NOTES_REF = ""refs/notes/commits"" setvar MESSAGE = '' while test $# != 0 { case (1) { -m { test $ACTION = "edit" || usage shift if test "$Argc" = "0" { die "error: option -m needs an argument" } else { if test -z $MESSAGE { setvar MESSAGE = "$1" } else { setvar MESSAGE = ""$MESSAGE $1"" } shift } } -F { test $ACTION = "edit" || usage shift if test "$Argc" = "0" { die "error: option -F needs an argument" } else { if test -z $MESSAGE { setvar MESSAGE = "$(cat "$1")" } else { setvar MESSAGE = ""$MESSAGE $(cat "$1")"" } shift } } -* { usage } * { break } } } setvar COMMIT = $(git rev-parse --verify --default HEAD "$@") || die "Invalid commit: $[join(ARGV)]" case (ACTION) { edit { if test ${GIT_NOTES_REF#refs/notes/} = $GIT_NOTES_REF { die "Refusing to edit notes in $GIT_NOTES_REF (outside of refs/notes/)" } setvar MSG_FILE = ""$GIT_DIR/new-notes-$COMMIT"" setvar GIT_INDEX_FILE = ""$MSG_FILE.idx"" export GIT_INDEX_FILE trap ' test -f "$MSG_FILE" && rm "$MSG_FILE" test -f "$GIT_INDEX_FILE" && rm "$GIT_INDEX_FILE" ' 0 setvar CURRENT_HEAD = $(git show-ref "$GIT_NOTES_REF" | cut -f 1 -d ' ') if test -z $CURRENT_HEAD { setvar PARENT = '' } else { setvar PARENT = ""-p $CURRENT_HEAD"" git read-tree $GIT_NOTES_REF || die "Could not read index" } if test -z $MESSAGE {'' GIT_NOTES_REF= git log -1 $COMMIT | sed "s/^/#/" > "$MSG_FILE" if test ! -z $CURRENT_HEAD { git cat-file blob :$COMMIT >> "$MSG_FILE" 2> /dev/null } setvar core_editor = "$(git config core.editor)" ${GIT_EDITOR:-${core_editor:-${VISUAL:-${EDITOR:-vi}}}} $MSG_FILE } else { echo $MESSAGE > "$MSG_FILE" } grep -v ^# < "$MSG_FILE" | git stripspace > "$MSG_FILE".processed mv "$MSG_FILE".processed $MSG_FILE if test -s $MSG_FILE { setvar BLOB = $(git hash-object -w "$MSG_FILE") || die "Could not write into object database" git update-index --add --cacheinfo 0644 $BLOB $COMMIT || die "Could not write index" } else { test -z $CURRENT_HEAD && die "Will not initialise with empty tree" git update-index --force-remove $COMMIT || die "Could not update index" } setvar TREE = $(git write-tree) || die "Could not write tree" setvar NEW_HEAD = $(echo Annotate $COMMIT | git commit-tree $TREE $PARENT) || die "Could not annotate" git update-ref -m "Annotate $COMMIT" \ $GIT_NOTES_REF $NEW_HEAD $CURRENT_HEAD } show { git rev-parse -q --verify "$GIT_NOTES_REF":$COMMIT > /dev/null || die "No note for commit $COMMIT." git show "$GIT_NOTES_REF":$COMMIT } * { usage } }