# git-gui branch delete support # Copyright (C) 2007 Shawn Pearce class branch_delete { field w ; # widget path field w_heads ; # listbox of local head names field w_check ; # revision picker for merge test field w_delete ; # delete button constructor dialog {} { global current_branch use_ttk NS make_dialog top w wm withdraw $w wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]] if {$top ne {.}} { wm geometry $top "+[winfo rootx .]+[winfo rooty .]" } ${NS}::label $w.header -text [mc "Delete Local Branch"] \ -font font_uibold -anchor center pack $w.header -side top -fill x ${NS}::frame $w.buttons set w_delete $w.buttons.delete ${NS}::button $w_delete \ -text [mc Delete] \ -default active \ -state disabled \ -command [cb _delete] pack $w_delete -side right ${NS}::button $w.buttons.cancel \ -text [mc Cancel] \ -command [list destroy $w] pack $w.buttons.cancel -side right -padx 5 pack $w.buttons -side bottom -fill x -pady 10 -padx 10 ${NS}::labelframe $w.list -text [mc "Local Branches"] set w_heads $w.list.l slistbox $w_heads \ -height 10 \ -width 70 \ -selectmode extended \ -exportselection false pack $w.list.l -side left -fill both -expand 1 pack $w.list -fill both -expand 1 -pady 5 -padx 5 set w_check [choose_rev::new \ $w.check \ [mc "Delete Only If Merged Into"] \ ] $w_check none [mc "Always (Do not perform merge checks)"] pack $w.check -anchor nw -fill x -pady 5 -padx 5 foreach h [load_all_heads] { if {$h ne $current_branch} { $w_heads insert end $h } } bind $w_heads <<ListboxSelect>> [cb _select] bind $w <Visibility> " grab $w focus $w " bind $w <Key-Escape> [list destroy $w] bind $w <Key-Return> [cb _delete]\;break wm deiconify $w tkwait window $w } method _select {} { if {[$w_heads curselection] eq {}} { $w_delete configure -state disabled } else { $w_delete configure -state normal } } method _delete {} { if {[catch {set check_cmt [$w_check commit_or_die]}]} { return } set to_delete [list] set not_merged [list] foreach i [$w_heads curselection] { set b [$w_heads get $i] if {[catch { set o [git rev-parse --verify "refs/heads/$b"] }]} continue if {$check_cmt ne {}} { if {[catch {set m [git merge-base $o $check_cmt]}]} continue if {$o ne $m} { lappend not_merged $b continue } } lappend to_delete [list $b $o] } if {$not_merged ne {}} { set msg "[mc "The following branches are not completely merged into %s:" [$w_check get]] - [join $not_merged "\n - "]" tk_messageBox \ -icon info \ -type ok \ -title [wm title $w] \ -parent $w \ -message $msg } if {$to_delete eq {}} return if {$check_cmt eq {}} { set msg [mc "Recovering deleted branches is difficult.\n\nDelete the selected branches?"] if {[tk_messageBox \ -icon warning \ -type yesno \ -title [wm title $w] \ -parent $w \ -message $msg] ne yes} { return } } set failed {} foreach i $to_delete { set b [lindex $i 0] set o [lindex $i 1] if {[catch {git branch -D $b} err]} { append failed " - $b: $err\n" } } if {$failed ne {}} { tk_messageBox \ -icon error \ -type ok \ -title [wm title $w] \ -parent $w \ -message [mc "Failed to delete branches:\n%s" $failed] } destroy $w } }