]> asedeno.scripts.mit.edu Git - git.git/blobdiff - lib/merge.tcl
git-gui: Show special diffs for complex conflict cases.
[git.git] / lib / merge.tcl
index f6a2df3c064b3132d7607211656a7aee53638881..5c01875b051305b5b40a17ac7a2245f69081f41b 100644 (file)
@@ -10,10 +10,10 @@ method _can_merge {} {
        global HEAD commit_type file_states
 
        if {[string match amend* $commit_type]} {
        global HEAD commit_type file_states
 
        if {[string match amend* $commit_type]} {
-               info_popup {Cannot merge while amending.
+               info_popup [mc "Cannot merge while amending.
 
 You must finish amending this commit before starting any type of merge.
 
 You must finish amending this commit before starting any type of merge.
-}
+"]
                return 0
        }
 
                return 0
        }
 
@@ -24,12 +24,12 @@ You must finish amending this commit before starting any type of merge.
        #
        repository_state curType curHEAD curMERGE_HEAD
        if {$commit_type ne $curType || $HEAD ne $curHEAD} {
        #
        repository_state curType curHEAD curMERGE_HEAD
        if {$commit_type ne $curType || $HEAD ne $curHEAD} {
-               info_popup {Last scanned state does not match repository state.
+               info_popup [mc "Last scanned state does not match repository state.
 
 Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.
 
 The rescan will be automatically started now.
 
 Another Git program has modified this repository since the last scan.  A rescan must be performed before a merge can be performed.
 
 The rescan will be automatically started now.
-}
+"]
                unlock_index
                rescan ui_ready
                return 0
                unlock_index
                rescan ui_ready
                return 0
@@ -41,22 +41,22 @@ The rescan will be automatically started now.
                        continue; # and pray it works!
                }
                U? {
                        continue; # and pray it works!
                }
                U? {
-                       error_popup "You are in the middle of a conflicted merge.
+                       error_popup [mc "You are in the middle of a conflicted merge.
 
 
-File [short_path $path] has merge conflicts.
+File %s has merge conflicts.
 
 You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.
 
 You must resolve them, stage the file, and commit to complete the current merge.  Only then can you begin another merge.
-"
+" [short_path $path]]
                        unlock_index
                        return 0
                }
                ?? {
                        unlock_index
                        return 0
                }
                ?? {
-                       error_popup "You are in the middle of a change.
+                       error_popup [mc "You are in the middle of a change.
 
 
-File [short_path $path] is modified.
+File %s is modified.
 
 You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.
 
 You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.
-"
+" [short_path $path]]
                        unlock_index
                        return 0
                }
                        unlock_index
                        return 0
                }
@@ -90,9 +90,6 @@ method _start {} {
 
        set spec [$w_rev get_tracking_branch]
        set cmit [$w_rev get_commit]
 
        set spec [$w_rev get_tracking_branch]
        set cmit [$w_rev get_commit]
-       set cmd [list git]
-       lappend cmd merge
-       lappend cmd --strategy=recursive
 
        set fh [open [gitdir FETCH_HEAD] w]
        fconfigure $fh -translation lf
 
        set fh [open [gitdir FETCH_HEAD] w]
        fconfigure $fh -translation lf
@@ -106,19 +103,21 @@ method _start {} {
                        regsub {^[^:@]*@} $remote {} remote
                }
                set branch [lindex $spec 2]
                        regsub {^[^:@]*@} $remote {} remote
                }
                set branch [lindex $spec 2]
-               set stitle "$branch of $remote"
+               set stitle [mc "%s of %s" $branch $remote]
        }
        regsub ^refs/heads/ $branch {} branch
        puts $fh "$cmit\t\tbranch '$branch' of $remote"
        close $fh
 
        }
        regsub ^refs/heads/ $branch {} branch
        puts $fh "$cmit\t\tbranch '$branch' of $remote"
        close $fh
 
+       set cmd [list git]
+       lappend cmd merge
+       lappend cmd --strategy=recursive
        lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]]
        lappend cmd HEAD
        lappend cmd [git fmt-merge-msg <[gitdir FETCH_HEAD]]
        lappend cmd HEAD
-       lappend cmd $cmit
+       lappend cmd $name
 
 
-       set msg "Merging $current_branch and $stitle"
-       ui_status "$msg..."
-       set cons [console::new "Merge" "merge $stitle"]
+       ui_status [mc "Merging %s and %s..." $current_branch $stitle]
+       set cons [console::new [mc "Merge"] "merge $stitle"]
        console::exec $cons $cmd [cb _finish $cons]
 
        wm protocol $w WM_DELETE_WINDOW {}
        console::exec $cons $cmd [cb _finish $cons]
 
        wm protocol $w WM_DELETE_WINDOW {}
@@ -128,9 +127,9 @@ method _start {} {
 method _finish {cons ok} {
        console::done $cons $ok
        if {$ok} {
 method _finish {cons ok} {
        console::done $cons $ok
        if {$ok} {
-               set msg {Merge completed successfully.}
+               set msg [mc "Merge completed successfully."]
        } else {
        } else {
-               set msg {Merge failed.  Conflict resolution is required.}
+               set msg [mc "Merge failed.  Conflict resolution is required."]
        }
        unlock_index
        rescan [list ui_status $msg]
        }
        unlock_index
        rescan [list ui_status $msg]
@@ -147,7 +146,7 @@ constructor dialog {} {
        }
 
        make_toplevel top w
        }
 
        make_toplevel top w
-       wm title $top "[appname] ([reponame]): Merge"
+       wm title $top [append "[appname] ([reponame]): " [mc "Merge"]]
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
        if {$top ne {.}} {
                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
        }
@@ -155,26 +154,26 @@ constructor dialog {} {
        set _start [cb _start]
 
        label $w.header \
        set _start [cb _start]
 
        label $w.header \
-               -text "Merge Into $current_branch" \
+               -text [mc "Merge Into %s" $current_branch] \
                -font font_uibold
        pack $w.header -side top -fill x
 
        frame $w.buttons
        button $w.buttons.visualize \
                -font font_uibold
        pack $w.header -side top -fill x
 
        frame $w.buttons
        button $w.buttons.visualize \
-               -text Visualize \
+               -text [mc Visualize] \
                -command [cb _visualize]
        pack $w.buttons.visualize -side left
        button $w.buttons.merge \
                -command [cb _visualize]
        pack $w.buttons.visualize -side left
        button $w.buttons.merge \
-               -text Merge \
+               -text [mc Merge] \
                -command $_start
        pack $w.buttons.merge -side right
        button $w.buttons.cancel \
                -command $_start
        pack $w.buttons.merge -side right
        button $w.buttons.cancel \
-               -text {Cancel} \
+               -text [mc "Cancel"] \
                -command [cb _cancel]
        pack $w.buttons.cancel -side right -padx 5
        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
 
                -command [cb _cancel]
        pack $w.buttons.cancel -side right -padx 5
        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
 
-       set w_rev [::choose_rev::new_unmerged $w.rev {Revision To Merge}]
+       set w_rev [::choose_rev::new_unmerged $w.rev [mc "Revision To Merge"]]
        pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5
 
        bind $w <$M1B-Key-Return> $_start
        pack $w.rev -anchor nw -fill both -expand 1 -pady 5 -padx 5
 
        bind $w <$M1B-Key-Return> $_start
@@ -209,34 +208,34 @@ proc reset_hard {} {
        global HEAD commit_type file_states
 
        if {[string match amend* $commit_type]} {
        global HEAD commit_type file_states
 
        if {[string match amend* $commit_type]} {
-               info_popup {Cannot abort while amending.
+               info_popup [mc "Cannot abort while amending.
 
 You must finish amending this commit.
 
 You must finish amending this commit.
-}
+"]
                return
        }
 
        if {![lock_index abort]} return
 
        if {[string match *merge* $commit_type]} {
                return
        }
 
        if {![lock_index abort]} return
 
        if {[string match *merge* $commit_type]} {
-               set op_question "Abort merge?
+               set op_question [mc "Abort merge?
 
 Aborting the current merge will cause *ALL* uncommitted changes to be lost.
 
 
 Aborting the current merge will cause *ALL* uncommitted changes to be lost.
 
-Continue with aborting the current merge?"
+Continue with aborting the current merge?"]
        } else {
        } else {
-               set op_question "Reset changes?
+               set op_question [mc "Reset changes?
 
 Resetting the changes will cause *ALL* uncommitted changes to be lost.
 
 
 Resetting the changes will cause *ALL* uncommitted changes to be lost.
 
-Continue with resetting the current changes?"
+Continue with resetting the current changes?"]
        }
 
        if {[ask_popup $op_question] eq {yes}} {
        }
 
        if {[ask_popup $op_question] eq {yes}} {
-               set fd [git_read read-tree --reset -u HEAD]
+               set fd [git_read --stderr read-tree --reset -u -v HEAD]
                fconfigure $fd -blocking 0 -translation binary
                fileevent $fd readable [namespace code [list _reset_wait $fd]]
                fconfigure $fd -blocking 0 -translation binary
                fileevent $fd readable [namespace code [list _reset_wait $fd]]
-               ui_status {Aborting... please wait...}
+               $::main_status start [mc "Aborting"] [mc "files reset"]
        } else {
                unlock_index
        }
        } else {
                unlock_index
        }
@@ -245,9 +244,12 @@ Continue with resetting the current changes?"
 proc _reset_wait {fd} {
        global ui_comm
 
 proc _reset_wait {fd} {
        global ui_comm
 
-       read $fd
+       $::main_status update_meter [read $fd]
+
+       fconfigure $fd -blocking 1
        if {[eof $fd]} {
        if {[eof $fd]} {
-               close $fd
+               set fail [catch {close $fd} err]
+               $::main_status stop
                unlock_index
 
                $ui_comm delete 0.0 end
                unlock_index
 
                $ui_comm delete 0.0 end
@@ -255,11 +257,17 @@ proc _reset_wait {fd} {
 
                catch {file delete [gitdir MERGE_HEAD]}
                catch {file delete [gitdir rr-cache MERGE_RR]}
 
                catch {file delete [gitdir MERGE_HEAD]}
                catch {file delete [gitdir rr-cache MERGE_RR]}
+               catch {file delete [gitdir MERGE_RR]}
                catch {file delete [gitdir SQUASH_MSG]}
                catch {file delete [gitdir MERGE_MSG]}
                catch {file delete [gitdir GITGUI_MSG]}
 
                catch {file delete [gitdir SQUASH_MSG]}
                catch {file delete [gitdir MERGE_MSG]}
                catch {file delete [gitdir GITGUI_MSG]}
 
-               rescan {ui_status {Abort completed.  Ready.}}
+               if {$fail} {
+                       warn_popup "[mc "Abort failed."]\n\n$err"
+               }
+               rescan {ui_status [mc "Abort completed.  Ready."]}
+       } else {
+               fconfigure $fd -blocking 0
        }
 }
 
        }
 }