提交 85ac27e0 编写于 作者: J Junio C Hamano

Merge branch 'dl/difftool-mergetool'

Update "git difftool" and "git mergetool" so that the combinations
of {diff,merge}.{tool,guitool} configuration variables serve as
fallback settings of each other in a sensible order.

* dl/difftool-mergetool:
  difftool: fallback on merge.guitool
  difftool: make --gui, --tool and --extcmd mutually exclusive
  mergetool: fallback to tool when guitool unavailable
  mergetool--lib: create gui_mode function
  mergetool: use get_merge_tool function
  t7610: add mergetool --gui tests
  t7610: unsuppress output
...@@ -90,7 +90,9 @@ instead. `--no-symlinks` is the default on Windows. ...@@ -90,7 +90,9 @@ instead. `--no-symlinks` is the default on Windows.
When 'git-difftool' is invoked with the `-g` or `--gui` option When 'git-difftool' is invoked with the `-g` or `--gui` option
the default diff tool will be read from the configured the default diff tool will be read from the configured
`diff.guitool` variable instead of `diff.tool`. The `--no-gui` `diff.guitool` variable instead of `diff.tool`. The `--no-gui`
option can be used to override this setting. option can be used to override this setting. If `diff.guitool`
is not set, we will fallback in the order of `merge.guitool`,
`diff.tool`, `merge.tool` until a tool is found.
--[no-]trust-exit-code:: --[no-]trust-exit-code::
'git-difftool' invokes a diff tool individually on each file. 'git-difftool' invokes a diff tool individually on each file.
......
...@@ -28,7 +28,9 @@ to define the operation mode for the functions listed below. ...@@ -28,7 +28,9 @@ to define the operation mode for the functions listed below.
FUNCTIONS FUNCTIONS
--------- ---------
get_merge_tool:: get_merge_tool::
returns a merge tool. returns a merge tool. the return code is 1 if we returned a guessed
merge tool, else 0. '$GIT_MERGETOOL_GUI' may be set to 'true' to
search for the appropriate guitool.
get_merge_tool_cmd:: get_merge_tool_cmd::
returns the custom command for a merge tool. returns the custom command for a merge tool.
......
...@@ -83,7 +83,9 @@ success of the resolution after the custom tool has exited. ...@@ -83,7 +83,9 @@ success of the resolution after the custom tool has exited.
--gui:: --gui::
When 'git-mergetool' is invoked with the `-g` or `--gui` option When 'git-mergetool' is invoked with the `-g` or `--gui` option
the default merge tool will be read from the configured 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:: --no-gui::
This overrides a previous `-g` or `--gui` setting and reads the This overrides a previous `-g` or `--gui` setting and reads the
......
...@@ -24,7 +24,6 @@ ...@@ -24,7 +24,6 @@
#include "object-store.h" #include "object-store.h"
#include "dir.h" #include "dir.h"
static char *diff_gui_tool;
static int trust_exit_code; static int trust_exit_code;
static const char *const builtin_difftool_usage[] = { static const char *const builtin_difftool_usage[] = {
...@@ -34,11 +33,6 @@ static const char *const builtin_difftool_usage[] = { ...@@ -34,11 +33,6 @@ static const char *const builtin_difftool_usage[] = {
static int difftool_config(const char *var, const char *value, void *cb) static int difftool_config(const char *var, const char *value, void *cb)
{ {
if (!strcmp(var, "diff.guitool")) {
diff_gui_tool = xstrdup(value);
return 0;
}
if (!strcmp(var, "difftool.trustexitcode")) { if (!strcmp(var, "difftool.trustexitcode")) {
trust_exit_code = git_config_bool(var, value); trust_exit_code = git_config_bool(var, value);
return 0; return 0;
...@@ -735,8 +729,11 @@ int cmd_difftool(int argc, const char **argv, const char *prefix) ...@@ -735,8 +729,11 @@ int cmd_difftool(int argc, const char **argv, const char *prefix)
setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1); setenv(GIT_WORK_TREE_ENVIRONMENT, absolute_path(get_git_work_tree()), 1);
} }
if (use_gui_tool && diff_gui_tool && *diff_gui_tool) if (use_gui_tool + !!difftool_cmd + !!extcmd > 1)
setenv("GIT_DIFF_TOOL", diff_gui_tool, 1); die(_("--gui, --tool and --extcmd are mutually exclusive"));
if (use_gui_tool)
setenv("GIT_MERGETOOL_GUI", "true", 1);
else if (difftool_cmd) { else if (difftool_cmd) {
if (*difftool_cmd) if (*difftool_cmd)
setenv("GIT_DIFF_TOOL", difftool_cmd, 1); setenv("GIT_DIFF_TOOL", difftool_cmd, 1);
......
...@@ -71,7 +71,7 @@ then ...@@ -71,7 +71,7 @@ then
then then
merge_tool="$GIT_DIFF_TOOL" merge_tool="$GIT_DIFF_TOOL"
else else
merge_tool="$(get_merge_tool)" || exit merge_tool="$(get_merge_tool)"
fi fi
fi fi
......
...@@ -80,14 +80,18 @@ show_tool_names () { ...@@ -80,14 +80,18 @@ show_tool_names () {
} }
} }
diff_mode() { diff_mode () {
test "$TOOL_MODE" = diff test "$TOOL_MODE" = diff
} }
merge_mode() { merge_mode () {
test "$TOOL_MODE" = merge test "$TOOL_MODE" = merge
} }
gui_mode () {
test "$GIT_MERGETOOL_GUI" = true
}
translate_merge_tool_path () { translate_merge_tool_path () {
echo "$1" echo "$1"
} }
...@@ -351,20 +355,36 @@ guess_merge_tool () { ...@@ -351,20 +355,36 @@ guess_merge_tool () {
} }
get_configured_merge_tool () { get_configured_merge_tool () {
# If first argument is true, find the guitool instead keys=
if test "$1" = true
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
if diff_mode if diff_mode
then then
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
else else
merge_tool=$(git config merge.${gui_prefix}tool) if gui_mode
then
keys="merge.guitool merge.tool"
else
keys="merge.tool"
fi
fi 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" if test -n "$merge_tool" && ! valid_tool "$merge_tool"
then then
echo >&2 "git config option $TOOL_MODE.${gui_prefix}tool set to unknown tool: $merge_tool" echo >&2 "git config option $TOOL_MODE.${gui_prefix}tool set to unknown tool: $merge_tool"
...@@ -404,14 +424,17 @@ get_merge_tool_path () { ...@@ -404,14 +424,17 @@ get_merge_tool_path () {
} }
get_merge_tool () { get_merge_tool () {
is_guessed=false
# Check if a merge tool has been configured # Check if a merge tool has been configured
merge_tool=$(get_configured_merge_tool) merge_tool=$(get_configured_merge_tool)
# Try to guess an appropriate merge tool if no tool has been set. # Try to guess an appropriate merge tool if no tool has been set.
if test -z "$merge_tool" if test -z "$merge_tool"
then then
merge_tool=$(guess_merge_tool) || exit merge_tool=$(guess_merge_tool) || exit
is_guessed=true
fi fi
echo "$merge_tool" echo "$merge_tool"
test "$is_guessed" = false
} }
mergetool_find_win32_cmd () { mergetool_find_win32_cmd () {
......
...@@ -389,7 +389,7 @@ print_noop_and_exit () { ...@@ -389,7 +389,7 @@ print_noop_and_exit () {
main () { main () {
prompt=$(git config --bool mergetool.prompt) prompt=$(git config --bool mergetool.prompt)
gui_tool=false GIT_MERGETOOL_GUI=false
guessed_merge_tool=false guessed_merge_tool=false
orderfile= orderfile=
...@@ -416,10 +416,10 @@ main () { ...@@ -416,10 +416,10 @@ main () {
esac esac
;; ;;
--no-gui) --no-gui)
gui_tool=false GIT_MERGETOOL_GUI=false
;; ;;
-g|--gui) -g|--gui)
gui_tool=true GIT_MERGETOOL_GUI=true
;; ;;
-y|--no-prompt) -y|--no-prompt)
prompt=false prompt=false
...@@ -449,12 +449,8 @@ main () { ...@@ -449,12 +449,8 @@ main () {
if test -z "$merge_tool" if test -z "$merge_tool"
then then
# Check if a merge tool has been configured if ! merge_tool=$(get_merge_tool)
merge_tool=$(get_configured_merge_tool $gui_tool)
# Try to guess an appropriate merge tool if no tool has been set.
if test -z "$merge_tool"
then then
merge_tool=$(guess_merge_tool) || exit
guessed_merge_tool=true guessed_merge_tool=true
fi fi
fi fi
......
...@@ -130,14 +130,55 @@ test_expect_success 'custom mergetool' ' ...@@ -130,14 +130,55 @@ test_expect_success 'custom mergetool' '
test_when_finished "git reset --hard" && test_when_finished "git reset --hard" &&
git checkout -b test$test_count branch1 && git checkout -b test$test_count branch1 &&
git submodule update -N && git submodule update -N &&
test_must_fail git merge master >/dev/null 2>&1 && test_must_fail git merge master &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "" | git mergetool file1 file1 ) && ( yes "" | git mergetool file1 file1 ) &&
( yes "" | git mergetool file2 "spaced name" >/dev/null 2>&1 ) && ( yes "" | git mergetool file2 "spaced name" ) &&
( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool subdir/file3 ) &&
( yes "d" | git mergetool file11 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 ) &&
( yes "d" | git mergetool file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file12 ) &&
( yes "l" | git mergetool submod >/dev/null 2>&1 ) && ( yes "l" | git mergetool submod ) &&
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 'gui mergetool' '
test_config merge.guitool myguitool &&
test_config mergetool.myguitool.cmd "(printf \"gui \" && cat \"\$REMOTE\") >\"\$MERGED\"" &&
test_config mergetool.myguitool.trustExitCode true &&
test_when_finished "git reset --hard" &&
git checkout -b test$test_count branch1 &&
git submodule update -N &&
test_must_fail git merge master &&
( yes "" | git mergetool --gui both ) &&
( yes "" | git mergetool -g file1 file1 ) &&
( yes "" | git mergetool --gui file2 "spaced name" ) &&
( yes "" | git mergetool --gui subdir/file3 ) &&
( yes "d" | git mergetool --gui file11 ) &&
( yes "d" | git mergetool --gui file12 ) &&
( yes "l" | git mergetool --gui submod ) &&
test "$(cat file1)" = "gui master updated" &&
test "$(cat file2)" = "gui master new" &&
test "$(cat subdir/file3)" = "gui master new sub" &&
test "$(cat submod/bar)" = "branch1 submodule" &&
git commit -m "branch1 resolved with mergetool"
'
test_expect_success 'gui mergetool without merge.guitool set falls back 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 &&
( yes "" | git mergetool --gui both ) &&
( yes "" | git mergetool -g file1 file1 ) &&
( yes "" | git mergetool --gui file2 "spaced name" ) &&
( yes "" | git mergetool --gui subdir/file3 ) &&
( yes "d" | git mergetool --gui file11 ) &&
( yes "d" | git mergetool --gui file12 ) &&
( yes "l" | git mergetool --gui submod ) &&
test "$(cat file1)" = "master updated" && test "$(cat file1)" = "master updated" &&
test "$(cat file2)" = "master new" && test "$(cat file2)" = "master new" &&
test "$(cat subdir/file3)" = "master new sub" && test "$(cat subdir/file3)" = "master new sub" &&
...@@ -153,15 +194,15 @@ test_expect_success 'mergetool crlf' ' ...@@ -153,15 +194,15 @@ test_expect_success 'mergetool crlf' '
# test_when_finished is LIFO.) # test_when_finished is LIFO.)
test_config core.autocrlf true && test_config core.autocrlf true &&
git checkout -b test$test_count branch1 && git checkout -b test$test_count branch1 &&
test_must_fail git merge master >/dev/null 2>&1 && test_must_fail git merge master &&
( yes "" | git mergetool file1 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 ) &&
( yes "" | git mergetool file2 >/dev/null 2>&1 ) && ( yes "" | git mergetool file2 ) &&
( yes "" | git mergetool "spaced name" >/dev/null 2>&1 ) && ( yes "" | git mergetool "spaced name" ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "" | git mergetool subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool subdir/file3 ) &&
( yes "d" | git mergetool file11 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 ) &&
( yes "d" | git mergetool file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file12 ) &&
( yes "r" | git mergetool submod >/dev/null 2>&1 ) && ( yes "r" | git mergetool submod ) &&
test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" && test "$(printf x | cat file1 -)" = "$(printf "master updated\r\nx")" &&
test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" && test "$(printf x | cat file2 -)" = "$(printf "master new\r\nx")" &&
test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" && test "$(printf x | cat subdir/file3 -)" = "$(printf "master new sub\r\nx")" &&
...@@ -176,8 +217,8 @@ test_expect_success 'mergetool in subdir' ' ...@@ -176,8 +217,8 @@ test_expect_success 'mergetool in subdir' '
git submodule update -N && git submodule update -N &&
( (
cd subdir && cd subdir &&
test_must_fail git merge master >/dev/null 2>&1 && test_must_fail git merge master &&
( yes "" | git mergetool file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file3 ) &&
test "$(cat file3)" = "master new sub" test "$(cat file3)" = "master new sub"
) )
' '
...@@ -188,14 +229,14 @@ test_expect_success 'mergetool on file in parent dir' ' ...@@ -188,14 +229,14 @@ test_expect_success 'mergetool on file in parent dir' '
git submodule update -N && git submodule update -N &&
( (
cd subdir && cd subdir &&
test_must_fail git merge master >/dev/null 2>&1 && test_must_fail git merge master &&
( yes "" | git mergetool file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file3 ) &&
( yes "" | git mergetool ../file1 >/dev/null 2>&1 ) && ( yes "" | git mergetool ../file1 ) &&
( yes "" | git mergetool ../file2 ../spaced\ name >/dev/null 2>&1 ) && ( yes "" | git mergetool ../file2 ../spaced\ name ) &&
( yes "" | git mergetool ../both >/dev/null 2>&1 ) && ( yes "" | git mergetool ../both ) &&
( yes "d" | git mergetool ../file11 >/dev/null 2>&1 ) && ( yes "d" | git mergetool ../file11 ) &&
( yes "d" | git mergetool ../file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool ../file12 ) &&
( yes "l" | git mergetool ../submod >/dev/null 2>&1 ) && ( yes "l" | git mergetool ../submod ) &&
test "$(cat ../file1)" = "master updated" && test "$(cat ../file1)" = "master updated" &&
test "$(cat ../file2)" = "master new" && test "$(cat ../file2)" = "master new" &&
test "$(cat ../submod/bar)" = "branch1 submodule" && test "$(cat ../submod/bar)" = "branch1 submodule" &&
...@@ -209,9 +250,9 @@ test_expect_success 'mergetool skips autoresolved' ' ...@@ -209,9 +250,9 @@ test_expect_success 'mergetool skips autoresolved' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge master && test_must_fail git merge master &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "d" | git mergetool file11 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 ) &&
( yes "d" | git mergetool file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file12 ) &&
( yes "l" | git mergetool submod >/dev/null 2>&1 ) && ( yes "l" | git mergetool submod ) &&
output="$(git mergetool --no-prompt)" && output="$(git mergetool --no-prompt)" &&
test "$output" = "No files need merging" test "$output" = "No files need merging"
' '
...@@ -259,9 +300,9 @@ test_expect_success 'mergetool skips resolved paths when rerere is active' ' ...@@ -259,9 +300,9 @@ test_expect_success 'mergetool skips resolved paths when rerere is active' '
rm -rf .git/rr-cache && rm -rf .git/rr-cache &&
git checkout -b test$test_count branch1 && git checkout -b test$test_count branch1 &&
git submodule update -N && git submodule update -N &&
test_must_fail git merge master >/dev/null 2>&1 && test_must_fail git merge master &&
( yes "l" | git mergetool --no-prompt submod >/dev/null 2>&1 ) && ( yes "l" | git mergetool --no-prompt submod ) &&
( yes "d" "d" | git mergetool --no-prompt >/dev/null 2>&1 ) && ( yes "d" "d" | git mergetool --no-prompt ) &&
git submodule update -N && git submodule update -N &&
output="$(yes "n" | git mergetool --no-prompt)" && output="$(yes "n" | git mergetool --no-prompt)" &&
test "$output" = "No files need merging" test "$output" = "No files need merging"
...@@ -369,9 +410,9 @@ test_expect_success 'deleted vs modified submodule' ' ...@@ -369,9 +410,9 @@ test_expect_success 'deleted vs modified submodule' '
git checkout -b test$test_count.a test$test_count && git checkout -b test$test_count.a test$test_count &&
test_must_fail git merge master && test_must_fail git merge master &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "r" | git mergetool submod ) && ( yes "r" | git mergetool submod ) &&
rmdir submod && mv submod-movedaside submod && rmdir submod && mv submod-movedaside submod &&
test "$(cat submod/bar)" = "branch1 submodule" && test "$(cat submod/bar)" = "branch1 submodule" &&
...@@ -386,9 +427,9 @@ test_expect_success 'deleted vs modified submodule' ' ...@@ -386,9 +427,9 @@ test_expect_success 'deleted vs modified submodule' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge master && test_must_fail git merge master &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "l" | git mergetool submod ) && ( yes "l" | git mergetool submod ) &&
test ! -e submod && test ! -e submod &&
output="$(git mergetool --no-prompt)" && output="$(git mergetool --no-prompt)" &&
...@@ -400,9 +441,9 @@ test_expect_success 'deleted vs modified submodule' ' ...@@ -400,9 +441,9 @@ test_expect_success 'deleted vs modified submodule' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge test$test_count && test_must_fail git merge test$test_count &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "r" | git mergetool submod ) && ( yes "r" | git mergetool submod ) &&
test ! -e submod && test ! -e submod &&
test -d submod.orig && test -d submod.orig &&
...@@ -416,9 +457,9 @@ test_expect_success 'deleted vs modified submodule' ' ...@@ -416,9 +457,9 @@ test_expect_success 'deleted vs modified submodule' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge test$test_count && test_must_fail git merge test$test_count &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "l" | git mergetool submod ) && ( yes "l" | git mergetool submod ) &&
test "$(cat submod/bar)" = "master submodule" && test "$(cat submod/bar)" = "master submodule" &&
git submodule update -N && git submodule update -N &&
...@@ -440,9 +481,9 @@ test_expect_success 'file vs modified submodule' ' ...@@ -440,9 +481,9 @@ test_expect_success 'file vs modified submodule' '
git checkout -b test$test_count.a branch1 && git checkout -b test$test_count.a branch1 &&
test_must_fail git merge master && test_must_fail git merge master &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "r" | git mergetool submod ) && ( yes "r" | git mergetool submod ) &&
rmdir submod && mv submod-movedaside submod && rmdir submod && mv submod-movedaside submod &&
test "$(cat submod/bar)" = "branch1 submodule" && test "$(cat submod/bar)" = "branch1 submodule" &&
...@@ -456,9 +497,9 @@ test_expect_success 'file vs modified submodule' ' ...@@ -456,9 +497,9 @@ test_expect_success 'file vs modified submodule' '
git checkout -b test$test_count.b test$test_count && git checkout -b test$test_count.b test$test_count &&
test_must_fail git merge master && test_must_fail git merge master &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "l" | git mergetool submod ) && ( yes "l" | git mergetool submod ) &&
git submodule update -N && git submodule update -N &&
test "$(cat submod)" = "not a submodule" && test "$(cat submod)" = "not a submodule" &&
...@@ -472,9 +513,9 @@ test_expect_success 'file vs modified submodule' ' ...@@ -472,9 +513,9 @@ test_expect_success 'file vs modified submodule' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge test$test_count && test_must_fail git merge test$test_count &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both >/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "r" | git mergetool submod ) && ( yes "r" | git mergetool submod ) &&
test -d submod.orig && test -d submod.orig &&
git submodule update -N && git submodule update -N &&
...@@ -488,9 +529,9 @@ test_expect_success 'file vs modified submodule' ' ...@@ -488,9 +529,9 @@ test_expect_success 'file vs modified submodule' '
git submodule update -N && git submodule update -N &&
test_must_fail git merge test$test_count && test_must_fail git merge test$test_count &&
test -n "$(git ls-files -u)" && test -n "$(git ls-files -u)" &&
( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 >/dev/null 2>&1 ) && ( yes "" | git mergetool file1 file2 spaced\ name subdir/file3 ) &&
( yes "" | git mergetool both>/dev/null 2>&1 ) && ( yes "" | git mergetool both ) &&
( yes "d" | git mergetool file11 file12 >/dev/null 2>&1 ) && ( yes "d" | git mergetool file11 file12 ) &&
( yes "l" | git mergetool submod ) && ( yes "l" | git mergetool submod ) &&
test "$(cat submod/bar)" = "master submodule" && test "$(cat submod/bar)" = "master submodule" &&
git submodule update -N && git submodule update -N &&
...@@ -543,7 +584,7 @@ test_expect_success 'submodule in subdirectory' ' ...@@ -543,7 +584,7 @@ test_expect_success 'submodule in subdirectory' '
git add subdir/subdir_module && git add subdir/subdir_module &&
git commit -m "change submodule in subdirectory on test$test_count.b" && git commit -m "change submodule in subdirectory on test$test_count.b" &&
test_must_fail git merge test$test_count.a >/dev/null 2>&1 && test_must_fail git merge test$test_count.a &&
( (
cd subdir && cd subdir &&
( yes "l" | git mergetool subdir_module ) ( yes "l" | git mergetool subdir_module )
...@@ -554,7 +595,7 @@ test_expect_success 'submodule in subdirectory' ' ...@@ -554,7 +595,7 @@ test_expect_success 'submodule in subdirectory' '
git reset --hard && git reset --hard &&
git submodule update -N && git submodule update -N &&
test_must_fail git merge test$test_count.a >/dev/null 2>&1 && test_must_fail git merge test$test_count.a &&
( yes "r" | git mergetool subdir/subdir_module ) && ( yes "r" | git mergetool subdir/subdir_module ) &&
test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" && test "$(cat subdir/subdir_module/file15)" = "test$test_count.b" &&
git submodule update -N && git submodule update -N &&
...@@ -641,7 +682,7 @@ test_expect_success 'filenames seen by tools start with ./' ' ...@@ -641,7 +682,7 @@ test_expect_success 'filenames seen by tools start with ./' '
test_config mergetool.myecho.trustExitCode true && test_config mergetool.myecho.trustExitCode true &&
test_must_fail git merge master && test_must_fail git merge master &&
git mergetool --no-prompt --tool myecho -- both >actual && git mergetool --no-prompt --tool myecho -- both >actual &&
grep ^\./both_LOCAL_ actual >/dev/null grep ^\./both_LOCAL_ actual
' '
test_lazy_prereq MKTEMP ' test_lazy_prereq MKTEMP '
...@@ -658,8 +699,8 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT ...@@ -658,8 +699,8 @@ test_expect_success MKTEMP 'temporary filenames are used with mergetool.writeToT
test_config mergetool.myecho.trustExitCode true && test_config mergetool.myecho.trustExitCode true &&
test_must_fail git merge master && test_must_fail git merge master &&
git mergetool --no-prompt --tool myecho -- both >actual && git mergetool --no-prompt --tool myecho -- both >actual &&
! grep ^\./both_LOCAL_ actual >/dev/null && ! grep ^\./both_LOCAL_ actual &&
grep /both_LOCAL_ actual >/dev/null grep /both_LOCAL_ actual
' '
test_expect_success 'diff.orderFile configuration is honored' ' test_expect_success 'diff.orderFile configuration is honored' '
......
...@@ -279,11 +279,27 @@ test_expect_success 'difftool + mergetool config variables' ' ...@@ -279,11 +279,27 @@ test_expect_success 'difftool + mergetool config variables' '
echo branch >expect && echo branch >expect &&
git difftool --no-prompt branch >actual && git difftool --no-prompt branch >actual &&
test_cmp expect actual && test_cmp expect actual &&
git difftool --gui --no-prompt branch >actual &&
test_cmp expect actual &&
# set merge.tool to something bogus, diff.tool to test-tool # set merge.tool to something bogus, diff.tool to test-tool
test_config merge.tool bogus-tool && test_config merge.tool bogus-tool &&
test_config diff.tool test-tool && test_config diff.tool test-tool &&
git difftool --no-prompt branch >actual && git difftool --no-prompt branch >actual &&
test_cmp expect actual &&
git difftool --gui --no-prompt branch >actual &&
test_cmp expect actual &&
# set merge.tool, diff.tool to something bogus, merge.guitool to test-tool
test_config diff.tool bogus-tool &&
test_config merge.guitool test-tool &&
git difftool --gui --no-prompt branch >actual &&
test_cmp expect actual &&
# set merge.tool, diff.tool, merge.guitool to something bogus, diff.guitool to test-tool
test_config merge.guitool bogus-tool &&
test_config diff.guitool test-tool &&
git difftool --gui --no-prompt branch >actual &&
test_cmp expect actual test_cmp expect actual
' '
...@@ -715,4 +731,12 @@ test_expect_success 'outside worktree' ' ...@@ -715,4 +731,12 @@ test_expect_success 'outside worktree' '
test_cmp expect actual test_cmp expect actual
' '
test_expect_success 'difftool --gui, --tool and --extcmd are mutually exclusive' '
difftool_test_setup &&
test_must_fail git difftool --gui --tool=test-tool &&
test_must_fail git difftool --gui --extcmd=cat &&
test_must_fail git difftool --tool=test-tool --extcmd=cat &&
test_must_fail git difftool --gui --tool=test-tool --extcmd=cat
'
test_done test_done
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册