run_mergetool contains the common functionality for launching mergetools. There's some context-specific behavior but overall it's better to have all of this stuff in one place versus multiple places. Signed-off-by: David Aguilar <davvid@xxxxxxxxx> --- Include fixups from Markus Documentation/git-mergetool-lib.txt | 10 +++ git-mergetool-lib.sh | 141 +++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 0 deletions(-) diff --git a/Documentation/git-mergetool-lib.txt b/Documentation/git-mergetool-lib.txt index a8d62f5..7377774 100644 --- a/Documentation/git-mergetool-lib.txt +++ b/Documentation/git-mergetool-lib.txt @@ -29,6 +29,16 @@ FUNCTIONS get_merge_tool_path:: returns the `merge_tool_path` for a `merge_tool`. +run_mergetool:: + launches a merge tool given the tool name and a true/false + flag to indicate whether a merge base is present + +valid_tool:: + tests whether a merge tool is setup correctly. + +get_custom_cmd:: + given a merge tool, returns the custom command for that tool. + Author ------ Written by David Aguilar <davvid@xxxxxxxxx> diff --git a/git-mergetool-lib.sh b/git-mergetool-lib.sh index 5f9ba97..d28be68 100644 --- a/git-mergetool-lib.sh +++ b/git-mergetool-lib.sh @@ -3,7 +3,12 @@ diff_mode() { test $TOOL_MODE = "diff" } +merge_mode() { + test $TOOL_MODE = "merge" +} + get_merge_tool_path () { + path="$1" if test -z "$2"; then case "$1" in emerge) @@ -17,6 +22,11 @@ get_merge_tool_path () { echo "$path" } +# Overridden in git-mergetool +check_unchanged () { + true +} + valid_tool () { case "$1" in kdiff3 | kompare | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge) @@ -40,3 +50,134 @@ get_custom_cmd () { test -n "$custom_cmd" && echo "$custom_cmd" } + +run_mergetool () { + base_present="$2" + if diff_mode; then + base_present="false" + fi + if test -z "$base_present"; then + base_present="true" + fi + + case "$1" in + kdiff3) + 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=$? + ;; + kompare) + "$merge_tool_path" "$LOCAL" "$REMOTE" + status=$? + ;; + tkdiff) + if $base_present; then + "$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE" + else + if merge_mode; then + "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE" + else + "$merge_tool_path" "$LOCAL" "$REMOTE" + fi + fi + status=$? + ;; + meld) + if merge_mode; then + touch "$BACKUP" + "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" + else + "$merge_tool_path" "$LOCAL" "$REMOTE" + fi + check_unchanged + ;; + vimdiff) + if merge_mode; then + touch "$BACKUP" + "$merge_tool_path" -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE" + check_unchanged + else + "$merge_tool_path" -c "wincmd l" "$LOCAL" "$REMOTE" + fi + ;; + gvimdiff) + if merge_mode; then + touch "$BACKUP" + "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$MERGED" "$REMOTE" + check_unchanged + else + "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$REMOTE" + fi + ;; + xxdiff) + merge_mode && touch "$BACKUP" + if $base_present; then + "$merge_tool_path" -X --show-merged-pane \ + -R 'Accel.SaveAsMerged: "Ctrl-S"' \ + -R 'Accel.Search: "Ctrl+F"' \ + -R 'Accel.SearchForward: "Ctrl-G"' \ + --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE" + else + merge_mode && extra=--show-merged-pane + "$merge_tool_path" -X $extra \ + -R 'Accel.SaveAsMerged: "Ctrl-S"' \ + -R 'Accel.Search: "Ctrl+F"' \ + -R 'Accel.SearchForward: "Ctrl-G"' \ + --merged-file "$MERGED" "$LOCAL" "$REMOTE" + fi + check_unchanged + ;; + opendiff) + merge_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 + check_unchanged + ;; + ecmerge) + merge_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 + 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 merge_mode && + test "$merge_tool_trust_exit_code" = "false"; then + touch "$BACKUP" + ( eval $merge_tool_cmd ) + check_unchanged + else + ( eval $merge_tool_cmd ) + status=$? + fi + fi + ;; + esac +} -- 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