This function launches merge tools and will be used to refactor git-(diff|merge)tool. Signed-off-by: David Aguilar <davvid@xxxxxxxxx> --- Documentation/git-sh-tools.txt | 3 + git-sh-tools.sh | 147 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 142 insertions(+), 8 deletions(-) diff --git a/Documentation/git-sh-tools.txt b/Documentation/git-sh-tools.txt index 055a10c..68d1b37 100644 --- a/Documentation/git-sh-tools.txt +++ b/Documentation/git-sh-tools.txt @@ -36,6 +36,9 @@ init_merge_tool_path:: sets up `$merge_tool_path` according to '(diff|merge)tool.<tool>.path' configurations. +run_merge_tool:: + runs the specified merge tool. + Author ------ Written by David Aguilar <davvid@xxxxxxxxx> diff --git a/git-sh-tools.sh b/git-sh-tools.sh index 234bac7..5c7bd18 100644 --- a/git-sh-tools.sh +++ b/git-sh-tools.sh @@ -12,29 +12,34 @@ valid_tool() { esac } +# Test whether we're in merge mode +mergetool_mode() +{ + test "$TOOL_MODE" = "merge" +} + # Verifies that (difftool|mergetool).<tool>.cmd exists # Requires $TOOL_MODE to be set. valid_custom_tool() { - if test "$TOOL_MODE" = "diff"; then - merge_tool_cmd="$(git config difftool.$1.cmd)" - test -z "$merge_tool_cmd" && + if mergetool_mode; then merge_tool_cmd="$(git config mergetool.$1.cmd)" test -n "$merge_tool_cmd" - elif test "$TOOL_MODE" = "merge"; then + else + merge_tool_cmd="$(git config difftool.$1.cmd)" + test -z "$merge_tool_cmd" && merge_tool_cmd="$(git config mergetool.$1.cmd)" test -n "$merge_tool_cmd" fi } - # Set up $merge_tool_path for (diff|merge)tool.<tool>.path configurations init_merge_tool_path() { - if test "$TOOL_MODE" = "diff"; then + if mergetool_mode; then + merge_tool_path=$(git config mergetool."$1".path) + else merge_tool_path=$(git config difftool."$1".path) test -z "$merge_tool_path" && merge_tool_path=$(git config mergetool."$1".path) - elif test "$TOOL_MODE" = "merge"; then - merge_tool_path=$(git config mergetool."$1".path) fi if test -z "$merge_tool_path" ; then @@ -48,3 +53,129 @@ init_merge_tool_path() { esac fi } + +# Runs a side-by-side merge tool +run_merge_tool() +{ + merge_tool="$1" + + # base_present is always false when !mergetool_mode + case "$merge_tool" in + kdiff3) + if mergetool_mode; then + base=Baes + local=Local + remote=Remote + else + base=A + local=A + remote=B + fi + if base_present; then + ("$merge_tool_path" --auto \ + --L1 "$MERGED ($base)" \ + --L2 "$MERGED ($local)" \ + --L3 "$MERGED ($remote)" \ + -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" \ + > /dev/null 2>&1) + else + ("$merge_tool_path" --auto \ + --L1 "$MERGED ($local)" \ + --L2 "$MERGED ($remote)" \ + -o "$MERGED" "$LOCAL" "$REMOTE" \ + > /dev/null 2>&1) + fi + status=$? + ;; + tkdiff) + if base_present; then + "$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE" + else + "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE" + fi + status=$? + ;; + meld) + mergetool_mode && touch "$BACKUP" + "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" + mergetool_mode && check_unchanged + ;; + vimdiff) + mergetool_mode && touch "$BACKUP" + "$merge_tool_path" -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE" + mergetool_mode && check_unchanged + ;; + gvimdiff) + mergetool_mode && touch "$BACKUP" + "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$MERGED" "$REMOTE" + mergetool_mode && check_unchanged + ;; + xxdiff) + if mergetool_mode; then + touch "$BACKUP" + xtra_args='--show-merged-pane' + else + xtra_args= + fi + if base_present; then + "$merge_tool_path" -X $xtra_args \ + -R 'Accel.SaveAsMerged: "Ctrl-S"' \ + -R 'Accel.Search: "Ctrl+F"' \ + -R 'Accel.SearchForward: "Ctrl-G"' \ + --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE" + else + "$merge_tool_path" -X $xtra_args \ + -R 'Accel.SaveAsMerged: "Ctrl-S"' \ + -R 'Accel.Search: "Ctrl+F"' \ + -R 'Accel.SearchForward: "Ctrl-G"' \ + --merged-file "$MERGED" "$LOCAL" "$REMOTE" + fi + mergetool_mode && check_unchanged + ;; + opendiff) + mergetool_mode && touch "$BACKUP" + if base_present; then + "$merge_tool_path" "$LOCAL" "$REMOTE" \ + -ancestor "$BASE" -merge "$MERGED" | cat + else + "$merge_tool_path" "$LOCAL" "$REMOTE" \ + -merge "$MERGED" | cat + fi + mergetool_mode && check_unchanged + ;; + ecmerge) + mergetool_mode && touch "$BACKUP" + if base_present; then + "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \ + --default --mode=merge3 --to="$MERGED" + else + "$merge_tool_path" "$LOCAL" "$REMOTE" \ + --default --mode=merge2 --to="$MERGED" + fi + mergetool_mode && check_unchanged + ;; + emerge) + if base_present ; then + "$merge_tool_path" -f emerge-files-with-ancestor-command \ + "$LOCAL" "$REMOTE" "$BASE" "$(basename "$MERGED")" + else + "$merge_tool_path" -f emerge-files-command \ + "$LOCAL" "$REMOTE" "$(basename "$MERGED")" + fi + status=$? + ;; + *) + if test -n "$merge_tool_cmd"; then + if test "$merge_tool_trust_exit_code" = "false"; then + mergetool_mode && touch "$BACKUP" + ( eval $merge_tool_cmd ) + mergetool_mode && check_unchanged + else + ( eval $merge_tool_cmd ) + status=$? + fi + fi + ;; + esac + return $status +} -- 1.6.1.3 -- 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