Add GIT_EDITOR environment and core.editor configuration variables

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>
This commit is contained in:
Adam Roben 2007-07-19 22:09:35 -07:00 committed by Junio C Hamano
parent a7738c77f1
commit ef0c2abf3e
10 changed files with 129 additions and 23 deletions

View 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.

View 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
-----

View 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

View File

@ -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" ;;

View File

@ -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

View File

@ -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)" &&

View File

@ -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")

View File

@ -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
}

View File

@ -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

91
t/t7005-editor.sh Executable file
View File

@ -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