git-gui: Internalize symbolic-ref HEAD reading logic

To improve performance on fork+exec impoverished systems (such as
Windows) we want to avoid running git-symbolic-ref on every rescan
if we can do so.  A quick way to implement such an avoidance is to
just read the HEAD ref ourselves; we'll either see it as a symref
(starts with "ref: ") or we'll see it as a detached head (40 hex
digits).  In either case we can treat that as our current branch.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
diff --git a/git-gui.sh b/git-gui.sh
index 3bd12d2..5dc2c67 100755
--- a/git-gui.sh
+++ b/git-gui.sh
@@ -262,6 +262,17 @@
 	return [eval exec git $args]
 }
 
+proc current-branch {} {
+	set ref {}
+	set fd [open [gitdir HEAD] r]
+	if {[gets $fd ref] <16
+	 || ![regsub {^ref: refs/heads/} $ref {} ref]} {
+		set ref {}
+	}
+	close $fd
+	return $ref
+}
+
 auto_load tk_optionMenu
 rename tk_optionMenu real__tkOptionMenu
 proc tk_optionMenu {w varName args} {
@@ -410,15 +421,7 @@
 
 	set mh [list]
 
-	if {[catch {set current_branch [git symbolic-ref HEAD]}]} {
-		set current_branch {}
-	} else {
-		regsub ^refs/((heads|tags|remotes)/)? \
-			$current_branch \
-			{} \
-			current_branch
-	}
-
+	set current_branch [current-branch]
 	if {[catch {set hd [git rev-parse --verify HEAD]}]} {
 		set hd {}
 		set ct initial
@@ -1651,14 +1654,8 @@
 browser {
 	set subcommand_args {rev?}
 	switch [llength $argv] {
-	0 {
-		set current_branch [git symbolic-ref HEAD]
-		regsub ^refs/((heads|tags|remotes)/)? \
-			$current_branch {} current_branch
-	}
-	1 {
-		set current_branch [lindex $argv 0]
-	}
+	0 { set current_branch [current-branch] }
+	1 { set current_branch [lindex $argv 0] }
 	default usage
 	}
 	browser::new $current_branch
@@ -1691,9 +1688,7 @@
 	unset is_path
 
 	if {$head eq {}} {
-		set current_branch [git symbolic-ref HEAD]
-		regsub ^refs/((heads|tags|remotes)/)? \
-			$current_branch {} current_branch
+		set current_branch [current-branch]
 	} else {
 		set current_branch $head
 	}