git-gui / lib / branch_delete.tclon commit Merge branch 'maint' of git://repo.or.cz/git-gui into maint (7468c29)
   1# git-gui branch delete support
   2# Copyright (C) 2007 Shawn Pearce
   3
   4class branch_delete {
   5
   6field w               ; # widget path
   7field w_heads         ; # listbox of local head names
   8field w_check         ; # revision picker for merge test
   9field w_delete        ; # delete button
  10
  11constructor dialog {} {
  12        global current_branch
  13
  14        make_toplevel top w
  15        wm title $top "[appname] ([reponame]): Delete Branch"
  16        if {$top ne {.}} {
  17                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
  18        }
  19
  20        label $w.header -text {Delete Local Branch} -font font_uibold
  21        pack $w.header -side top -fill x
  22
  23        frame $w.buttons
  24        set w_delete $w.buttons.delete
  25        button $w_delete \
  26                -text Delete \
  27                -default active \
  28                -state disabled \
  29                -command [cb _delete]
  30        pack $w_delete -side right
  31        button $w.buttons.cancel \
  32                -text {Cancel} \
  33                -command [list destroy $w]
  34        pack $w.buttons.cancel -side right -padx 5
  35        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
  36
  37        labelframe $w.list -text {Local Branches}
  38        set w_heads $w.list.l
  39        listbox $w_heads \
  40                -height 10 \
  41                -width 70 \
  42                -selectmode extended \
  43                -exportselection false \
  44                -yscrollcommand [list $w.list.sby set]
  45        scrollbar $w.list.sby -command [list $w.list.l yview]
  46        pack $w.list.sby -side right -fill y
  47        pack $w.list.l -side left -fill both -expand 1
  48        pack $w.list -fill both -expand 1 -pady 5 -padx 5
  49
  50        set w_check [choose_rev::new \
  51                $w.check \
  52                {Delete Only If Merged Into} \
  53                ]
  54        $w_check none {Always (Do not perform merge test.)}
  55        pack $w.check -anchor nw -fill x -pady 5 -padx 5
  56
  57        foreach h [load_all_heads] {
  58                if {$h ne $current_branch} {
  59                        $w_heads insert end $h
  60                }
  61        }
  62
  63        bind $w_heads <<ListboxSelect>> [cb _select]
  64        bind $w <Visibility> "
  65                grab $w
  66                focus $w
  67        "
  68        bind $w <Key-Escape> [list destroy $w]
  69        bind $w <Key-Return> [cb _delete]\;break
  70        tkwait window $w
  71}
  72
  73method _select {} {
  74        if {[$w_heads curselection] eq {}} {
  75                $w_delete configure -state disabled
  76        } else {
  77                $w_delete configure -state normal
  78        }
  79}
  80
  81method _delete {} {
  82        if {[catch {set check_cmt [$w_check commit_or_die]}]} {
  83                return
  84        }
  85
  86        set to_delete [list]
  87        set not_merged [list]
  88        foreach i [$w_heads curselection] {
  89                set b [$w_heads get $i]
  90                if {[catch {
  91                        set o [git rev-parse --verify "refs/heads/$b"]
  92                }]} continue
  93                if {$check_cmt ne {}} {
  94                        if {[catch {set m [git merge-base $o $check_cmt]}]} continue
  95                        if {$o ne $m} {
  96                                lappend not_merged $b
  97                                continue
  98                        }
  99                }
 100                lappend to_delete [list $b $o]
 101        }
 102        if {$not_merged ne {}} {
 103                set msg "The following branches are not completely merged into [$w_check get]:
 104
 105 - [join $not_merged "\n - "]"
 106                tk_messageBox \
 107                        -icon info \
 108                        -type ok \
 109                        -title [wm title $w] \
 110                        -parent $w \
 111                        -message $msg
 112        }
 113        if {$to_delete eq {}} return
 114        if {$check_cmt eq {}} {
 115                set msg {Recovering deleted branches is difficult.
 116
 117Delete the selected branches?}
 118                if {[tk_messageBox \
 119                        -icon warning \
 120                        -type yesno \
 121                        -title [wm title $w] \
 122                        -parent $w \
 123                        -message $msg] ne yes} {
 124                        return
 125                }
 126        }
 127
 128        set failed {}
 129        foreach i $to_delete {
 130                set b [lindex $i 0]
 131                set o [lindex $i 1]
 132                if {[catch {git update-ref -d "refs/heads/$b" $o} err]} {
 133                        append failed " - $b: $err\n"
 134                }
 135        }
 136
 137        if {$failed ne {}} {
 138                tk_messageBox \
 139                        -icon error \
 140                        -type ok \
 141                        -title [wm title $w] \
 142                        -parent $w \
 143                        -message "Failed to delete branches:\n$failed"
 144        }
 145
 146        destroy $w
 147}
 148
 149}