From fdd7aa17f805b376f49a1bf031bf1b88eec89ddf Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Thu, 18 Aug 2011 00:23:44 -0700 Subject: [PATCH 1/4] difftool--helper: Make style consistent with git Use the predominant conditional style where "then" appears alone on the line after the test expression. Signed-off-by: David Aguilar Signed-off-by: Junio C Hamano --- git-difftool--helper.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/git-difftool--helper.sh b/git-difftool--helper.sh index 0594bf7ca5..8452890be9 100755 --- a/git-difftool--helper.sh +++ b/git-difftool--helper.sh @@ -13,7 +13,8 @@ TOOL_MODE=diff should_prompt () { prompt_merge=$(git config --bool mergetool.prompt || echo true) prompt=$(git config --bool difftool.prompt || echo $prompt_merge) - if test "$prompt" = true; then + if test "$prompt" = true + then test -z "$GIT_DIFFTOOL_NO_PROMPT" else test -n "$GIT_DIFFTOOL_PROMPT" @@ -37,9 +38,11 @@ launch_merge_tool () { # $LOCAL and $REMOTE are temporary files so prompt # the user with the real $MERGED name before launching $merge_tool. - if should_prompt; then + if should_prompt + then printf "\nViewing: '$MERGED'\n" - if use_ext_cmd; then + if use_ext_cmd + then printf "Hit return to launch '%s': " \ "$GIT_DIFFTOOL_EXTCMD" else @@ -48,7 +51,8 @@ launch_merge_tool () { read ans fi - if use_ext_cmd; then + if use_ext_cmd + then export BASE eval $GIT_DIFFTOOL_EXTCMD '"$LOCAL"' '"$REMOTE"' else @@ -56,8 +60,10 @@ launch_merge_tool () { fi } -if ! use_ext_cmd; then - if test -n "$GIT_DIFF_TOOL"; then +if ! use_ext_cmd +then + if test -n "$GIT_DIFF_TOOL" + then merge_tool="$GIT_DIFF_TOOL" else merge_tool="$(get_merge_tool)" || exit From 240dc3e8edb3ae4ee968febc006fa761811c60e6 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Thu, 18 Aug 2011 00:23:45 -0700 Subject: [PATCH 2/4] mergetool--lib: Make style consistent with git Use the predominant conditional style where "then" appears alone on the line after the test expression. Remove spaces after ">" output redirections. Remove unnecessary parentheses around the kdiff3 commands. Signed-off-by: David Aguilar Signed-off-by: Junio C Hamano --- git-mergetool--lib.sh | 153 +++++++++++++++++++++++++++--------------- 1 file changed, 100 insertions(+), 53 deletions(-) diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index 9a89e8f319..5820a6354a 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -32,10 +32,12 @@ translate_merge_tool_path () { } check_unchanged () { - if test "$MERGED" -nt "$BACKUP"; then + if test "$MERGED" -nt "$BACKUP" + then status=0 else - while true; do + while true + do echo "$MERGED seems unchanged." printf "Was the merge successful? [y/n] " read answer @@ -53,17 +55,20 @@ valid_tool () { kdiff3 | meld | opendiff | p4merge | tkdiff | vimdiff | vimdiff2 | xxdiff) ;; # happy kompare) - if ! diff_mode; then + if ! diff_mode + then return 1 fi ;; tortoisemerge) - if ! merge_mode; then + if ! merge_mode + then return 1 fi ;; *) - if test -z "$(get_merge_tool_cmd "$1")"; then + if test -z "$(get_merge_tool_cmd "$1")" + then return 1 fi ;; @@ -72,12 +77,14 @@ valid_tool () { get_merge_tool_cmd () { # Prints the custom command for a merge tool - if test -n "$1"; then + if test -n "$1" + then merge_tool="$1" else merge_tool="$(get_merge_tool)" fi - if diff_mode; then + if diff_mode + then echo "$(git config difftool.$merge_tool.cmd || git config mergetool.$merge_tool.cmd)" else @@ -97,9 +104,11 @@ run_merge_tool () { case "$1" in araxis) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" -wait -merge -3 -a1 \ "$BASE" "$LOCAL" "$REMOTE" "$MERGED" \ >/dev/null 2>&1 @@ -115,9 +124,11 @@ run_merge_tool () { fi ;; bc3) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \ -mergeoutput="$MERGED" else @@ -130,9 +141,11 @@ run_merge_tool () { fi ;; diffuse) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" \ "$LOCAL" "$MERGED" "$REMOTE" \ "$BASE" | cat @@ -146,9 +159,11 @@ run_merge_tool () { fi ;; ecmerge) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \ --default --mode=merge3 --to="$MERGED" else @@ -162,8 +177,10 @@ run_merge_tool () { fi ;; emerge) - if merge_mode; then - if $base_present; then + if merge_mode + then + if $base_present + then "$merge_tool_path" \ -f emerge-files-with-ancestor-command \ "$LOCAL" "$REMOTE" "$BASE" \ @@ -181,9 +198,11 @@ run_merge_tool () { fi ;; gvimdiff|vimdiff) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" -f -d -c "wincmd J" \ "$MERGED" "$LOCAL" "$BASE" "$REMOTE" else @@ -198,7 +217,8 @@ run_merge_tool () { fi ;; gvimdiff2|vimdiff2) - if merge_mode; then + if merge_mode + then touch "$BACKUP" "$merge_tool_path" -f -d -c "wincmd l" \ "$LOCAL" "$MERGED" "$REMOTE" @@ -210,36 +230,39 @@ run_merge_tool () { fi ;; kdiff3) - if merge_mode; then - if $base_present; then - ("$merge_tool_path" --auto \ + if merge_mode + then + 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) + >/dev/null 2>&1 else - ("$merge_tool_path" --auto \ + "$merge_tool_path" --auto \ --L1 "$MERGED (Local)" \ --L2 "$MERGED (Remote)" \ -o "$MERGED" \ "$LOCAL" "$REMOTE" \ - > /dev/null 2>&1) + >/dev/null 2>&1 fi status=$? else - ("$merge_tool_path" --auto \ + "$merge_tool_path" --auto \ --L1 "$MERGED (A)" \ --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \ - > /dev/null 2>&1) + >/dev/null 2>&1 fi ;; kompare) "$merge_tool_path" "$LOCAL" "$REMOTE" ;; meld) - if merge_mode; then + if merge_mode + then touch "$BACKUP" "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" check_unchanged @@ -248,9 +271,11 @@ run_merge_tool () { fi ;; opendiff) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" "$LOCAL" "$REMOTE" \ -ancestor "$BASE" \ -merge "$MERGED" | cat @@ -264,7 +289,8 @@ run_merge_tool () { fi ;; p4merge) - if merge_mode; then + if merge_mode + then touch "$BACKUP" $base_present || >"$BASE" "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED" @@ -274,8 +300,10 @@ run_merge_tool () { fi ;; tkdiff) - if merge_mode; then - if $base_present; then + if merge_mode + then + if $base_present + then "$merge_tool_path" -a "$BASE" \ -o "$MERGED" "$LOCAL" "$REMOTE" else @@ -288,7 +316,8 @@ run_merge_tool () { fi ;; tortoisemerge) - if $base_present; then + if $base_present + then touch "$BACKUP" "$merge_tool_path" \ -base:"$BASE" -mine:"$LOCAL" \ @@ -300,9 +329,11 @@ run_merge_tool () { fi ;; xxdiff) - if merge_mode; then + if merge_mode + then touch "$BACKUP" - if $base_present; then + if $base_present + then "$merge_tool_path" -X --show-merged-pane \ -R 'Accel.SaveAsMerged: "Ctrl-S"' \ -R 'Accel.Search: "Ctrl+F"' \ @@ -327,16 +358,20 @@ run_merge_tool () { ;; *) merge_tool_cmd="$(get_merge_tool_cmd "$1")" - if test -z "$merge_tool_cmd"; then - if merge_mode; then + if test -z "$merge_tool_cmd" + then + if merge_mode + then status=1 fi break fi - if merge_mode; then + if merge_mode + then trust_exit_code="$(git config --bool \ mergetool."$1".trustExitCode || echo false)" - if test "$trust_exit_code" = "false"; then + if test "$trust_exit_code" = "false" + then touch "$BACKUP" ( eval $merge_tool_cmd ) check_unchanged @@ -353,13 +388,16 @@ run_merge_tool () { } guess_merge_tool () { - if merge_mode; then + if merge_mode + then tools="tortoisemerge" else tools="kompare" fi - if test -n "$DISPLAY"; then - if test -n "$GNOME_DESKTOP_SESSION_ID" ; then + if test -n "$DISPLAY" + then + if test -n "$GNOME_DESKTOP_SESSION_ID" + then tools="meld opendiff kdiff3 tkdiff xxdiff $tools" else tools="opendiff kdiff3 tkdiff xxdiff meld $tools" @@ -380,7 +418,8 @@ guess_merge_tool () { for i in $tools do merge_tool_path="$(translate_merge_tool_path "$i")" - if type "$merge_tool_path" > /dev/null 2>&1; then + if type "$merge_tool_path" >/dev/null 2>&1 + then echo "$i" return 0 fi @@ -393,12 +432,14 @@ guess_merge_tool () { get_configured_merge_tool () { # Diff mode first tries diff.tool and falls back to merge.tool. # Merge mode only checks merge.tool - if diff_mode; then + if diff_mode + then merge_tool=$(git config diff.tool || git config merge.tool) else merge_tool=$(git config merge.tool) fi - if test -n "$merge_tool" && ! valid_tool "$merge_tool"; then + if test -n "$merge_tool" && ! valid_tool "$merge_tool" + then echo >&2 "git config option $TOOL_MODE.tool set to unknown tool: $merge_tool" echo >&2 "Resetting to default..." return 1 @@ -408,26 +449,31 @@ get_configured_merge_tool () { get_merge_tool_path () { # A merge tool has been set, so verify that it's valid. - if test -n "$1"; then + if test -n "$1" + then merge_tool="$1" else merge_tool="$(get_merge_tool)" fi - if ! valid_tool "$merge_tool"; then + if ! valid_tool "$merge_tool" + then echo >&2 "Unknown merge tool $merge_tool" exit 1 fi - if diff_mode; then + if diff_mode + then merge_tool_path=$(git config difftool."$merge_tool".path || git config mergetool."$merge_tool".path) else merge_tool_path=$(git config mergetool."$merge_tool".path) fi - if test -z "$merge_tool_path"; then + if test -z "$merge_tool_path" + then merge_tool_path="$(translate_merge_tool_path "$merge_tool")" fi if test -z "$(get_merge_tool_cmd "$merge_tool")" && - ! type "$merge_tool_path" > /dev/null 2>&1; then + ! type "$merge_tool_path" >/dev/null 2>&1 + then echo >&2 "The $TOOL_MODE tool $merge_tool is not available as"\ "'$merge_tool_path'" exit 1 @@ -439,7 +485,8 @@ get_merge_tool () { # Check if a merge tool has been configured merge_tool=$(get_configured_merge_tool) # Try to guess an appropriate merge tool if no tool has been set. - if test -z "$merge_tool"; then + if test -z "$merge_tool" + then merge_tool="$(guess_merge_tool)" || exit fi echo "$merge_tool" From bc7a96a8965d4ce0651689301e1702a942dfb9f0 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Thu, 18 Aug 2011 00:23:46 -0700 Subject: [PATCH 3/4] mergetool--lib: Refactor tools into separate files Individual merge tools are now defined in a mergetools/$tool file which is sourced at runtime. The individual files are installed into $(git --exec-path)/mergetools/. New tools can be added by creating a new file instead of editing the git-mergetool--lib.sh scriptlet. http://thread.gmane.org/gmane.comp.version-control.git/134906/focus=135006 Signed-off-by: David Aguilar Signed-off-by: Junio C Hamano --- Makefile | 11 ++ git-mergetool--lib.sh | 385 ++++++--------------------------------- mergetools/araxis | 20 ++ mergetools/bc3 | 20 ++ mergetools/defaults | 46 +++++ mergetools/diffuse | 17 ++ mergetools/ecmerge | 16 ++ mergetools/emerge | 23 +++ mergetools/kdiff3 | 24 +++ mergetools/kompare | 7 + mergetools/meld | 9 + mergetools/opendiff | 16 ++ mergetools/p4merge | 10 + mergetools/tkdiff | 12 ++ mergetools/tortoisemerge | 17 ++ mergetools/vim | 44 +++++ mergetools/xxdiff | 25 +++ 17 files changed, 369 insertions(+), 333 deletions(-) create mode 100644 mergetools/araxis create mode 100644 mergetools/bc3 create mode 100644 mergetools/defaults create mode 100644 mergetools/diffuse create mode 100644 mergetools/ecmerge create mode 100644 mergetools/emerge create mode 100644 mergetools/kdiff3 create mode 100644 mergetools/kompare create mode 100644 mergetools/meld create mode 100644 mergetools/opendiff create mode 100644 mergetools/p4merge create mode 100644 mergetools/tkdiff create mode 100644 mergetools/tortoisemerge create mode 100644 mergetools/vim create mode 100644 mergetools/xxdiff diff --git a/Makefile b/Makefile index 89cc6245a7..1e91b19c4d 100644 --- a/Makefile +++ b/Makefile @@ -302,6 +302,7 @@ bindir = $(prefix)/$(bindir_relative) mandir = share/man infodir = share/info gitexecdir = libexec/git-core +mergetoolsdir = $(gitexecdir)/mergetools sharedir = $(prefix)/share gitwebdir = $(sharedir)/gitweb template_dir = share/git-core/templates @@ -2257,6 +2258,13 @@ endif gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir)) export gitexec_instdir +ifneq ($(filter /%,$(firstword $(mergetoolsdir))),) +mergetools_instdir = $(mergetoolsdir) +else +mergetools_instdir = $(prefix)/$(mergetoolsdir) +endif +mergetools_instdir_SQ = $(subst ','\'',$(mergetools_instdir)) + install_bindir_programs := $(patsubst %,%$X,$(BINDIR_PROGRAMS_NEED_X)) $(BINDIR_PROGRAMS_NO_X) install: all @@ -2266,6 +2274,9 @@ install: all $(INSTALL) -m 644 $(SCRIPT_LIB) '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' $(INSTALL) $(install_bindir_programs) '$(DESTDIR_SQ)$(bindir_SQ)' $(MAKE) -C templates DESTDIR='$(DESTDIR_SQ)' install + $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' + (cd mergetools && $(TAR) cf - .) | \ + (cd '$(DESTDIR_SQ)$(mergetools_instdir_SQ)' && umask 022 && $(TAR) xof -) ifndef NO_PERL $(MAKE) -C perl prefix='$(prefix_SQ)' DESTDIR='$(DESTDIR_SQ)' install $(MAKE) -C gitweb install diff --git a/git-mergetool--lib.sh b/git-mergetool--lib.sh index 5820a6354a..8fc65d0400 100644 --- a/git-mergetool--lib.sh +++ b/git-mergetool--lib.sh @@ -9,26 +9,7 @@ merge_mode() { } translate_merge_tool_path () { - case "$1" in - araxis) - echo compare - ;; - bc3) - echo bcompare - ;; - emerge) - echo emacs - ;; - gvimdiff|gvimdiff2) - echo gvim - ;; - vimdiff|vimdiff2) - echo vim - ;; - *) - echo "$1" - ;; - esac + echo "$1" } check_unchanged () { @@ -49,40 +30,55 @@ check_unchanged () { fi } +valid_tool_config () { + if test -n "$(get_merge_tool_cmd "$1")" + then + return 0 + else + return 1 + fi +} + valid_tool () { + setup_tool "$1" || valid_tool_config "$1" +} + +setup_tool () { case "$1" in - araxis | bc3 | diffuse | ecmerge | emerge | gvimdiff | gvimdiff2 | \ - kdiff3 | meld | opendiff | p4merge | tkdiff | vimdiff | vimdiff2 | xxdiff) - ;; # happy - kompare) - if ! diff_mode - then - return 1 - fi - ;; - tortoisemerge) - if ! merge_mode - then - return 1 - fi + vim*|gvim*) + tool=vim ;; *) - if test -z "$(get_merge_tool_cmd "$1")" - then - return 1 - fi + tool="$1" ;; esac + mergetools="$(git --exec-path)/mergetools" + + # Load the default definitions + . "$mergetools/defaults" + if ! test -f "$mergetools/$tool" + then + return 1 + fi + + # Load the redefined functions + . "$mergetools/$tool" + + if merge_mode && ! can_merge + then + echo "error: '$tool' can not be used to resolve merges" >&2 + exit 1 + elif diff_mode && ! can_diff + then + echo "error: '$tool' can only be used to resolve merges" >&2 + exit 1 + fi + return 0 } get_merge_tool_cmd () { # Prints the custom command for a merge tool - if test -n "$1" - then - merge_tool="$1" - else - merge_tool="$(get_merge_tool)" - fi + merge_tool="$1" if diff_mode then echo "$(git config difftool.$merge_tool.cmd || @@ -92,6 +88,7 @@ get_merge_tool_cmd () { fi } +# Entry point for running tools run_merge_tool () { # If GIT_PREFIX is empty then we cannot use it in tools # that expect to be able to chdir() to its value. @@ -102,288 +99,15 @@ run_merge_tool () { base_present="$2" status=0 - case "$1" in - araxis) - if merge_mode - then - touch "$BACKUP" - if $base_present - then - "$merge_tool_path" -wait -merge -3 -a1 \ - "$BASE" "$LOCAL" "$REMOTE" "$MERGED" \ - >/dev/null 2>&1 - else - "$merge_tool_path" -wait -2 \ - "$LOCAL" "$REMOTE" "$MERGED" \ - >/dev/null 2>&1 - fi - check_unchanged - else - "$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" \ - >/dev/null 2>&1 - fi - ;; - bc3) - if merge_mode - then - touch "$BACKUP" - if $base_present - then - "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \ - -mergeoutput="$MERGED" - else - "$merge_tool_path" "$LOCAL" "$REMOTE" \ - -mergeoutput="$MERGED" - fi - check_unchanged - else - "$merge_tool_path" "$LOCAL" "$REMOTE" - fi - ;; - diffuse) - if merge_mode - then - touch "$BACKUP" - if $base_present - then - "$merge_tool_path" \ - "$LOCAL" "$MERGED" "$REMOTE" \ - "$BASE" | cat - else - "$merge_tool_path" \ - "$LOCAL" "$MERGED" "$REMOTE" | cat - fi - check_unchanged - else - "$merge_tool_path" "$LOCAL" "$REMOTE" | cat - fi - ;; - ecmerge) - if merge_mode - then - 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 - else - "$merge_tool_path" --default --mode=diff2 \ - "$LOCAL" "$REMOTE" - fi - ;; - emerge) - if merge_mode - then - 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=$? - else - "$merge_tool_path" -f emerge-files-command \ - "$LOCAL" "$REMOTE" - fi - ;; - gvimdiff|vimdiff) - if merge_mode - then - touch "$BACKUP" - if $base_present - then - "$merge_tool_path" -f -d -c "wincmd J" \ - "$MERGED" "$LOCAL" "$BASE" "$REMOTE" - else - "$merge_tool_path" -f -d -c "wincmd l" \ - "$LOCAL" "$MERGED" "$REMOTE" - fi - check_unchanged - else - "$merge_tool_path" -R -f -d -c "wincmd l" \ - -c 'cd $GIT_PREFIX' \ - "$LOCAL" "$REMOTE" - fi - ;; - gvimdiff2|vimdiff2) - if merge_mode - then - touch "$BACKUP" - "$merge_tool_path" -f -d -c "wincmd l" \ - "$LOCAL" "$MERGED" "$REMOTE" - check_unchanged - else - "$merge_tool_path" -R -f -d -c "wincmd l" \ - -c 'cd $GIT_PREFIX' \ - "$LOCAL" "$REMOTE" - fi - ;; - kdiff3) - if merge_mode - then - 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=$? - else - "$merge_tool_path" --auto \ - --L1 "$MERGED (A)" \ - --L2 "$MERGED (B)" "$LOCAL" "$REMOTE" \ - >/dev/null 2>&1 - fi - ;; - kompare) - "$merge_tool_path" "$LOCAL" "$REMOTE" - ;; - meld) - if merge_mode - then - touch "$BACKUP" - "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" - check_unchanged - else - "$merge_tool_path" "$LOCAL" "$REMOTE" - fi - ;; - opendiff) - if merge_mode - then - 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 - else - "$merge_tool_path" "$LOCAL" "$REMOTE" | cat - fi - ;; - p4merge) - if merge_mode - then - touch "$BACKUP" - $base_present || >"$BASE" - "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED" - check_unchanged - else - "$merge_tool_path" "$LOCAL" "$REMOTE" - fi - ;; - tkdiff) - if merge_mode - then - if $base_present - then - "$merge_tool_path" -a "$BASE" \ - -o "$MERGED" "$LOCAL" "$REMOTE" - else - "$merge_tool_path" \ - -o "$MERGED" "$LOCAL" "$REMOTE" - fi - status=$? - else - "$merge_tool_path" "$LOCAL" "$REMOTE" - fi - ;; - tortoisemerge) - if $base_present - then - touch "$BACKUP" - "$merge_tool_path" \ - -base:"$BASE" -mine:"$LOCAL" \ - -theirs:"$REMOTE" -merged:"$MERGED" - check_unchanged - else - echo "TortoiseMerge cannot be used without a base" 1>&2 - status=1 - fi - ;; - xxdiff) - if merge_mode - then - 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_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 - else - "$merge_tool_path" \ - -R 'Accel.Search: "Ctrl+F"' \ - -R 'Accel.SearchForward: "Ctrl-G"' \ - "$LOCAL" "$REMOTE" - fi - ;; - *) - merge_tool_cmd="$(get_merge_tool_cmd "$1")" - if test -z "$merge_tool_cmd" - then - if merge_mode - then - status=1 - fi - break - fi - if merge_mode - then - trust_exit_code="$(git config --bool \ - mergetool."$1".trustExitCode || echo false)" - if test "$trust_exit_code" = "false" - then - touch "$BACKUP" - ( eval $merge_tool_cmd ) - check_unchanged - else - ( eval $merge_tool_cmd ) - status=$? - fi - else - ( eval $merge_tool_cmd ) - fi - ;; - esac + # Bring tool-specific functions into scope + setup_tool "$1" + + if merge_mode + then + merge_cmd "$1" + else + diff_cmd "$1" + fi return $status } @@ -449,12 +173,7 @@ get_configured_merge_tool () { get_merge_tool_path () { # A merge tool has been set, so verify that it's valid. - if test -n "$1" - then - merge_tool="$1" - else - merge_tool="$(get_merge_tool)" - fi + merge_tool="$1" if ! valid_tool "$merge_tool" then echo >&2 "Unknown merge tool $merge_tool" @@ -483,7 +202,7 @@ get_merge_tool_path () { get_merge_tool () { # Check if a merge tool has been configured - merge_tool=$(get_configured_merge_tool) + merge_tool="$(get_configured_merge_tool)" # Try to guess an appropriate merge tool if no tool has been set. if test -z "$merge_tool" then diff --git a/mergetools/araxis b/mergetools/araxis new file mode 100644 index 0000000000..64f97c5e97 --- /dev/null +++ b/mergetools/araxis @@ -0,0 +1,20 @@ +diff_cmd () { + "$merge_tool_path" -wait -2 "$LOCAL" "$REMOTE" >/dev/null 2>&1 +} + +merge_cmd () { + touch "$BACKUP" + if $base_present + then + "$merge_tool_path" -wait -merge -3 -a1 \ + "$BASE" "$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1 + else + "$merge_tool_path" -wait -2 \ + "$LOCAL" "$REMOTE" "$MERGED" >/dev/null 2>&1 + fi + check_unchanged +} + +translate_merge_tool_path() { + echo compare +} diff --git a/mergetools/bc3 b/mergetools/bc3 new file mode 100644 index 0000000000..27b3dd48b8 --- /dev/null +++ b/mergetools/bc3 @@ -0,0 +1,20 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} + +merge_cmd () { + touch "$BACKUP" + if $base_present + then + "$merge_tool_path" "$LOCAL" "$REMOTE" "$BASE" \ + -mergeoutput="$MERGED" + else + "$merge_tool_path" "$LOCAL" "$REMOTE" \ + -mergeoutput="$MERGED" + fi + check_unchanged +} + +translate_merge_tool_path() { + echo bcompare +} diff --git a/mergetools/defaults b/mergetools/defaults new file mode 100644 index 0000000000..1d8f2a3dd3 --- /dev/null +++ b/mergetools/defaults @@ -0,0 +1,46 @@ +# Redefined by builtin tools +can_merge () { + return 0 +} + +can_diff () { + return 0 +} + +diff_cmd () { + merge_tool_cmd="$(get_merge_tool_cmd "$1")" + if test -z "$merge_tool_cmd" + then + status=1 + break + fi + ( eval $merge_tool_cmd ) + status=$? + return $status +} + +merge_cmd () { + merge_tool_cmd="$(get_merge_tool_cmd "$1")" + if test -z "$merge_tool_cmd" + then + status=1 + break + fi + 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 +} + +translate_merge_tool_path () { + echo "$1" +} diff --git a/mergetools/diffuse b/mergetools/diffuse new file mode 100644 index 0000000000..02e0843f47 --- /dev/null +++ b/mergetools/diffuse @@ -0,0 +1,17 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" | cat +} + +merge_cmd () { + touch "$BACKUP" + if $base_present + then + "$merge_tool_path" \ + "$LOCAL" "$MERGED" "$REMOTE" \ + "$BASE" | cat + else + "$merge_tool_path" \ + "$LOCAL" "$MERGED" "$REMOTE" | cat + fi + check_unchanged +} diff --git a/mergetools/ecmerge b/mergetools/ecmerge new file mode 100644 index 0000000000..13c2e439de --- /dev/null +++ b/mergetools/ecmerge @@ -0,0 +1,16 @@ +diff_cmd () { + "$merge_tool_path" --default --mode=diff2 "$LOCAL" "$REMOTE" +} + +merge_cmd () { + 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 +} diff --git a/mergetools/emerge b/mergetools/emerge new file mode 100644 index 0000000000..f96d9e550a --- /dev/null +++ b/mergetools/emerge @@ -0,0 +1,23 @@ +diff_cmd () { + "$merge_tool_path" -f emerge-files-command "$LOCAL" "$REMOTE" +} + +merge_cmd () { + 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=$? +} + +translate_merge_tool_path() { + echo emacs +} diff --git a/mergetools/kdiff3 b/mergetools/kdiff3 new file mode 100644 index 0000000000..28fead428b --- /dev/null +++ b/mergetools/kdiff3 @@ -0,0 +1,24 @@ +diff_cmd () { + "$merge_tool_path" --auto \ + --L1 "$MERGED (A)" --L2 "$MERGED (B)" \ + "$LOCAL" "$REMOTE" >/dev/null 2>&1 +} + +merge_cmd () { + 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=$? +} diff --git a/mergetools/kompare b/mergetools/kompare new file mode 100644 index 0000000000..433686c12a --- /dev/null +++ b/mergetools/kompare @@ -0,0 +1,7 @@ +can_merge () { + return 1 +} + +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} diff --git a/mergetools/meld b/mergetools/meld new file mode 100644 index 0000000000..73d70ae28a --- /dev/null +++ b/mergetools/meld @@ -0,0 +1,9 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} + +merge_cmd () { + touch "$BACKUP" + "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" + check_unchanged +} diff --git a/mergetools/opendiff b/mergetools/opendiff new file mode 100644 index 0000000000..0942b2a733 --- /dev/null +++ b/mergetools/opendiff @@ -0,0 +1,16 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" | cat +} + +merge_cmd () { + 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 +} diff --git a/mergetools/p4merge b/mergetools/p4merge new file mode 100644 index 0000000000..1a45c1b0c5 --- /dev/null +++ b/mergetools/p4merge @@ -0,0 +1,10 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} + +merge_cmd () { + touch "$BACKUP" + $base_present || >"$BASE" + "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" "$MERGED" + check_unchanged +} diff --git a/mergetools/tkdiff b/mergetools/tkdiff new file mode 100644 index 0000000000..618c438e87 --- /dev/null +++ b/mergetools/tkdiff @@ -0,0 +1,12 @@ +diff_cmd () { + "$merge_tool_path" "$LOCAL" "$REMOTE" +} + +merge_cmd () { + if $base_present + then + "$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE" + else + "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE" + fi +} diff --git a/mergetools/tortoisemerge b/mergetools/tortoisemerge new file mode 100644 index 0000000000..ed7db495ed --- /dev/null +++ b/mergetools/tortoisemerge @@ -0,0 +1,17 @@ +can_diff () { + return 1 +} + +merge_cmd () { + if $base_present + then + touch "$BACKUP" + "$merge_tool_path" \ + -base:"$BASE" -mine:"$LOCAL" \ + -theirs:"$REMOTE" -merged:"$MERGED" + check_unchanged + else + echo "TortoiseMerge cannot be used without a base" 1>&2 + return 1 + fi +} diff --git a/mergetools/vim b/mergetools/vim new file mode 100644 index 0000000000..619594ae4b --- /dev/null +++ b/mergetools/vim @@ -0,0 +1,44 @@ +diff_cmd () { + case "$1" in + gvimdiff|vimdiff) + "$merge_tool_path" -R -f -d \ + -c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE" + ;; + gvimdiff2|vimdiff2) + "$merge_tool_path" -R -f -d \ + -c 'wincmd l' -c 'cd $GIT_PREFIX' "$LOCAL" "$REMOTE" + ;; + esac +} + +merge_cmd () { + touch "$BACKUP" + case "$1" in + gvimdiff|vimdiff) + if $base_present + then + "$merge_tool_path" -f -d -c 'wincmd J' \ + "$MERGED" "$LOCAL" "$BASE" "$REMOTE" + else + "$merge_tool_path" -f -d -c 'wincmd l' \ + "$LOCAL" "$MERGED" "$REMOTE" + fi + ;; + gvimdiff2|vimdiff2) + "$merge_tool_path" -f -d -c 'wincmd l' \ + "$LOCAL" "$MERGED" "$REMOTE" + ;; + esac + check_unchanged +} + +translate_merge_tool_path() { + case "$1" in + gvimdiff|gvimdiff2) + echo gvim + ;; + vimdiff|vimdiff2) + echo vim + ;; + esac +} diff --git a/mergetools/xxdiff b/mergetools/xxdiff new file mode 100644 index 0000000000..05b443394b --- /dev/null +++ b/mergetools/xxdiff @@ -0,0 +1,25 @@ +diff_cmd () { + "$merge_tool_path" \ + -R 'Accel.Search: "Ctrl+F"' \ + -R 'Accel.SearchForward: "Ctrl-G"' \ + "$LOCAL" "$REMOTE" +} + +merge_cmd () { + 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_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 +} From f61bd9c68a4ed81afcc1fbbf5b956e781d88b434 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Fri, 19 Aug 2011 02:14:45 -0700 Subject: [PATCH 4/4] mergetools/meld: Use '--output' when available meld 1.5.0 and newer allow the output file to be specified when merging multiple files. Check whether the meld command supports '--output' and use it when available. Signed-off-by: David Aguilar Signed-off-by: Junio C Hamano --- mergetools/meld | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/mergetools/meld b/mergetools/meld index 73d70ae28a..eaa115ccb7 100644 --- a/mergetools/meld +++ b/mergetools/meld @@ -3,7 +3,30 @@ diff_cmd () { } merge_cmd () { + if test -z "${meld_has_output_option:+set}" + then + check_meld_for_output_version + fi touch "$BACKUP" - "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" + if test "$meld_has_output_option" = true + then + "$merge_tool_path" --output "$MERGED" \ + "$LOCAL" "$BASE" "$REMOTE" + else + "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE" + fi check_unchanged } + +# Check whether 'meld --output ' is supported +check_meld_for_output_version () { + meld_path="$(git config mergetool.meld.path)" + meld_path="${meld_path:-meld}" + + if "$meld_path" --output /dev/null --help >/dev/null 2>&1 + then + meld_has_output_option=true + else + meld_has_output_option=false + fi +}