mergetool: new config guiDefault supports auto-toggling gui by DISPLAY
When no merge.tool or diff.tool is configured or manually selected, the selection of a default tool is sensitive to the DISPLAY variable; in a GUI session a gui-specific tool will be proposed if found, and otherwise a terminal-based one. This "GUI-optimizing" behavior is important because a GUI can make a huge difference to a user's ability to understand and correctly complete a non-trivial conflicting merge. Some time ago the merge.guitool and diff.guitool config options were introduced to enable users to configure both a GUI tool, and a non-GUI tool (with fallback if no GUI tool configured), in the same environment. Unfortunately, the --gui argument introduced to support the selection of the guitool is still explicit. When using configured tools, there is no equivalent of the no-tool-configured "propose a GUI tool if we are in a GUI environment" behavior. As proposed in <xmqqmtb8jsej.fsf@gitster.g>, introduce new configuration options, difftool.guiDefault and mergetool.guiDefault, supporting a special value "auto" which causes the corresponding tool or guitool to be selected depending on the presence of a non-empty DISPLAY value. Also support "true" to say "default to the guitool (unless --no-gui is passed on the commandline)", and "false" as the previous default behavior when these new configuration options are not specified. Signed-off-by: Tao Klerks <tao@klerks.biz> Acked-by: David Aguilar <davvid@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
ae73b2c8f1
commit
42943b950e
@ -97,7 +97,42 @@ merge_mode () {
|
||||
test "$TOOL_MODE" = merge
|
||||
}
|
||||
|
||||
get_gui_default () {
|
||||
if diff_mode
|
||||
then
|
||||
GUI_DEFAULT_KEY="difftool.guiDefault"
|
||||
else
|
||||
GUI_DEFAULT_KEY="mergetool.guiDefault"
|
||||
fi
|
||||
GUI_DEFAULT_CONFIG_LCASE=$(git config --default false --get "$GUI_DEFAULT_KEY" | tr 'A-Z' 'a-z')
|
||||
if test "$GUI_DEFAULT_CONFIG_LCASE" = "auto"
|
||||
then
|
||||
if test -n "$DISPLAY"
|
||||
then
|
||||
GUI_DEFAULT=true
|
||||
else
|
||||
GUI_DEFAULT=false
|
||||
fi
|
||||
else
|
||||
GUI_DEFAULT=$(git config --default false --bool --get "$GUI_DEFAULT_KEY")
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status -ne 0
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
fi
|
||||
echo $GUI_DEFAULT
|
||||
}
|
||||
|
||||
gui_mode () {
|
||||
if test -z "$GIT_MERGETOOL_GUI"
|
||||
then
|
||||
GIT_MERGETOOL_GUI=$(get_gui_default)
|
||||
if test $? -ne 0
|
||||
then
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
test "$GIT_MERGETOOL_GUI" = true
|
||||
}
|
||||
|
||||
@ -467,6 +502,11 @@ get_merge_tool () {
|
||||
is_guessed=false
|
||||
# Check if a merge tool has been configured
|
||||
merge_tool=$(get_configured_merge_tool)
|
||||
subshell_exit_status=$?
|
||||
if test $subshell_exit_status -gt "1"
|
||||
then
|
||||
exit $subshell_exit_status
|
||||
fi
|
||||
# Try to guess an appropriate merge tool if no tool has been set.
|
||||
if test -z "$merge_tool"
|
||||
then
|
||||
|
Reference in New Issue
Block a user