This new script (contrib/giteditor/giteditor) is an example GIT_EDITOR that causes the editor to open the commit message as well as a "git diff --cached" in a separate window. This behavior differs from "git commit -v" in that the diff can be browsed independently of the commit message without having to invoke a split window view in an editor. This script also detects when "stg edit" is being called and uses "stg show" instead. Hence, it implements a kind of "stg show -v". This script is highly influenced by the "hgeditor" script distributed with the Mercurial SCM. It could be improved by supporting a command-line flag that would mimic the "git commit -v"-type behavior of opening the diff in the same window as the commit message. This would extend existing commands like "stg edit" that do not already have a "-v"-type option. Signed-off-by: Ted Pavlic <ted@xxxxxxxxxxxxx> --- This version attempts to answer the concerns brought up by Johannes Schindlin. contrib/giteditor/giteditor | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 68 insertions(+), 0 deletions(-) create mode 100755 contrib/giteditor/giteditor diff --git a/contrib/giteditor/giteditor b/contrib/giteditor/giteditor new file mode 100755 index 0000000..501a11c --- /dev/null +++ b/contrib/giteditor/giteditor @@ -0,0 +1,68 @@ +#!/bin/sh +# +# Set GIT_EDITOR (or core.editor) to this script to see a diff alongside +# commit message. This script differs from "git commit -v" in that the +# diff shows up in a separate buffer. Additionally, this script works +# with "stg edit" as well. +# +# Copyright (c) 2009 by Theodore P. Pavlic <ted@xxxxxxxxxxxxx> +# Highly influenced by hgeditor script distributed with Mercurial SCM. +# Distributed under the GNU General Public License, version 2.0. + +# Find git +test -z "${GIT}" && GIT="git" + +# Find stg +test -z "${STG}" && STG="stg" + +# Use an editor. To prevent loops, avoid GIT_EDITOR and core.editor. +EDITOR=${GIT_EDITOR_EDITOR-${VISUAL-${EDITOR-vi}}} + +# If we recognize a popular editor, add necessary flags (e.g., to +# prevent forking) +case "${EDITOR}" in + emacs) + EDITOR="${EDITOR} -nw" + ;; + mvim|gvim|vim|vi) + EDITOR="${EDITOR} -f -o" + ;; +esac + +# Remove temporary files even if we get interrupted +DIFFOUTPUT="giteditor.${RANDOM}.${RANDOM}.${RANDOM}.$$.diff" +cleanup_exit() { + rm -f "${DIFFOUTPUT}" +} +trap "cleanup_exit" 0 # normal exit +trap "exit 255" 1 2 3 6 15 # HUP INT QUIT ABRT TERM + +# For git, COMMITMSG=COMMIT_EDITMSG +# For stg, COMMITMSG=.stgit-edit.txt +# etc. +COMMITMSG=$(basename "$1") +case "${COMMITMSG}" in + .stgit-edit.txt) # From "stg edit" + DIFFCMD="${STG}" + DIFFARGS="show" + ;; + *) # Fall through to "git commit" case + DIFFCMD="${GIT}" + DIFFARGS="diff --cached" + # To focus on files that changed, use: + #DIFFARGS="diff --cached --diff-filter=M" + ;; +esac + +"${DIFFCMD}" ${DIFFARGS} > ${DIFFOUTPUT} + +if test -s "${DIFFOUTPUT}"; then + # Diff is non-empty, so edit msg and diff + ${EDITOR} "$1" "${DIFFOUTPUT}" || exit $? +else + # Empty diff. Only edit msg + ${EDITOR} "$1" || exit $? +fi + +# (recall that DIFFOUTPUT file gets cleaned up by trap above) +exit -- 1.6.1.213.g28da8 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html