Add GIT_EDITOR environment and core.editor configuration variables
authorAdam Roben <aroben@apple.com>
Fri, 20 Jul 2007 05:09:35 +0000 (22:09 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 20 Jul 2007 07:46:34 +0000 (00:46 -0700)
These variables let you specify an editor that will be launched in
preference to the EDITOR and VISUAL environment variables. The order
of preference is GIT_EDITOR, core.editor, EDITOR, VISUAL.

[jc: added a test and config variable documentation]

Signed-off-by: Adam Roben <aroben@apple.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
Documentation/git-commit.txt
Documentation/git-send-email.txt
git-am.sh
git-commit.sh
git-rebase--interactive.sh
git-send-email.perl
git-sh-setup.sh
git-tag.sh
t/t7005-editor.sh [new file with mode: 0755]

index d0e9a17..a850d55 100644 (file)
@@ -281,6 +281,14 @@ core.excludesfile::
        of files which are not meant to be tracked.  See
        gitlink:gitignore[5].
 
+core.editor::
+       Commands such as `commit` and `tag` that lets you edit
+       messages by lauching an editor uses the value of this
+       variable when it is set, and the environment variable
+       `GIT_EDITOR` is not set.  The order of preference is
+       `GIT_EDITOR` environment, `core.editor`, `EDITOR` and
+       `VISUAL` environment variables and then finally `vi`.
+
 core.pager::
        The command that git will use to paginate output.  Can be overridden
        with the `GIT_PAGER` environment variable.
index f96142f..8e0e7e2 100644 (file)
@@ -244,10 +244,12 @@ on the Subject: line and the rest of the commit in the body.
 
 include::i18n.txt[]
 
-ENVIRONMENT VARIABLES
----------------------
-The command specified by either the VISUAL or EDITOR environment
-variables is used to edit the commit log message.
+ENVIRONMENT AND CONFIGURATION VARIABLES
+---------------------------------------
+The editor used to edit the commit log message will be chosen from the
+GIT_EDITOR environment variable, the core.editor configuration variable, the
+VISUAL environment variable, or the EDITOR environment variable (in that
+order).
 
 HOOKS
 -----
index 293686c..d243ed1 100644 (file)
@@ -44,8 +44,8 @@ The --cc option must be repeated for each user you want on the cc list.
        value; if that is unspecified, default to --chain-reply-to.
 
 --compose::
-       Use $EDITOR to edit an introductory message for the
-       patch series.
+       Use $GIT_EDITOR, core.editor, $VISUAL, or $EDITOR to edit an
+       introductory message for the patch series.
 
 --from::
        Specify the sender of the emails.  This will default to
index e5e6f2c..bfd65dc 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -364,7 +364,7 @@ do
                [yY]*) action=yes ;;
                [aA]*) action=yes interactive= ;;
                [nN]*) action=skip ;;
-               [eE]*) "${VISUAL:-${EDITOR:-vi}}" "$dotest/final-commit"
+               [eE]*) git_editor "$dotest/final-commit"
                       action=again ;;
                [vV]*) action=again
                       LESS=-S ${PAGER:-less} "$dotest/patch" ;;
index 3f3de17..92749df 100755 (executable)
@@ -544,18 +544,9 @@ fi
 
 case "$no_edit" in
 '')
-       case "${VISUAL:-$EDITOR},$TERM" in
-       ,dumb)
-               echo >&2 "Terminal is dumb but no VISUAL nor EDITOR defined."
-               echo >&2 "Please supply the commit log message using either"
-               echo >&2 "-m or -F option.  A boilerplate log message has"
-               echo >&2 "been prepared in $GIT_DIR/COMMIT_EDITMSG"
-               exit 1
-               ;;
-       esac
        git-var GIT_AUTHOR_IDENT > /dev/null  || die
        git-var GIT_COMMITTER_IDENT > /dev/null  || die
-       ${VISUAL:-${EDITOR:-vi}} "$GIT_DIR/COMMIT_EDITMSG"
+       git_editor "$GIT_DIR/COMMIT_EDITMSG"
        ;;
 esac
 
index f395076..a2d4d09 100755 (executable)
@@ -414,7 +414,7 @@ EOF
                        die_abort "Nothing to do"
 
                cp "$TODO" "$TODO".backup
-               ${VISUAL:-${EDITOR:-vi}} "$TODO" ||
+               git_editor "$TODO" ||
                        die "Could not execute editor"
 
                test -z "$(grep -ve '^$' -e '^#' < $TODO)" &&
index 7552cac..a09b1c9 100755 (executable)
@@ -49,8 +49,8 @@ Options:
    --bcc          Specify a list of email addresses that should be Bcc:
                  on all the emails.
 
