git-gui / lib / branch_delete.tclon commit git-p4: support exclude paths (354081d)
   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 [append "[appname] ([reponame]): " [mc "Delete Branch"]]
  16        if {$top ne {.}} {
  17                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
  18        }
  19
  20        label $w.header -text [mc "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 [mc Delete] \
  27                -default active \
  28                -state disabled \
  29                -command [cb _delete]
  30        pack $w_delete -side right
  31        button $w.buttons.cancel \
  32                -text [mc 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 [mc "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                [mc "Delete Only If Merged Into"] \
  53                ]
  54        $w_check none [mc "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 "[mc "The following branches are not completely merged into %s:" [$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 [mc "Recovering deleted branches is difficult. \n\n Delete the selected branches?"]
 116                if {[tk_messageBox \
 117                        -icon warning \
 118                        -type yesno \
 119                        -title [wm title $w] \
 120                        -parent $w \
 121                        -message $msg] ne yes} {
 122                        return
 123                }
 124        }
 125
 126        set failed {}
 127        foreach i $to_delete {
 128                set b [lindex $i 0]
 129                set o [lindex $i 1]
 130                if {[catch {git update-ref -d "refs/heads/$b" $o} err]} {
 131                        append failed " - $b: $err\n"
 132                }
 133        }
 134
 135        if {$failed ne {}} {
 136                tk_messageBox \
 137                        -icon error \
 138                        -type ok \
 139                        -title [wm title $w] \
 140                        -parent $w \
 141                        -message [mc "Failed to delete branches:\n%s" $failed]
 142        }
 143
 144        destroy $w
 145}
 146
 147}