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>
This commit is contained in:
Shawn O. Pearce 2007-05-30 20:39:46 -04:00
parent 71a9db534a
commit fc4e8da727

View File

@ -262,6 +262,17 @@ proc git {args} {
return [eval exec git $args] 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 auto_load tk_optionMenu
rename tk_optionMenu real__tkOptionMenu rename tk_optionMenu real__tkOptionMenu
proc tk_optionMenu {w varName args} { proc tk_optionMenu {w varName args} {
@ -410,15 +421,7 @@ proc repository_state {ctvar hdvar mhvar} {
set mh [list] set mh [list]
if {[catch {set current_branch [git symbolic-ref HEAD]}]} { set current_branch [current-branch]
set current_branch {}
} else {
regsub ^refs/((heads|tags|remotes)/)? \
$current_branch \
{} \
current_branch
}
if {[catch {set hd [git rev-parse --verify HEAD]}]} { if {[catch {set hd [git rev-parse --verify HEAD]}]} {
set hd {} set hd {}
set ct initial set ct initial
@ -1651,14 +1654,8 @@ switch -- $subcommand {
browser { browser {
set subcommand_args {rev?} set subcommand_args {rev?}
switch [llength $argv] { switch [llength $argv] {
0 { 0 { set current_branch [current-branch] }
set current_branch [git symbolic-ref HEAD] 1 { set current_branch [lindex $argv 0] }
regsub ^refs/((heads|tags|remotes)/)? \
$current_branch {} current_branch
}
1 {
set current_branch [lindex $argv 0]
}
default usage default usage
} }
browser::new $current_branch browser::new $current_branch
@ -1691,9 +1688,7 @@ blame {
unset is_path unset is_path
if {$head eq {}} { if {$head eq {}} {
set current_branch [git symbolic-ref HEAD] set current_branch [current-branch]
regsub ^refs/((heads|tags|remotes)/)? \
$current_branch {} current_branch
} else { } else {
set current_branch $head set current_branch $head
} }