-   --compose      Use \$EDITOR to edit an introductory message for the
-                  patch series.
+   --compose      Use \$GIT_EDITOR, core.editor, \$EDITOR, or \$VISUAL to edit
+                 an introductory message for the patch series.
 
    --subject      Specify the initial "Subject:" line.
                   Only necessary if --compose is also set.  If --compose
@@ -341,8 +341,7 @@ GIT: for the patch you are writing.
 EOT
        close(C);
 
-       my $editor = $ENV{EDITOR};
-       $editor = 'vi' unless defined $editor;
+       my $editor = $ENV{GIT_EDITOR} || $repo->config("core.editor") || $ENV{VISUAL} || $ENV{EDITOR} || "vi";
        system($editor, $compose_filename);
 
        open(C2,">",$compose_filename . ".final")
index 4ed07e9..c51985e 100755 (executable)
@@ -28,6 +28,21 @@ set_reflog_action() {
        fi
 }
 
+git_editor() {
+       GIT_EDITOR=${GIT_EDITOR:-$(git config core.editor || echo ${VISUAL:-${EDITOR}})}
+       case "$GIT_EDITOR,$TERM" in
+       ,dumb)
+               echo >&2 "No editor specified in GIT_EDITOR, core.editor, VISUAL,"
+               echo >&2 "or EDITOR. Tried to fall back to vi but terminal is dumb."
+               echo >&2 "Please set one of these variables to an appropriate"
+               echo >&2 "editor or run $0 with options that will not cause an"
+               echo >&2 "editor to be invoked (e.g., -m or -F for git-commit)."
+               exit 1
+               ;;
+       esac
+       "${GIT_EDITOR:-vi}" "$1"
+}
+
 is_bare_repository () {
        git rev-parse --is-bare-repository
 }
index 1c25d88..5ee3f50 100755 (executable)
@@ -177,7 +177,7 @@ if [ "$annotate" ]; then
         ( echo "#"
           echo "# Write a tag message"
           echo "#" ) > "$GIT_DIR"/TAG_EDITMSG
-        ${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit
+        git_editor "$GIT_DIR"/TAG_EDITMSG || exit
     else
         printf '%s\n' "$message" >"$GIT_DIR"/TAG_EDITMSG
     fi
diff --git a/t/t7005-editor.sh b/t/t7005-editor.sh
new file mode 100755 (executable)
index 0000000..28643b0
--- /dev/null
@@ -0,0 +1,91 @@
+#!/bin/sh
+
+test_description='GIT_EDITOR, core.editor, and stuff'
+
+. ./test-lib.sh
+
+for i in GIT_EDITOR core_editor EDITOR VISUAL vi
+do
+       cat >e-$i.sh <<-EOF
+       echo "Edited by $i" >"\$1"
+       EOF
+       chmod +x e-$i.sh
+done
+unset vi
+mv e-vi.sh vi
+PATH=".:$PATH"
+unset EDITOR VISUAL GIT_EDITOR
+
+test_expect_success setup '
+
+       msg="Hand edited" &&
+       echo "$msg" >expect &&
+       git add vi &&
+       test_tick &&
+       git commit -m "$msg" &&
+       git show -s --pretty=oneline |
+       sed -e "s/^[0-9a-f]* //" >actual &&
+       diff actual expect
+
+'
+
+TERM=dumb
+export TERM
+test_expect_success 'dumb should error out when falling back on vi' '
+
+       if git commit --amend
+       then
+               echo "Oops?"
+               exit 1
+       else
+               : happy
+       fi
+'
+
+TERM=vt100
+export TERM
+for i in vi EDITOR VISUAL core_editor GIT_EDITOR
+do
+       echo "Edited by $i" >expect
+       unset EDITOR VISUAL GIT_EDITOR
+       git config --unset-all core.editor
+       case "$i" in
+       core_editor)
+               git config core.editor ./e-core_editor.sh
+               ;;
+       [A-Z]*)
+               eval "$i=./e-$i.sh"
+               export $i
+               ;;
+       esac
+       test_expect_success "Using $i" '
+               git commit --amend &&
+               git show -s --pretty=oneline |
+               sed -e "s/^[0-9a-f]* //" >actual &&
+               diff actual expect
+       '
+done
+
+unset EDITOR VISUAL GIT_EDITOR
+git config --unset-all core.editor
+for i in vi EDITOR VISUAL core_editor GIT_EDITOR
+do
+       echo "Edited by $i" >expect
+       case "$i" in
+       core_editor)
+               git config core.editor ./e-core_editor.sh
+               ;;
+       [A-Z]*)
+               eval "$i=./e-$i.sh"
+               export $i
+               ;;
+       esac
+       test_expect_success "Using $i (override)" '
+               git commit --amend &&
+               git show -s --pretty=oneline |
+               sed -e "s/^[0-9a-f]* //" >actual &&
+               diff actual expect
+       '
+done
+
+test_done