summaryrefslogtreecommitdiff
path: root/lib/branch_rename.tcl
blob: 54c72b980c1d097a937f77bf0172bab64a223eda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# git-gui branch rename support
# Copyright (C) 2007 Shawn Pearce

class branch_rename {

field w
field oldname
field newname

constructor dialog {} {
	global all_heads current_branch

	make_toplevel top w
	wm title $top "[appname] ([reponame]): Rename Branch"
	if {$top ne {.}} {
		wm geometry $top "+[winfo rootx .]+[winfo rooty .]"
	}

	set oldname $current_branch
	set newname [get_config gui.newbranchtemplate]

	label $w.header -text {Rename Branch} -font font_uibold
	pack $w.header -side top -fill x

	frame $w.buttons
	button $w.buttons.rename -text Rename \
		-default active \
		-command [cb _rename]
	pack $w.buttons.rename -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

	frame $w.rename
	label $w.rename.oldname_l -text {Branch:}
	eval tk_optionMenu $w.rename.oldname_m @oldname $all_heads

	label $w.rename.newname_l -text {New Name:}
	entry $w.rename.newname_t \
		-borderwidth 1 \
		-relief sunken \
		-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 w  -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
	"
	bind $w.header <Destroy> [list delete_this $this]
	tkwait window $w
}

method _rename {} {
	global all_heads current_branch

	if {$oldname eq {}} {
		tk_messageBox \
			-icon error \
			-type ok \
			-title [wm title $w] \
			-parent $w \
			-message "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 "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 "Branch '$newname' already exists."
		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 "We do not like '$newname' as a branch name."
		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 "Failed to rename '$oldname'.\n\n$err"
		return
	}

	set oldidx [lsearch -exact -sorted $all_heads $oldname]
	if {$oldidx >= 0} {
		set all_heads [lreplace $all_heads $oldidx $oldidx]
	}
	lappend all_heads $newname
	set all_heads [lsort $all_heads]
	populate_branch_menu

	if {$current_branch eq $oldname} {
		set current_branch $newname
	}

	destroy $w
}

}