At this time when you define merge.tool with a known tool, such as meld, p4merge, diffuse ... etc, mergetool.<tool>.* configurations are ignored and git mergetool will use its own templates. This patch adds a detection for mergetool.<tool>.cmd configuration in the run_merge_tool function. If the configuration is set, it will try to run the tool with mergetool.<tool>.path if its set. It also consider the mergetool.<tool>.trustExitCode configuration. Signed-off-by: Sylvain Rabot <sylvain@xxxxxxxxxxxxxx> --- git-mergetool--lib.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-) diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index 51dd0d6..2a58d88 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -84,9 +84,69 @@ get_merge_tool_cmd () { run_merge_tool () { merge_tool_path="$(get_merge_tool_path "$1")" || exit + merge_tool_cmd="$(get_merge_tool_cmd "$1")" + merge_tool_cmd_base="$(echo $merge_tool_cmd | cut -f1 -d " ")" base_present="$2" status=0 + # if mergetool.<tool>.cmd is set we execute it, not a template + if test -n "$merge_tool_cmd"; then + # mergetool.<tool>.path is empty + if test -z "$merge_tool_path"; then + # mergetool.<tool>.cmd not found + if ! $(which "$merge_tool_cmd_base" > /dev/null 2>&1); then + echo >&2 "Configuration mergetool.$1.cmd \"$merge_tool_cmd_base\" not found" + exit 1 + else + merge_cmd="$merge_tool_path/$merge_tool_cmd" + fi + # mergetool.<tool>.path is a path + elif test -d "$merge_tool_path"; then + # mergetool.<tool>.cmd not found + if !test -f "$merge_tool_path/$merge_tool_cmd_base"; then + echo >&2 "Configuration mergetool.$1.cmd \"$(echo "$merge_tool_path/$merge_tool_cmd_base" | sed 's#//\+#/#')\" not found" + exit 1 + # mergetool.<tool>.cmd not executable + elif !test -x "$merge_tool_path/$merge_tool_cmd_base"; then + echo >&2 "Configuration mergetool.$1.cmd \"$(echo "$merge_tool_path/$merge_tool_cmd_base" | sed 's#//\+#/#')\" is not executable" + exit 1 + # tool ok + else + merge_cmd="$merge_tool_path/$merge_tool_cmd" + fi + # mergetool.<tool>.path is the same as mergetool.<tool>.cmd + elif test "$merge_tool_path" = "$merge_tool_cmd_base"; then + # mergetool.<tool>.cmd not found + if ! $(which "$merge_tool_cmd_base" > /dev/null 2>&1); then + echo >&2 "Configuration mergetool.$1.cmd \"$merge_tool_cmd_base\" not found" + exit 1 + else + merge_cmd="$merge_tool_cmd" + fi + # mergetool.<tool>.path is the tool itself + elif $(which "$merge_tool_path" > /dev/null 2>&1); then + merge_cmd="$merge_tool_path $merge_tool_cmd" + # mergetool.<tool>.path invalid + else + echo >&2 "Configuration mergetool.$1.path \"$merge_tool_path\" is not valid path" + exit 1 + fi + + # trust exit code + trust_exit_code="$(git config --bool mergetool."$1".trustExitCode || echo false)" + + if test "$trust_exit_code" = "false"; then + touch "$BACKUP" + (eval "$merge_cmd") + check_unchanged + return $status + else + (eval "$merge_cmd") + status=$? + return $status + fi + fi + case "$1" in kdiff3) if merge_mode; then -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html