git-gui: Created Branch menu.

This is an early start at branch management from within git-gui.  The
branch menu has create/delete command entries to create and delete
branches as well as a list of radiobutton entries for each branch
found in the repository through for-each-ref.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
diff --git a/git-gui b/git-gui
index e9d4600..69ebd90 100755
--- a/git-gui
+++ b/git-gui
@@ -1607,6 +1607,44 @@
 
 ######################################################################
 ##
+## branch management
+
+proc load_all_branches {} {
+	global all_branches
+
+	set all_branches [list]
+	set cmd [list git for-each-ref]
+	lappend cmd --format=%(refname)
+	lappend cmd refs/heads
+	set fd [open "| $cmd" r]
+	while {[gets $fd line] > 0} {
+		if {[regsub ^refs/heads/ $line {} line]} {
+			lappend all_branches $line
+		}
+	}
+	close $fd
+
+	set all_branches [lsort $all_branches]
+}
+
+proc populate_branch_menu {m} {
+	global all_branches disable_on_lock
+
+	$m add separator
+	foreach b $all_branches {
+		$m add radiobutton \
+			-label $b \
+			-command [list do_switch_branch $b] \
+			-variable current_branch \
+			-value $b \
+			-font font_ui
+		lappend disable_on_lock \
+			[list $m entryconf [$m index last] -state]
+	}
+}
+
+######################################################################
+##
 ## remote management
 
 proc load_all_remotes {} {
@@ -2878,6 +2916,9 @@
 menu .mbar -tearoff 0
 .mbar add cascade -label Repository -menu .mbar.repository
 .mbar add cascade -label Edit -menu .mbar.edit
+if {!$single_commit} {
+	.mbar add cascade -label Branch -menu .mbar.branch
+}
 .mbar add cascade -label Commit -menu .mbar.commit
 if {!$single_commit} {
 	.mbar add cascade -label Fetch -menu .mbar.fetch
@@ -2963,6 +3004,24 @@
 	-accelerator $M1T-A \
 	-font font_ui
 
+if {!$single_commit} {
+	# -- Branch Menu
+	#
+	menu .mbar.branch
+
+	.mbar.branch add command -label {Create...} \
+		-command do_create_branch \
+		-font font_ui
+	lappend disable_on_lock [list .mbar.branch entryconf \
+		[.mbar.branch index last] -state]
+
+	.mbar.branch add command -label {Delete...} \
+		-command do_delete_branch \
+		-font font_ui
+	lappend disable_on_lock [list .mbar.branch entryconf \
+		[.mbar.branch index last] -state]
+}
+
 # -- Commit Menu
 #
 menu .mbar.commit
@@ -3583,6 +3642,8 @@
 
 if {!$single_commit} {
 	load_all_remotes
+	load_all_branches
+	populate_branch_menu .mbar.branch
 	populate_fetch_menu .mbar.fetch
 	populate_pull_menu .mbar.pull
 	populate_push_menu .mbar.push