path: root/
diff options
authorDenton Liu <>2019-04-29 06:21:14 (GMT)
committerJunio C Hamano <>2019-05-13 14:11:59 (GMT)
commit60aced3dfa68df60952fed28c4ae63a5bbda0275 (patch)
treec8b2ed84040a9627929143e478c4b9ef361d0801 /
parent884630b2e2634969656faabc7f4e33cab2e32b35 (diff)
mergetool: fallback to tool when guitool unavailable
In git-difftool, if the tool is called with --gui but `diff.guitool` is not set, it falls back to `diff.tool`. Make git-mergetool also fallback from `merge.guitool` to `merge.tool` if the former is undefined. If git-difftool, when called with `--gui`, were to use `get_configured_mergetool` in a future patch, it would also get the fallback behavior in the following precedence: 1. diff.guitool 2. merge.guitool 3. diff.tool 4. merge.tool The behavior for when difftool or mergetool are called without `--gui` should be identical with or without this patch. Note that the search loop could be written as sections="merge" keys="tool" if diff_mode then sections="diff $sections" fi if gui_mode then keys="guitool $keys" fi merge_tool=$( IFS=' ' for key in $keys do for section in $sections do selected=$(git config $section.$key) if test -n "$selected" then echo "$selected" return fi done done) which would make adding a mode in the future much easier. However, adding a new mode will likely never happen as it is highly discouraged so, as a result, it is written in its current form so that it is more readable for future readers. Signed-off-by: Denton Liu <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to '')
1 files changed, 26 insertions, 9 deletions
diff --git a/ b/
index 4ca170c..696eb49 100644
--- a/
+++ b/
@@ -354,19 +354,36 @@ guess_merge_tool () {
get_configured_merge_tool () {
- if gui_mode
- then
- gui_prefix=gui
- fi
- # Diff mode first tries diff.(gui)tool and falls back to merge.(gui)tool.
- # Merge mode only checks merge.(gui)tool
+ keys=
if diff_mode
- merge_tool=$(git config diff.${gui_prefix}tool || git config merge.${gui_prefix}tool)
+ if gui_mode
+ then
+ keys="diff.guitool merge.guitool diff.tool merge.tool"
+ else
+ keys="diff.tool merge.tool"
+ fi
- merge_tool=$(git config merge.${gui_prefix}tool)
+ if gui_mode
+ then
+ keys="merge.guitool merge.tool"
+ else
+ keys="merge.tool"
+ fi
+ merge_tool=$(
+ IFS=' '
+ for key in $keys
+ do
+ selected=$(git config $key)
+ if test -n "$selected"
+ then
+ echo "$selected"
+ return
+ fi
+ done)
if test -n "$merge_tool" && ! valid_tool "$merge_tool"
echo >&2 "git config option $TOOL_MODE.${gui_prefix}tool set to unknown tool: $merge_tool"