gitk: Select head of current branch by default

Instead of selecting the first commit that appears, this makes gitk
select the currently checked out head, if the user hasn't explicitly
selected some other commit by the time it appears.  If the head hasn't
appeared by the time the graph is complete, then we select the first
real commit.

This applies both for graph updates and when the graph is being read
in initially.

Signed-off-by: Paul Mackerras <paulus@samba.org>
diff --git a/gitk b/gitk
index 8699e1b..8b4c61c 100755
--- a/gitk
+++ b/gitk
@@ -98,6 +98,7 @@
     global showlocalchanges commitinterest mainheadid
     global progressdirn progresscoords proglastnc curview
     global viewincl viewactive loginstance viewinstances
+    global pending_select mainheadid
 
     set startmsecs [clock clicks -milliseconds]
     set commitidx($view) 0
@@ -138,6 +139,7 @@
 	set progressdirn 1
 	set progresscoords {0 0}
 	set proglastnc 0
+	set pending_select $mainheadid
     }
 }
 
@@ -170,7 +172,7 @@
     global curview viewargs viewfiles viewincl viewinstances
     global viewactive viewcomplete loginstance tclencoding mainheadid
     global varcid startmsecs commfd showneartags showlocalchanges leftover
-    global mainheadid
+    global mainheadid pending_select
 
     set oldmainid $mainheadid
     rereadrefs
@@ -228,6 +230,7 @@
     filerun $fd [list getcommitlines $fd $i $view]
     incr viewactive($view)
     set viewcomplete($view) 0
+    set pending_select $mainheadid
     nowbusy $view "Reading"
     if {$showneartags} {
 	getallcommits
@@ -2748,9 +2751,9 @@
     global numcommits viewcomplete
     global selectedline currentid canv canvy0
     global treediffs
-    global pending_select
+    global pending_select mainheadid
     global commitidx
-    global selectedview selectfirst
+    global selectedview
     global hlview selectedhlview commitinterest
 
     if {$n == $curview} return
@@ -2812,7 +2815,6 @@
     setcanvscroll
     set yf 0
     set row {}
-    set selectfirst 0
     if {$selid ne {} && [commitinview $selid $n]} {
 	set row [rowofcommit $selid]
 	# try to get the selected row in the same position on the screen
@@ -2827,14 +2829,18 @@
     drawvisible
     if {$row ne {}} {
 	selectline $row 0
-    } elseif {$selid ne {}} {
-	set pending_select $selid
+    } elseif {$mainheadid ne {} && [commitinview $mainheadid $curview]} {
+	selectline [rowofcommit $mainheadid] 1
+    } elseif {!$viewcomplete($n)} {
+	if {$selid ne {}} {
+	    set pending_select $selid
+	} else {
+	    set pending_select $mainheadid
+	}
     } else {
 	set row [first_real_row]
 	if {$row < $numcommits} {
 	    selectline $row 0
-	} else {
-	    set selectfirst 1
 	}
     }
     if {!$viewcomplete($n)} {
@@ -3440,7 +3446,6 @@
     global numcommits canvxmax canv
     global nextcolor
     global colormap rowtextx
-    global selectfirst
 
     set numcommits 0
     set displayorder {}
@@ -3452,7 +3457,6 @@
     set canvxmax [$canv cget -width]
     catch {unset colormap}
     catch {unset rowtextx}
-    set selectfirst 1
 }
 
 proc setcanvscroll {} {
@@ -3486,7 +3490,7 @@
 proc layoutmore {} {
     global commitidx viewcomplete curview
     global numcommits pending_select selectedline curview
-    global selectfirst lastscrollset commitinterest
+    global lastscrollset commitinterest
 
     set canshow $commitidx($curview)
     if {$canshow <= $numcommits && !$viewcomplete($curview)} return
@@ -3513,15 +3517,6 @@
 	[commitinview $pending_select $curview]} {
 	selectline [rowofcommit $pending_select] 1
     }
-    if {$selectfirst} {
-	if {[info exists selectedline] || [info exists pending_select]} {
-	    set selectfirst 0
-	} else {
-	    set l [first_real_row]
-	    selectline $l 1
-	    set selectfirst 0
-	}
-    }
 }
 
 proc doshowlocalchanges {} {