diff --git a/diff.c b/diff.c index 2253ec880..8a265e0b0 100644 --- a/diff.c +++ b/diff.c @@ -532,7 +532,7 @@ static struct diff_tempfile { * this tempfile object is used to manage its lifetime. */ struct tempfile *tempfile; -} diff_temp[2]; +} diff_temp[20]; struct emit_callback { int color_diff; @@ -4275,7 +4275,7 @@ static void run_external_diff(const char *pgm, if (run_command_v_opt_cd_env(argv.v, RUN_USING_SHELL, NULL, env.v)) die(_("external diff died, stopping at %s"), name); - remove_tempfile(); + //remove_tempfile(); strvec_clear(&argv); strvec_clear(&env); } diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index 7225abd81..e599e4243 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -193,6 +193,8 @@ setup_tool () { false } + unset -f diff_combo_cmd + if test -f "$MERGE_TOOLS_DIR/$tool" then . "$MERGE_TOOLS_DIR/$tool" @@ -248,6 +250,25 @@ trust_exit_code () { fi } +is_difftool_tabbed () { + : "${GIT_DIFFTOOL_TABBED:=$(git config --type=bool --default=false difftool.tabbed)}" + case $(printf "%s" "$GIT_DIFFTOOL_TABBED" | tr '[:upper:]' '[:lower:]') in + yes|on|true|1) + GIT_DIFFTOOL_TABBED=true + ;; + no|off|false|0) + GIT_DIFFTOOL_TABBED=false + ;; + *) + echo "error: bad boolean value of GIT_DIFFTOOL_TABBED" >&2 + exit 1 + ;; + esac + + test "$GIT_DIFFTOOL_TABBED" = true && test "$GIT_DIFF_PATH_TOTAL" -gt 1 \ + && type diff_combo_cmd >/dev/null 2>&1 +} + # Entry point for running tools run_merge_tool () { @@ -272,7 +293,20 @@ run_merge_tool () { # Run a either a configured or built-in diff tool run_diff_cmd () { - diff_cmd "$1" + if is_difftool_tabbed + then + temp_file="${TMPDIR:-/tmp}/git-${PPID}_tabbed-queue" + test "$GIT_DIFF_PATH_COUNTER" -eq 1 && > "$temp_file" + printf "%s " "$LOCAL" "$REMOTE" >> "$temp_file" + + if [ "$GIT_DIFF_PATH_COUNTER" -eq "$GIT_DIFF_PATH_TOTAL" ] + then + diff_combo_cmd 3< "$temp_file" + rm -f -- "$temp_file" + fi + else + diff_cmd "$1" + fi } # Run a either a configured or built-in merge tool diff --git a/mergetools/meld b/mergetools/meld index aab4ebb93..6570bf0f8 100644 --- a/mergetools/meld +++ b/mergetools/meld @@ -2,6 +2,10 @@ diff_cmd () { "$merge_tool_path" "$LOCAL" "$REMOTE" } +diff_combo_cmd () { + ( IFS=' '; "$merge_tool_path" $(printf ' --diff %s %s' `cat <&3`) 3<&- ) +} + merge_cmd () { check_meld_for_features diff --git a/mergetools/vimdiff b/mergetools/vimdiff index abc8ce4ec..31d6e1eaa 100644 --- a/mergetools/vimdiff +++ b/mergetools/vimdiff @@ -3,6 +3,23 @@ diff_cmd () { -c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE" } +multitabbed_script=' + let i = 1 + while i < argc() + execute "tabedit" fnameescape(argv(i - 1)) + execute "diffsplit" fnameescape(argv(i)) + wincmd L + let i = i + 2 + endwhile + tabfirst + tabclose + unlet i +' +diff_combo_cmd () { + ( IFS=' '; cd "$GIT_PREFIX" && "$merge_tool_path" -R -f \ + -c "$multitabbed_script" `cat <&3` 3<&- ) +} + merge_cmd () { case "$1" in *vimdiff)