git-gui: Support more merge tools.
authorAlexander Gavrilov <angavrilov@gmail.com>
Sat, 30 Aug 2008 20:59:47 +0000 (00:59 +0400)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 5 Sep 2008 04:28:55 +0000 (21:28 -0700)
Add native support for Araxis Merge, WinMerge and Perforce merge.

Custom merge tools are not implemented by mergetool.tcl; besides,
native support allows constructing the command lines in a more
intelligent way.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
lib/mergetool.tcl
index ba9e8cee8c2d2ce7bdb57620b7d3ce4e83f18090..5f3da1f6235bc1b8cf0961f5203e95ee205f2ae8 100644 (file)
@@ -131,6 +131,7 @@ proc merge_resolve_tool2 {} {
        if {$merge_tool_path eq {}} {
                switch -- $tool {
                emerge { set merge_tool_path "emacs" }
+               araxis { set merge_tool_path "compare" }
                default { set merge_tool_path $tool }
                }
        }
@@ -210,6 +211,31 @@ proc merge_resolve_tool2 {} {
                                        "$LOCAL" "$REMOTE" "$basename"]
                }
        }
+       winmerge {
+               if {$base_stage ne {}} {
+                       # This tool does not support 3-way merges.
+                       # Use the 'conflict file' resolution feature instead.
+                       set cmdline [list "$merge_tool_path" -e -ub "$MERGED"]
+               } else {
+                       set cmdline [list "$merge_tool_path" -e -ub -wl \
+                               -dl "Theirs File" -dr "Mine File" "$REMOTE" "$LOCAL" "$MERGED"]
+               }
+       }
+       araxis {
+               if {$base_stage ne {}} {
+                       set cmdline [list "$merge_tool_path" -wait -merge -3 -a1 \
+                               -title1:"'$MERGED (Base)'" -title2:"'$MERGED (Local)'" \
+                               -title3:"'$MERGED (Remote)'" \
+                               "$BASE" "$LOCAL" "$REMOTE" "$MERGED"]
+               } else {
+                       set cmdline [list "$merge_tool_path" -wait -2 \
+                                -title1:"'$MERGED (Local)'" -title2:"'$MERGED (Remote)'" \
+                                "$LOCAL" "$REMOTE" "$MERGED"]
+               }
+       }
+       p4merge {
+               set cmdline [list "$merge_tool_path" "$BASE" "$REMOTE" "$LOCAL" "$MERGED"]
+       }
        vimdiff {
                error_popup [mc "Not a GUI merge tool: '%s'" $tool]
                return
@@ -236,6 +262,7 @@ proc merge_tool_get_stages {target stages} {
        foreach fname $stages {
                if {$merge_stages($i) eq {}} {
                        file delete $fname
+                       catch { close [open $fname w] }
                } else {
                        # A hack to support autocrlf properly
                        git checkout-index -f --stage=$i -- $target