lib / branch_rename.tclon commit git-gui: Factor out common fast-forward merge case (f66b8a6)
   1# git-gui branch rename support
   2# Copyright (C) 2007 Shawn Pearce
   3
   4class branch_rename {
   5
   6field w
   7field oldname
   8field newname
   9
  10constructor dialog {} {
  11        global current_branch
  12
  13        make_toplevel top w
  14        wm title $top "[appname] ([reponame]): Rename Branch"
  15        if {$top ne {.}} {
  16                wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
  17        }
  18
  19        set oldname $current_branch
  20        set newname [get_config gui.newbranchtemplate]
  21
  22        label $w.header -text {Rename Branch} -font font_uibold
  23        pack $w.header -side top -fill x
  24
  25        frame $w.buttons
  26        button $w.buttons.rename -text Rename \
  27                -default active \
  28                -command [cb _rename]
  29        pack $w.buttons.rename -side right
  30        button $w.buttons.cancel -text {Cancel} \
  31                -command [list destroy $w]
  32        pack $w.buttons.cancel -side right -padx 5
  33        pack $w.buttons -side bottom -fill x -pady 10 -padx 10
  34
  35        frame $w.rename
  36        label $w.rename.oldname_l -text {Branch:}
  37        eval tk_optionMenu $w.rename.oldname_m @oldname [load_all_heads]
  38
  39        label $w.rename.newname_l -text {New Name:}
  40        entry $w.rename.newname_t \
  41                -borderwidth 1 \
  42                -relief sunken \
  43                -width 40 \
  44                -textvariable @newname \
  45                -validate key \
  46                -validatecommand {
  47                        if {%d == 1 && [regexp {[~^:?*\[\0- ]} %S]} {return 0}
  48                        return 1
  49                }
  50
  51        grid $w.rename.oldname_l $w.rename.oldname_m -sticky w  -padx {0 5}
  52        grid $w.rename.newname_l $w.rename.newname_t -sticky we -padx {0 5}
  53        grid columnconfigure $w.rename 1 -weight 1
  54        pack $w.rename -anchor nw -fill x -pady 5 -padx 5
  55
  56        bind $w <Key-Return> [cb _rename]
  57        bind $w <Key-Escape> [list destroy $w]
  58        bind $w <Visibility> "
  59                grab $w
  60                $w.rename.newname_t icursor end
  61                focus $w.rename.newname_t
  62        "
  63        tkwait window $w
  64}
  65
  66method _rename {} {
  67        global current_branch
  68
  69        if {$oldname eq {}} {
  70                tk_messageBox \
  71                        -icon error \
  72                        -type ok \
  73                        -title [wm title $w] \
  74                        -parent $w \
  75                        -message "Please select a branch to rename."
  76                focus $w.rename.oldname_m
  77                return
  78        }
  79        if {$newname eq {}
  80                || $newname eq [get_config gui.newbranchtemplate]} {
  81                tk_messageBox \
  82                        -icon error \
  83                        -type ok \
  84                        -title [wm title $w] \
  85                        -parent $w \
  86                        -message "Please supply a branch name."
  87                focus $w.rename.newname_t
  88                return
  89        }
  90        if {![catch {git show-ref --verify -- "refs/heads/$newname"}]} {
  91                tk_messageBox \
  92                        -icon error \
  93                        -type ok \
  94                        -title [wm title $w] \
  95                        -parent $w \
  96                        -message "Branch '$newname' already exists."
  97                focus $w.rename.newname_t
  98                return
  99        }
 100        if {[catch {git check-ref-format "heads/$newname"}]} {
 101                tk_messageBox \
 102                        -icon error \
 103                        -type ok \
 104                        -title [wm title $w] \
 105                        -parent $w \
 106                        -message "We do not like '$newname' as a branch name."
 107                focus $w.rename.newname_t
 108                return
 109        }
 110
 111        if {[catch {git branch -m $oldname $newname} err]} {
 112                tk_messageBox \
 113                        -icon error \
 114                        -type ok \
 115                        -title [wm title $w] \
 116                        -parent $w \
 117                        -message "Failed to rename '$oldname'.\n\n$err"
 118                return
 119        }
 120
 121        if {$current_branch eq $oldname} {
 122                set current_branch $newname
 123        }
 124
 125        destroy $w
 126}
 127
 128}