148 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Tcl
		
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Tcl
		
	
	
| # 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
 | |
| 
 | |
| 	make_toplevel top w
 | |
| 	wm title $top [append "[appname] ([reponame]): " [mc "Delete Branch"]]
 | |
| 	if {$top ne {.}} {
 | |
| 		wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
 | |
| 	}
 | |
| 
 | |
| 	label $w.header -text [mc "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 [mc Delete] \
 | |
| 		-default active \
 | |
| 		-state disabled \
 | |
| 		-command [cb _delete]
 | |
| 	pack $w_delete -side right
 | |
| 	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
 | |
| 
 | |
| 	labelframe $w.list -text [mc "Local Branches"]
 | |
| 	set w_heads $w.list.l
 | |
| 	listbox $w_heads \
 | |
| 		-height 10 \
 | |
| 		-width 70 \
 | |
| 		-selectmode extended \
 | |
| 		-exportselection false \
 | |
| 		-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 \
 | |
| 		[mc "Delete Only If Merged Into"] \
 | |
| 		]
 | |
| 	$w_check none [mc "Always (Do not perform merge test.)"]
 | |
| 	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
 | |
| 	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\n 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 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
 | |
| }
 | |
| 
 | |
| }
 |