}
}
+proc is_config_true {name} {
+ global repo_config
+ if {[catch {set v $repo_config($name)}]} {
+ return 0
+ } elseif {$v eq {true} || $v eq {1} || $v eq {yes}} {
+ return 1
+ } else {
+ return 0
+ }
+}
+
proc load_config {include_global} {
global repo_config global_config default_config
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 \
-font font_ui
listbox $w.list.l \
-height 10 \
- -width 50 \
+ -width 70 \
-selectmode extended \
+ -yscrollcommand [list $w.list.sby set] \
-font font_ui
foreach h $all_heads {
if {$h ne $current_branch} {
$w.list.l insert end $h
}
}
- pack $w.list.l -fill both -pady 5 -padx 5
- pack $w.list -fill both -pady 5 -padx 5
+ scrollbar $w.list.sby -command [list $w.list.l yview]
+ pack $w.list.sby -side right -fill y
+ pack $w.list.l -side left -fill both -expand 1
+ pack $w.list -fill both -expand 1 -pady 5 -padx 5
labelframe $w.validate \
-text {Delete Only If} \
-font font_ui
listbox $w.source.l \
-height 10 \
- -width 50 \
+ -width 70 \
-selectmode extended \
+ -yscrollcommand [list $w.source.sby set] \
-font font_ui
foreach h $all_heads {
$w.source.l insert end $h
$w.source.l select set end
}
}
- pack $w.source.l -fill both -pady 5 -padx 5
- pack $w.source -fill both -pady 5 -padx 5
+ scrollbar $w.source.sby -command [list $w.source.l yview]
+ pack $w.source.sby -side right -fill y
+ pack $w.source.l -side left -fill both -expand 1
+ pack $w.source -fill both -expand 1 -pady 5 -padx 5
labelframe $w.dest \
-text {Destination Repository} \
foreach path [array names file_states] {
switch -glob -- [lindex $file_states($path) 0] {
+ _O {
+ continue; # and pray it works!
+ }
U? {
error_popup "You are in the middle of a conflicted merge.
You must resolve them, add the file, and commit to
complete the current merge. Only then can you
begin another merge.
+"
+ unlock_index
+ return 0
+ }
+ ?? {
+ error_popup "You are in the middle of a change.
+
+File [short_path $path] 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.
"
unlock_index
return 0
}
proc start_local_merge_action {w} {
- global HEAD
+ global HEAD ui_status_value current_branch
set cmd [list git merge]
+ if {![is_config_true merge.summary]} {
+ lappend cmd --no-summary
+ }
+
set names {}
set revcnt 0
foreach i [$w.source.l curselection] {
return
}
- set cons [new_console "Merge" "Merging [join $names {, }]"]
- console_exec $cons $cmd finish_merge
+ set msg "Merging $current_branch, [join $names {, }]"
+ set ui_status_value "$msg..."
+ set cons [new_console "Merge" $msg]
+ 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
-font font_ui
listbox $w.source.l \
-height 10 \
- -width 25 \
+ -width 70 \
-selectmode extended \
-yscrollcommand [list $w.source.sby set] \
-font font_ui
tkwait window $w
}
+proc do_reset_hard {} {
+ global HEAD commit_type file_states
+
+ if {[string match amend* $commit_type]} {
+ info_popup {Cannot abort while amending.
+
+You must finish amending this commit.
+}
+ return
+ }
+
+ if {![lock_index abort]} return
+
+ if {[string match *merge* $commit_type]} {
+ set op merge
+ } else {
+ set op commit
+ }
+
+ if {[ask_popup "Abort $op?
+
+Aborting the current $op will cause
+*ALL* uncommitted changes to be lost.
+
+Continue with aborting the current $op?"] eq {yes}} {
+ 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...}
+ } else {
+ unlock_index
+ }
+}
+
+proc reset_hard_wait {fd} {
+ global ui_comm
+
+ read $fd
+ if {[eof $fd]} {
+ close $fd
+ unlock_index
+
+ $ui_comm delete 0.0 end
+ $ui_comm edit modified false
+
+ catch {file delete [gitdir MERGE_HEAD]}
+ catch {file delete [gitdir rr-cache MERGE_RR]}
+ catch {file delete [gitdir SQUASH_MSG]}
+ catch {file delete [gitdir MERGE_MSG]}
+ catch {file delete [gitdir GITGUI_MSG]}
+
+ rescan {set ui_status_value {Abort completed. Ready.}}
+ }
+}
+
######################################################################
##
## icons
pack $w.repo -side left -fill both -expand 1 -pady 5 -padx 5
pack $w.global -side right -fill both -expand 1 -pady 5 -padx 5
+ set optid 0
foreach option {
- {b pullsummary {Show Pull Summary}}
- {b trustmtime {Trust File Modification Timestamps}}
- {i diffcontext {Number of Diff Context Lines}}
- {t newbranchtemplate {New Branch Name Template}}
+ {b merge.summary {Show Merge Summary}}
+ {i-1..5 merge.verbosity {Merge Verbosity}}
+
+ {b gui.trustmtime {Trust File Modification Timestamps}}
+ {i-1..99 gui.diffcontext {Number of Diff Context Lines}}
+ {t gui.newbranchtemplate {New Branch Name Template}}
} {
set type [lindex $option 0]
set name [lindex $option 1]
set text [lindex $option 2]
+ incr optid
foreach f {repo global} {
- switch $type {
+ switch -glob -- $type {
b {
- checkbutton $w.$f.$name -text $text \
- -variable ${f}_config_new(gui.$name) \
+ checkbutton $w.$f.$optid -text $text \
+ -variable ${f}_config_new($name) \
-onvalue true \
-offvalue false \
-font font_ui
- pack $w.$f.$name -side top -anchor w
+ pack $w.$f.$optid -side top -anchor w
}
- i {
- frame $w.$f.$name
- label $w.$f.$name.l -text "$text:" -font font_ui
- pack $w.$f.$name.l -side left -anchor w -fill x
- spinbox $w.$f.$name.v \
- -textvariable ${f}_config_new(gui.$name) \
- -from 1 -to 99 -increment 1 \
- -width 3 \
+ i-* {
+ regexp -- {-(\d+)\.\.(\d+)$} $type _junk min max
+ frame $w.$f.$optid
+ label $w.$f.$optid.l -text "$text:" -font font_ui
+ pack $w.$f.$optid.l -side left -anchor w -fill x
+ spinbox $w.$f.$optid.v \
+ -textvariable ${f}_config_new($name) \
+ -from $min \
+ -to $max \
+ -increment 1 \
+ -width [expr {1 + [string length $max]}] \
-font font_ui
- bind $w.$f.$name.v <FocusIn> {%W selection range 0 end}
- pack $w.$f.$name.v -side right -anchor e -padx 5
- pack $w.$f.$name -side top -anchor w -fill x
+ bind $w.$f.$optid.v <FocusIn> {%W selection range 0 end}
+ pack $w.$f.$optid.v -side right -anchor e -padx 5
+ pack $w.$f.$optid -side top -anchor w -fill x
}
t {
- frame $w.$f.$name
- label $w.$f.$name.l -text "$text:" -font font_ui
- entry $w.$f.$name.v \
+ frame $w.$f.$optid
+ label $w.$f.$optid.l -text "$text:" -font font_ui
+ entry $w.$f.$optid.v \
-borderwidth 1 \
-relief sunken \
-width 20 \
- -textvariable ${f}_config_new(gui.$name) \
+ -textvariable ${f}_config_new($name) \
-font font_ui
- pack $w.$f.$name.l -side left -anchor w
- pack $w.$f.$name.v -side left -anchor w \
+ pack $w.$f.$optid.l -side left -anchor w
+ pack $w.$f.$optid.v -side left -anchor w \
-fill x -expand 1 \
-padx 5
- pack $w.$f.$name -side top -anchor w -fill x
+ pack $w.$f.$optid -side top -anchor w -fill x
}
}
}
}
}
+set default_config(merge.summary) true
+set default_config(merge.verbosity) 2
set default_config(gui.trustmtime) false
-set default_config(gui.pullsummary) true
set default_config(gui.diffcontext) 5
set default_config(gui.newbranchtemplate) {}
set default_config(gui.fontui) [font configure font_ui]
-font font_ui
lappend disable_on_lock \
[list .mbar.merge entryconf [.mbar.merge index last] -state]
+ .mbar.merge add command -label {Abort Merge...} \
+ -command do_reset_hard \
+ -font font_ui
+ lappend disable_on_lock \
+ [list .mbar.merge entryconf [.mbar.merge index last] -state]
+
menu .mbar.fetch