|  | # git-gui branch rename support | 
|  | # Copyright (C) 2007 Shawn Pearce | 
|  |  | 
|  | class branch_rename { | 
|  |  | 
|  | field w | 
|  | field oldname | 
|  | field newname | 
|  |  | 
|  | constructor dialog {} { | 
|  | global current_branch use_ttk NS | 
|  |  | 
|  | make_dialog top w | 
|  | wm withdraw $w | 
|  | wm title $top [mc "%s (%s): Rename Branch" [appname] [reponame]] | 
|  | if {$top ne {.}} { | 
|  | wm geometry $top "+[winfo rootx .]+[winfo rooty .]" | 
|  | } | 
|  |  | 
|  | set oldname $current_branch | 
|  | set newname [get_config gui.newbranchtemplate] | 
|  |  | 
|  | ${NS}::label $w.header -text [mc "Rename Branch"]\ | 
|  | -font font_uibold -anchor center | 
|  | pack $w.header -side top -fill x | 
|  |  | 
|  | ${NS}::frame $w.buttons | 
|  | ${NS}::button $w.buttons.rename -text [mc Rename] \ | 
|  | -default active \ | 
|  | -command [cb _rename] | 
|  | pack $w.buttons.rename -side right | 
|  | ${NS}::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 | 
|  |  | 
|  | ${NS}::frame $w.rename | 
|  | ${NS}::label $w.rename.oldname_l -text [mc "Branch:"] | 
|  | if {$use_ttk} { | 
|  | ttk::combobox $w.rename.oldname_m -textvariable @oldname \ | 
|  | -values [load_all_heads] -state readonly | 
|  | } else { | 
|  | eval tk_optionMenu $w.rename.oldname_m @oldname [load_all_heads] | 
|  | } | 
|  |  | 
|  | ${NS}::label $w.rename.newname_l -text [mc "New Name:"] | 
|  | ${NS}::entry $w.rename.newname_t \ | 
|  | -width 40 \ | 
|  | -textvariable @newname \ | 
|  | -validate key \ | 
|  | -validatecommand { | 
|  | if {%d == 1 && [regexp {[~^:?*\[\0- ]} %S]} {return 0} | 
|  | return 1 | 
|  | } | 
|  |  | 
|  | grid $w.rename.oldname_l $w.rename.oldname_m -sticky we -padx {0 5} | 
|  | grid $w.rename.newname_l $w.rename.newname_t -sticky we -padx {0 5} | 
|  | grid columnconfigure $w.rename 1 -weight 1 | 
|  | pack $w.rename -anchor nw -fill x -pady 5 -padx 5 | 
|  |  | 
|  | bind $w <Key-Return> [cb _rename] | 
|  | bind $w <Key-Escape> [list destroy $w] | 
|  | bind $w <Visibility> " | 
|  | grab $w | 
|  | $w.rename.newname_t icursor end | 
|  | focus $w.rename.newname_t | 
|  | " | 
|  | wm deiconify $w | 
|  | tkwait window $w | 
|  | } | 
|  |  | 
|  | method _rename {} { | 
|  | global current_branch | 
|  |  | 
|  | if {$oldname eq {}} { | 
|  | tk_messageBox \ | 
|  | -icon error \ | 
|  | -type ok \ | 
|  | -title [wm title $w] \ | 
|  | -parent $w \ | 
|  | -message [mc "Please select a branch to rename."] | 
|  | focus $w.rename.oldname_m | 
|  | return | 
|  | } | 
|  | if {$newname eq {} | 
|  | || $newname eq [get_config gui.newbranchtemplate]} { | 
|  | tk_messageBox \ | 
|  | -icon error \ | 
|  | -type ok \ | 
|  | -title [wm title $w] \ | 
|  | -parent $w \ | 
|  | -message [mc "Please supply a branch name."] | 
|  | focus $w.rename.newname_t | 
|  | return | 
|  | } | 
|  | if {![catch {git show-ref --verify -- "refs/heads/$newname"}]} { | 
|  | tk_messageBox \ | 
|  | -icon error \ | 
|  | -type ok \ | 
|  | -title [wm title $w] \ | 
|  | -parent $w \ | 
|  | -message [mc "Branch '%s' already exists." $newname] | 
|  | focus $w.rename.newname_t | 
|  | return | 
|  | } | 
|  | if {[catch {git check-ref-format "heads/$newname"}]} { | 
|  | tk_messageBox \ | 
|  | -icon error \ | 
|  | -type ok \ | 
|  | -title [wm title $w] \ | 
|  | -parent $w \ | 
|  | -message [mc "'%s' is not an acceptable branch name." $newname] | 
|  | focus $w.rename.newname_t | 
|  | return | 
|  | } | 
|  |  | 
|  | if {[catch {git branch -m $oldname $newname} err]} { | 
|  | tk_messageBox \ | 
|  | -icon error \ | 
|  | -type ok \ | 
|  | -title [wm title $w] \ | 
|  | -parent $w \ | 
|  | -message [strcat [mc "Failed to rename '%s'." $oldname] "\n\n$err"] | 
|  | return | 
|  | } | 
|  |  | 
|  | if {$current_branch eq $oldname} { | 
|  | set current_branch $newname | 
|  | } | 
|  |  | 
|  | destroy $w | 
|  | } | 
|  |  | 
|  | } |