diff options
Diffstat (limited to 'git-mergetool--lib.sh')
-rw-r--r-- | git-mergetool--lib.sh | 107 |
1 files changed, 80 insertions, 27 deletions
diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index 2b6635130a..9a8b97a2ab 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -2,6 +2,9 @@ : ${MERGE_TOOLS_DIR=$(git --exec-path)/mergetools} +IFS=' +' + mode_ok () { if diff_mode then @@ -92,16 +95,16 @@ translate_merge_tool_path () { check_unchanged () { if test "$MERGED" -nt "$BACKUP" then - status=0 + return 0 else while true do echo "$MERGED seems unchanged." - printf "Was the merge successful? [y/n] " + printf "Was the merge successful [y/n]? " read answer || return 1 case "$answer" in - y*|Y*) status=0; break ;; - n*|N*) status=1; break ;; + y*|Y*) return 0 ;; + n*|N*) return 1 ;; esac done fi @@ -119,24 +122,10 @@ setup_user_tool () { diff_cmd () { ( eval $merge_tool_cmd ) - status=$? - return $status } 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 ) - status=$? - check_unchanged - else - ( eval $merge_tool_cmd ) - status=$? - fi - return $status + ( eval $merge_tool_cmd ) } } @@ -153,19 +142,39 @@ setup_tool () { } diff_cmd () { - status=1 - return $status + return 1 } merge_cmd () { - status=1 - return $status + return 1 } translate_merge_tool_path () { 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 @@ -201,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 @@ -210,7 +232,6 @@ run_merge_tool () { merge_tool_path=$(get_merge_tool_path "$1") || exit base_present="$2" - status=0 # Bring tool-specific functions into scope setup_tool "$1" || return 1 @@ -221,8 +242,6 @@ run_merge_tool () { else run_diff_cmd "$1" fi - status=$? - return $status } # Run a either a configured or built-in diff tool @@ -232,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 () { @@ -312,6 +339,7 @@ guess_merge_tool () { EOF # Loop over each candidate and stop when a valid merge tool is found. + IFS=' ' for tool in $tools do is_available "$tool" && echo "$tool" && return 0 @@ -378,3 +406,28 @@ get_merge_tool () { fi echo "$merge_tool" } + +mergetool_find_win32_cmd () { + executable=$1 + sub_directory=$2 + + # Use $executable if it exists in $PATH + if type -p "$executable" >/dev/null 2>&1 + then + printf '%s' "$executable" + return + fi + + # Look for executable in the typical locations + for directory in $(env | grep -Ei '^PROGRAM(FILES(\(X86\))?|W6432)=' | + cut -d '=' -f 2- | sort -u) + do + if test -n "$directory" && test -x "$directory/$sub_directory/$executable" + then + printf '%s' "$directory/$sub_directory/$executable" + return + fi + done + + printf '%s' "$executable" +} |