Code

git-gui: Don't allow users to commit a bad octopus merge.
authorShawn O. Pearce <spearce@spearce.org>
Fri, 26 Jan 2007 09:07:34 +0000 (04:07 -0500)
committerShawn O. Pearce <spearce@spearce.org>
Fri, 26 Jan 2007 09:07:34 +0000 (04:07 -0500)
If an octopus merge goes horribly wrong git-merge will leave the
working directory and index dirty, but will not leave behind a
MERGE_HEAD file for a later commit.  Consequently we won't know
its a merge commit and instead would let the user resolve the
conflicts and commit a single-parent commit, which is wrong.

So now if an octopus merge fails we notify the user that the
merge did not work, tell them we will reset the working directory,
and suggest that they merge one branch at a time.  This prevents
the user from committing a bad octopus merge.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
git-gui.sh

index 6675d3018ba489b669b3339408daf837ad76d176..31ef0e60ac7ca631f4de52efb8a32366106da124 100755 (executable)
@@ -187,13 +187,13 @@ proc warn_popup {msg} {
        eval $cmd
 }
 
-proc info_popup {msg} {
+proc info_popup {msg {parent .}} {
        set title [appname]
        if {[reponame] ne {}} {
                append title " ([reponame])"
        }
        tk_messageBox \
-               -parent . \
+               -parent $parent \
                -icon info \
                -type ok \
                -title $title \
@@ -2697,16 +2697,36 @@ than 15 branches, merge the branches in batches.
        set msg "Merging $current_branch, [join $names {, }]"
        set ui_status_value "$msg..."
        set cons [new_console "Merge" $msg]
-       console_exec $cons $cmd finish_merge
+       console_exec $cons $cmd [list finish_merge $revcnt]
        bind $w <Destroy> {}
        destroy $w
 }
 
-proc finish_merge {w ok} {
+proc finish_merge {revcnt w ok} {
        console_done $w $ok
        if {$ok} {
                set msg {Merge completed successfully.}
        } else {
+               if {$revcnt != 1} {
+                       info_popup "Octopus merge failed.
+
+Your merge of $revcnt branches has failed.
+
+There are file-level conflicts between the
+branches which must be resolved manually.
+
+The working directory will now be reset.
+
+You can attempt this merge again
+by merging only one branch at a time." $w
+
+                       set fd [open "| git read-tree --reset -u HEAD" r]
+                       fconfigure $fd -blocking 0 -translation binary
+                       fileevent $fd readable [list reset_hard_wait $fd]
+                       set ui_status_value {Aborting... please wait...}
+                       return
+               }
+
                set msg {Merge failed.  Conflict resolution is required.}
        }
        unlock_index