git-gui: Fast-forward existing branch in branch create dialog
[gitweb.git] / lib / branch.tcl
index e7559f978912c143453391bca98330818cc13394..de638d02e8023636e4198d5546e1eb3ac6f6ab32 100644 (file)
@@ -3,13 +3,16 @@
 
 proc load_all_heads {} {
        global all_heads
+       global some_heads_tracking
 
+       set rh refs/heads
+       set rh_len [expr {[string length $rh] + 1}]
        set all_heads [list]
-       set fd [open "| git for-each-ref --format=%(refname) refs/heads" r]
+       set fd [open "| git for-each-ref --format=%(refname) $rh" r]
        while {[gets $fd line] > 0} {
-               if {[is_tracking_branch $line]} continue
-               if {![regsub ^refs/heads/ $line {} name]} continue
-               lappend all_heads $name
+               if {!$some_heads_tracking || ![is_tracking_branch $line]} {
+                       lappend all_heads [string range $line $rh_len end]
+               }
        }
        close $fd
 
@@ -66,170 +69,6 @@ proc radio_selector {varname value args} {
        set var $value
 }
 
-proc do_delete_branch_action {w} {
-       global all_heads
-       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 [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 [git rev-parse --verify $b]}]} continue
-               if {$check_cmt ne {}} {
-                       if {$b eq $check_rev} continue
-                       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 $check_rev:
-
- - [join $not_merged "\n - "]"
-               tk_messageBox \
-                       -icon info \
-                       -type ok \
-                       -title [wm title $w] \
-                       -parent $w \
-                       -message $msg
-       }
-       if {$to_delete eq {}} return
-       if {$delete_branch_checktype eq {always}} {
-               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
-}
-
-proc do_delete_branch {} {
-       global all_heads tracking_branches current_branch
-       global delete_branch_checktype delete_branch_head delete_branch_trackinghead
-
-       set w .branch_editor
-       toplevel $w
-       wm geometry $w "+[winfo rootx .]+[winfo rooty .]"
-
-       label $w.header -text {Delete Local Branch} \
-               -font font_uibold
-       pack $w.header -side top -fill x
-
-       frame $w.buttons
-       button $w.buttons.create -text Delete \
-               -command [list do_delete_branch_action $w]
-       pack $w.buttons.create -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}
-       listbox $w.list.l \
-               -height 10 \
-               -width 70 \
-               -selectmode extended \
-               -yscrollcommand [list $w.list.sby set]
-       foreach h $all_heads {
-               if {$h ne $current_branch} {
-                       $w.list.l insert end $h
-               }
-       }
-       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}
-       radiobutton $w.validate.head_r \
-               -text {Merged Into Local Branch:} \
-               -value head \
-               -variable delete_branch_checktype
-       eval tk_optionMenu $w.validate.head_m delete_branch_head $all_heads
-       grid $w.validate.head_r $w.validate.head_m -sticky w
-       set all_trackings [all_tracking_branches]
-       if {$all_trackings ne {}} {
-               set delete_branch_trackinghead [lindex $all_trackings 0]
-               radiobutton $w.validate.tracking_r \
-                       -text {Merged Into Tracking Branch:} \
-                       -value tracking \
-                       -variable delete_branch_checktype
-               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
-       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
-
-       set delete_branch_head $current_branch
-       set delete_branch_checktype head
-
-       bind $w <Visibility> "grab $w; focus $w"
-       bind $w <Key-Escape> "destroy $w"
-       wm title $w "[appname] ([reponame]): Delete Branch"
-       tkwait window $w
-}
-
 proc switch_branch {new_branch} {
        global HEAD commit_type current_branch repo_config