Browse Source
A simple refactoring of the delete branch dialog to allow use of the class construct to better organize the code and to reuse the revision selection code of our new choose_rev mega-widget. Signed-off-by: Shawn O. Pearce <spearce@spearce.org>maint
Shawn O. Pearce
18 years ago
4 changed files with 185 additions and 165 deletions
@ -0,0 +1,163 @@ |
|||||||
|
# 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 all_heads current_branch |
||||||
|
|
||||||
|
make_toplevel top w |
||||||
|
wm title $top "[appname] ([reponame]): Delete Branch" |
||||||
|
if {$top ne {.}} { |
||||||
|
wm geometry $top "+[winfo rootx .]+[winfo rooty .]" |
||||||
|
} |
||||||
|
|
||||||
|
label $w.header -text {Delete Local Branch} -font font_uibold |
||||||
|
pack $w.header -side top -fill x |
||||||
|
|
||||||
|
frame $w.buttons |
||||||
|
set w_delete $w.buttons.delete |
||||||
|
button $w_delete \ |
||||||
|
-text Delete \ |
||||||
|
-default active \ |
||||||
|
-state disabled \ |
||||||
|
-command [cb _delete] |
||||||
|
pack $w_delete -side right |
||||||
|
button $w.buttons.cancel \ |
||||||
|
-text {Cancel} \ |
||||||
|
-command [list destroy $w] |
||||||
|
pack $w.buttons.cancel -side right -padx 5 |
||||||
|
pack $w.buttons -side bottom -fill x -pady 10 -padx 10 |
||||||
|
|
||||||
|
labelframe $w.list -text {Local Branches} |
||||||
|
set w_heads $w.list.l |
||||||
|
listbox $w_heads \ |
||||||
|
-height 10 \ |
||||||
|
-width 70 \ |
||||||
|
-selectmode extended \ |
||||||
|
-yscrollcommand [list $w.list.sby set] |
||||||
|
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 |
||||||
|
|
||||||
|
set w_check [choose_rev::new \ |
||||||
|
$w.check \ |
||||||
|
{Delete Only If Merged Into} \ |
||||||
|
] |
||||||
|
$w_check none {Always (Do not perform merge test.)} |
||||||
|
pack $w.check -anchor nw -fill x -pady 5 -padx 5 |
||||||
|
|
||||||
|
foreach h $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 |
||||||
|
tkwait window $w |
||||||
|
} |
||||||
|
|
||||||
|
method _select {} { |
||||||
|
if {[$w_heads curselection] eq {}} { |
||||||
|
$w_delete configure -state disabled |
||||||
|
} else { |
||||||
|
$w_delete configure -state normal |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
method _delete {} { |
||||||
|
global all_heads |
||||||
|
|
||||||
|
if {[catch {set check_cmt [$w_check get_commit]} err]} { |
||||||
|
tk_messageBox \ |
||||||
|
-icon error \ |
||||||
|
-type ok \ |
||||||
|
-title [wm title $w] \ |
||||||
|
-parent $w \ |
||||||
|
-message "Invalid revision: [$w_check get]" |
||||||
|
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 "The following branches are not completely merged into [$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 {Recovering deleted branches is difficult. |
||||||
|
|
||||||
|
Delete 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 update-ref -d "refs/heads/$b" $o} err]} { |
||||||
|
append failed " - $b: $err\n" |
||||||
|
} else { |
||||||
|
set x [lsearch -sorted -exact $all_heads $b] |
||||||
|
if {$x >= 0} { |
||||||
|
set all_heads [lreplace $all_heads $x $x] |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if {$failed ne {}} { |
||||||
|
tk_messageBox \ |
||||||
|
-icon error \ |
||||||
|
-type ok \ |
||||||
|
-title [wm title $w] \ |
||||||
|
-parent $w \ |
||||||
|
-message "Failed to delete branches:\n$failed" |
||||||
|
} |
||||||
|
|
||||||
|
set all_heads [lsort $all_heads] |
||||||
|
populate_branch_menu |
||||||
|
destroy $w |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue