git-gui: Improve the merge check interface for branch deletion.
[gitweb.git] / git-gui.sh
index f12be315b1531754cd499756458ef3a42f23fa8f..f80c3b96397b64ad797e4f5981890df722db4122 100755 (executable)
@@ -1683,7 +1683,7 @@ proc do_create_branch_action {w} {
        global create_branch_checkout create_branch_revtype
        global create_branch_head create_branch_trackinghead
 
-       set newbranch [string trim [$w.desc.name.t get 0.0 end]]
+       set newbranch [string trim [$w.desc.name_t get 0.0 end]]
        if {![catch {exec git show-ref --verify -- "refs/heads/$newbranch"}]} {
                tk_messageBox \
                        -icon error \
@@ -1691,7 +1691,7 @@ proc do_create_branch_action {w} {
                        -title [wm title $w] \
                        -parent $w \
                        -message "Branch '$newbranch' already exists."
-               focus $w.desc.name.t
+               focus $w.desc.name_t
                return
        }
        if {[catch {exec git check-ref-format "heads/$newbranch"}]} {
@@ -1701,7 +1701,7 @@ proc do_create_branch_action {w} {
                        -title [wm title $w] \
                        -parent $w \
                        -message "We do not like '$newbranch' as a branch name."
-               focus $w.desc.name.t
+               focus $w.desc.name_t
                return
        }
 
@@ -1709,7 +1709,7 @@ proc do_create_branch_action {w} {
        switch -- $create_branch_revtype {
        head {set rev $create_branch_head}
        tracking {set rev $create_branch_trackinghead}
-       expression {set rev [string trim [$w.from.exp.t get 0.0 end]]}
+       expression {set rev [string trim [$w.from.exp_t get 0.0 end]]}
        }
        if {[catch {set cmt [exec git rev-parse --verify "${rev}^0"]}]} {
                tk_messageBox \
@@ -1778,18 +1778,18 @@ proc do_create_branch {} {
        labelframe $w.desc \
                -text {Branch Description} \
                -font font_ui
-       frame $w.desc.name
-       label $w.desc.name.l -text {Name:} -font font_ui
-       text $w.desc.name.t \
+       label $w.desc.name_l -text {Name:} -font font_ui
+       text $w.desc.name_t \
                -borderwidth 1 \
                -relief sunken \
                -height 1 \
                -width 40 \
                -font font_ui
-       bind $w.desc.name.t <Shift-Key-Tab> "focus $w.postActions.checkout;break"
-       bind $w.desc.name.t <Key-Tab> "focus $w.from.exp.t;break"
-       bind $w.desc.name.t <Key-Return> "do_create_branch_action $w;break"
-       bind $w.desc.name.t <Key> {
+       grid $w.desc.name_l $w.desc.name_t -stick we -padx {0 5}
+       bind $w.desc.name_t <Shift-Key-Tab> "focus $w.postActions.checkout;break"
+       bind $w.desc.name_t <Key-Tab> "focus $w.from.exp_t;break"
+       bind $w.desc.name_t <Key-Return> "do_create_branch_action $w;break"
+       bind $w.desc.name_t <Key> {
                if {{%K} ne {BackSpace}
                        && {%K} ne {Tab}
                        && {%K} ne {Escape}
@@ -1798,9 +1798,7 @@ proc do_create_branch {} {
                        if {[string first %A {~^:?*[}] >= 0} break
                }
        }
-       pack $w.desc.name.l -side left -padx 5
-       pack $w.desc.name.t -side left -fill x -expand 1
-       pack $w.desc.name -padx 5 -fill x -expand 1
+       grid columnconfigure $w.desc 1 -weight 1
        pack $w.desc -anchor nw -fill x -pady 5 -padx 5
 
        set all_trackings [list]
@@ -1816,46 +1814,38 @@ proc do_create_branch {} {
        labelframe $w.from \
                -text {Starting Revision} \
                -font font_ui
-       frame $w.from.head
-       radiobutton $w.from.head.r \
+       radiobutton $w.from.head_r \
                -text {Local Branch:} \
                -value head \
                -variable create_branch_revtype \
                -font font_ui
-       eval tk_optionMenu $w.from.head.m create_branch_head $all_heads
-       pack $w.from.head.r -side left
-       pack $w.from.head.m -side left
-       frame $w.from.tracking
-       radiobutton $w.from.tracking.r \
+       eval tk_optionMenu $w.from.head_m create_branch_head $all_heads
+       grid $w.from.head_r $w.from.head_m -sticky w
+       radiobutton $w.from.tracking_r \
                -text {Tracking Branch:} \
                -value tracking \
                -variable create_branch_revtype \
                -font font_ui
-       eval tk_optionMenu $w.from.tracking.m \
+       eval tk_optionMenu $w.from.tracking_m \
                create_branch_trackinghead \
                $all_trackings
-       pack $w.from.tracking.r -side left
-       pack $w.from.tracking.m -side left
-       frame $w.from.exp
-       radiobutton $w.from.exp.r \
+       grid $w.from.tracking_r $w.from.tracking_m -sticky w
+       radiobutton $w.from.exp_r \
                -text {Revision Expression:} \
                -value expression \
                -variable create_branch_revtype \
                -font font_ui
-       text $w.from.exp.t \
+       text $w.from.exp_t \
                -borderwidth 1 \
                -relief sunken \
                -height 1 \
                -width 50 \
                -font font_ui
-       bind $w.from.exp.t <Shift-Key-Tab> "focus $w.desc.name.t;break"
-       bind $w.from.exp.t <Key-Tab> "focus $w.postActions.checkout;break"
-       bind $w.from.exp.t <Key-Return> "do_create_branch_action $w;break"
-       pack $w.from.exp.r -side left
-       pack $w.from.exp.t -side left -fill x -expand 1
-       pack $w.from.head -padx 5 -fill x -expand 1
-       pack $w.from.tracking -padx 5 -fill x -expand 1
-       pack $w.from.exp -padx 5 -fill x -expand 1
+       grid $w.from.exp_r $w.from.exp_t -stick we -padx {0 5}
+       bind $w.from.exp_t <Shift-Key-Tab> "focus $w.desc.name_t;break"
+       bind $w.from.exp_t <Key-Tab> "focus $w.postActions.checkout;break"
+       bind $w.from.exp_t <Key-Return> "do_create_branch_action $w;break"
+       grid columnconfigure $w.from 1 -weight 1
        pack $w.from -anchor nw -fill x -pady 5 -padx 5
 
        labelframe $w.postActions \
@@ -1868,7 +1858,7 @@ proc do_create_branch {} {
        pack $w.postActions.checkout -anchor nw
        pack $w.postActions -anchor nw -fill x -pady 5 -padx 5
 
-       bind $w <Visibility> "grab $w; focus $w.desc.name.t"
+       bind $w <Visibility> "grab $w; focus $w.desc.name_t"
        bind $w <Key-Escape> "destroy $w"
        bind $w <Key-Return> "do_create_branch_action $w;break"
        wm title $w "[appname] ([reponame]): Create Branch"
@@ -1877,16 +1867,34 @@ proc do_create_branch {} {
 
 proc do_delete_branch_action {w} {
        global all_heads
-       global delete_branch_checkhead delete_branch_head
+       global delete_branch_checktype delete_branch_head delete_branch_trackinghead
+
+       set check_rev {}
+       switch -- $delete_branch_checktype {
+       head {set check_rev $delete_branch_head}
+       tracking {set check_rev $delete_branch_trackinghead}
+       always {set check_rev {:none}}
+       }
+       if {$check_rev eq {:none}} {
+               set check_cmt {}
+       } elseif {[catch {set check_cmt [exec git rev-parse --verify "${check_rev}^0"]}]} {
+               tk_messageBox \
+                       -icon error \
+                       -type ok \
+                       -title [wm title $w] \
+                       -parent $w \
+                       -message "Invalid check revision: $check_rev"
+               return
+       }
 
        set to_delete [list]
        set not_merged [list]
        foreach i [$w.list.l curselection] {
                set b [$w.list.l get $i]
                if {[catch {set o [exec git rev-parse --verify $b]}]} continue
-               if {$delete_branch_checkhead} {
-                       if {$b eq $delete_branch_head} continue
-                       if {[catch {set m [exec git merge-base $o $delete_branch_head]}]} continue
+               if {$check_cmt ne {}} {
+                       if {$b eq $check_rev} continue
+                       if {[catch {set m [exec git merge-base $o $check_cmt]}]} continue
                        if {$o ne $m} {
                                lappend not_merged $b
                                continue
@@ -1895,7 +1903,7 @@ proc do_delete_branch_action {w} {
                lappend to_delete [list $b $o]
        }
        if {$not_merged ne {}} {
-               set msg "The following branches are not completely merged into $delete_branch_head:
+               set msg "The following branches are not completely merged into $check_rev:
 
  - [join $not_merged "\n - "]"
                tk_messageBox \
@@ -1906,7 +1914,7 @@ proc do_delete_branch_action {w} {
                        -message $msg
        }
        if {$to_delete eq {}} return
-       if {!$delete_branch_checkhead} {
+       if {$delete_branch_checktype eq {always}} {
                set msg {Recovering deleted branches is difficult.
 
 Delete the selected branches?}
@@ -1950,10 +1958,11 @@ Delete the selected branches?}
 
 proc do_delete_branch {} {
        global all_heads tracking_branches current_branch
-       global delete_branch_checkhead delete_branch_head
+       global delete_branch_checktype delete_branch_head delete_branch_trackinghead
 
-       set delete_branch_checkhead 1
+       set delete_branch_checktype head
        set delete_branch_head $current_branch
+       set delete_branch_trackinghead {}
 
        set w .branch_editor
        toplevel $w
@@ -1995,21 +2004,37 @@ proc do_delete_branch {} {
                regsub ^refs/(heads|remotes)/ $b {} b
                lappend all_trackings $b
        }
+       set all_trackings [lsort -unique $all_trackings]
+       if {$all_trackings ne {} && $delete_branch_trackinghead eq {}} {
+               set delete_branch_trackinghead [lindex $all_trackings 0]
+       }
 
        labelframe $w.validate \
-               -text {Only Delete If} \
+               -text {Delete Only If} \
+               -font font_ui
+       radiobutton $w.validate.head_r \
+               -text {Merged Into Local Branch:} \
+               -value head \
+               -variable delete_branch_checktype \
+               -font font_ui
+       eval tk_optionMenu $w.validate.head_m delete_branch_head $all_heads
+       grid $w.validate.head_r $w.validate.head_m -sticky w
+       radiobutton $w.validate.tracking_r \
+               -text {Merged Into Tracking Branch:} \
+               -value tracking \
+               -variable delete_branch_checktype \
                -font font_ui
-       frame $w.validate.head
-       checkbutton $w.validate.head.r \
-               -text {Already Merged Into:} \
-               -variable delete_branch_checkhead \
+       eval tk_optionMenu $w.validate.tracking_m \
+               delete_branch_trackinghead \
+               $all_trackings
+       grid $w.validate.tracking_r $w.validate.tracking_m -sticky w
+       radiobutton $w.validate.always_r \
+               -text {Always (Do not perform merge checks)} \
+               -value always \
+               -variable delete_branch_checktype \
                -font font_ui
-       eval tk_optionMenu $w.validate.head.m delete_branch_head \
-               $all_heads \
-               [lsort -unique $all_trackings]
-       pack $w.validate.head.r -side left
-       pack $w.validate.head.m -side left
-       pack $w.validate.head -padx 5 -fill x -expand 1
+       grid $w.validate.always_r -columnspan 2 -sticky w
+       grid columnconfigure $w.validate 1 -weight 1
        pack $w.validate -anchor nw -fill x -pady 5 -padx 5
 
        bind $w <Visibility> "grab $w; focus $w"