@@ -83,7 +83,9 @@ success of the resolution after the custom tool has exited.
--gui::
When 'git-mergetool' is invoked with the `-g` or `--gui` option
the default merge tool will be read from the configured
- `merge.guitool` variable instead of `merge.tool`.
+ `merge.guitool` variable instead of `merge.tool`. If
+ `merge.guitool` is not set, we will fallback to the tool
+ configured under `merge.tool`.
--no-gui::
This overrides a previous `-g` or `--gui` setting and reads the
@@ -350,20 +350,29 @@ guess_merge_tool () {
}
get_configured_merge_tool () {
- # If first argument is true, find the guitool instead
- if test "$1" = true
+ is_gui="$1"
+ sections="merge"
+ keys="tool"
+
+ if diff_mode
then
- gui_prefix=gui
+ sections="diff $sections"
fi
- # Diff mode first tries diff.(gui)tool and falls back to merge.(gui)tool.
- # Merge mode only checks merge.(gui)tool
- if diff_mode
+ if "$is_gui" = true
then
- merge_tool=$(git config diff.${gui_prefix}tool || git config merge.${gui_prefix}tool)
- else
- merge_tool=$(git config merge.${gui_prefix}tool)
+ keys="guitool $keys"
fi
+
+ IFS=' '
+ for key in $keys
+ do
+ for section in $sections
+ do
+ merge_tool=$(git config $section.$key) && break 2
+ done
+ done
+
if test -n "$merge_tool" && ! valid_tool "$merge_tool"
then
echo >&2 "git config option $TOOL_MODE.${gui_prefix}tool set to unknown tool: $merge_tool"
@@ -167,6 +167,25 @@ test_expect_success 'gui mergetool' '
git commit -m "branch1 resolved with mergetool"
'
+test_expect_success 'gui mergetool without merge.guitool set fallsback to merge.tool' '
+ test_when_finished "git reset --hard" &&
+ git checkout -b test$test_count branch1 &&
+ git submodule update -N &&
+ test_must_fail git merge master >/dev/null 2>&1 &&
+ ( yes "" | git mergetool --gui both >/dev/null 2>&1 ) &&
+ ( yes "" | git mergetool -g file1 file1 ) &&
+ ( yes "" | git mergetool --gui file2 "spaced name" >/dev/null 2>&1 ) &&
+ ( yes "" | git mergetool --gui subdir/file3 >/dev/null 2>&1 ) &&
+ ( yes "d" | git mergetool --gui file11 >/dev/null 2>&1 ) &&
+ ( yes "d" | git mergetool --gui file12 >/dev/null 2>&1 ) &&
+ ( yes "l" | git mergetool --gui submod >/dev/null 2>&1 ) &&
+ test "$(cat file1)" = "master updated" &&
+ test "$(cat file2)" = "master new" &&
+ test "$(cat subdir/file3)" = "master new sub" &&
+ test "$(cat submod/bar)" = "branch1 submodule" &&
+ git commit -m "branch1 resolved with mergetool"
+'
+
test_expect_success 'mergetool crlf' '
test_when_finished "git reset --hard" &&
# This test_config line must go after the above reset line so that
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 were to use `get_configured_mergetool`, it would also get the fallback behaviour in the following precedence: 1. diff.guitool 2. merge.guitool 3. diff.tool 4. merge.tool Signed-off-by: Denton Liu <liu.denton@gmail.com> --- Documentation/git-mergetool.txt | 4 +++- git-mergetool--lib.sh | 27 ++++++++++++++++++--------- t/t7610-mergetool.sh | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 10 deletions(-)