mirror of
https://github.com/git/git.git
synced 2026-01-09 01:34:00 +00:00
mergetool: honor mergetool.$tool.trustExitCode for built-in tools
Built-in merge tools contain a hard-coded assumption about whether or not a tool's exit code can be trusted to determine the success or failure of a merge. Tools whose exit codes are not trusted contain calls to check_unchanged() in their merge_cmd() functions. A problem with this is that the trustExitCode configuration is not honored for built-in tools. Teach built-in tools to honor the trustExitCode configuration. Extend run_merge_cmd() so that it is responsible for calling check_unchanged() when a tool's exit code cannot be trusted. Remove check_unchanged() calls from scriptlets since they are no longer responsible for calling it. When no configuration is present, exit_code_trustable() is checked to see whether the exit code should be trusted. The default implementation returns false. Tools whose exit codes can be trusted override exit_code_trustable() to true. Reported-by: Dun Peal <dunpealer@gmail.com> Signed-off-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
ac84098b7e
commit
7c10605d2c
@@ -125,16 +125,7 @@ setup_user_tool () {
|
||||
}
|
||||
|
||||
merge_cmd () {
|
||||
trust_exit_code=$(git config --bool \
|
||||
"mergetool.$1.trustExitCode" || echo false)
|
||||
if test "$trust_exit_code" = "false"
|
||||
then
|
||||
touch "$BACKUP"
|
||||
( eval $merge_tool_cmd )
|
||||
check_unchanged
|
||||
else
|
||||
( eval $merge_tool_cmd )
|
||||
fi
|
||||
( eval $merge_tool_cmd )
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,6 +153,28 @@ setup_tool () {
|
||||
echo "$1"
|
||||
}
|
||||
|
||||
# Most tools' exit codes cannot be trusted, so By default we ignore
|
||||
# their exit code and check the merged file's modification time in
|
||||
# check_unchanged() to determine whether or not the merge was
|
||||
# successful. The return value from run_merge_cmd, by default, is
|
||||
# determined by check_unchanged().
|
||||
#
|
||||
# When a tool's exit code can be trusted then the return value from
|
||||
# run_merge_cmd is simply the tool's exit code, and check_unchanged()
|
||||
# is not called.
|
||||
#
|
||||
# The return value of exit_code_trustable() tells us whether or not we
|
||||
# can trust the tool's exit code.
|
||||
#
|
||||
# User-defined and built-in tools default to false.
|
||||
# Built-in tools advertise that their exit code is trustable by
|
||||
# redefining exit_code_trustable() to true.
|
||||
|
||||
exit_code_trustable () {
|
||||
false
|
||||
}
|
||||
|
||||
|
||||
if ! test -f "$MERGE_TOOLS_DIR/$tool"
|
||||
then
|
||||
setup_user_tool
|
||||
@@ -197,6 +210,19 @@ get_merge_tool_cmd () {
|
||||
fi
|
||||
}
|
||||
|
||||
trust_exit_code () {
|
||||
if git config --bool "mergetool.$1.trustExitCode"
|
||||
then
|
||||
:; # OK
|
||||
elif exit_code_trustable
|
||||
then
|
||||
echo true
|
||||
else
|
||||
echo false
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Entry point for running tools
|
||||
run_merge_tool () {
|
||||
# If GIT_PREFIX is empty then we cannot use it in tools
|
||||
@@ -225,7 +251,15 @@ run_diff_cmd () {
|
||||
|
||||
# Run a either a configured or built-in merge tool
|
||||
run_merge_cmd () {
|
||||
merge_cmd "$1"
|
||||
mergetool_trust_exit_code=$(trust_exit_code "$1")
|
||||
if test "$mergetool_trust_exit_code" = "true"
|
||||
then
|
||||
merge_cmd "$1"
|
||||
else
|
||||
touch "$BACKUP"
|
||||
merge_cmd "$1"
|
||||
check_unchanged
|
||||
fi
|
||||
}
|
||||
|
||||
list_merge_tool_candidates () {
|
||||
|
||||
Reference in New Issue
Block a user