From dff7e88febf85b1b8b1b789cd7c99434b70fb19b Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Fri, 26 Jan 2007 04:07:34 -0500 Subject: [PATCH] git-gui: Don't allow users to commit a bad octopus merge. 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 --- git-gui.sh | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/git-gui.sh b/git-gui.sh index 6675d3018b..31ef0e60ac 100755 --- a/git-gui.sh +++ b/git-gui.sh @@ -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 $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