gitk: Various speed improvements

This rearranges the code a little to eliminate some procedure calls
and reduce the number of globals accessed.  It makes rowidlist and
rowoffsets lists rather than arrays, and removes the lineid array,
since $lineid($l) was the same as [lindex $displayorder $l], and the
latter is a little faster.

Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Paul Mackerras
2006-02-28 22:10:19 +11:00
parent aa81d97476
commit 8f7d0cecf4

228
gitk
View File

@ -39,6 +39,7 @@ proc start_rev_list {rlargs} {
set startmsecs [clock clicks -milliseconds] set startmsecs [clock clicks -milliseconds]
set nextupdate [expr {$startmsecs + 100}] set nextupdate [expr {$startmsecs + 100}]
set ncmupdate 1 set ncmupdate 1
initlayout
set order "--topo-order" set order "--topo-order"
if {$datemode} { if {$datemode} {
set order "--date-order" set order "--date-order"
@ -72,9 +73,10 @@ proc getcommits {rargs} {
proc getcommitlines {commfd} { proc getcommitlines {commfd} {
global parents cdate children nchildren global parents cdate children nchildren
global commitlisted nextupdate global commitlisted commitinfo phase nextupdate
global stopped leftover global stopped leftover
global canv global canv
global displayorder commitidx commitrow
set stuff [read $commfd] set stuff [read $commfd]
if {$stuff == {}} { if {$stuff == {}} {
@ -97,16 +99,19 @@ proc getcommitlines {commfd} {
exit 1 exit 1
} }
set start 0 set start 0
set gotsome 0
while 1 { while 1 {
set i [string first "\0" $stuff $start] set i [string first "\0" $stuff $start]
if {$i < 0} { if {$i < 0} {
append leftover [string range $stuff $start end] append leftover [string range $stuff $start end]
break break
} }
set cmit [string range $stuff $start [expr {$i - 1}]]
if {$start == 0} { if {$start == 0} {
set cmit "$leftover$cmit" set cmit $leftover
append cmit [string range $stuff 0 [expr {$i - 1}]]
set leftover {} set leftover {}
} else {
set cmit [string range $stuff $start [expr {$i - 1}]]
} }
set start [expr {$i + 1}] set start [expr {$i + 1}]
set j [string first "\n" $cmit] set j [string first "\n" $cmit]
@ -115,7 +120,7 @@ proc getcommitlines {commfd} {
set ids [string range $cmit 0 [expr {$j - 1}]] set ids [string range $cmit 0 [expr {$j - 1}]]
set ok 1 set ok 1
foreach id $ids { foreach id $ids {
if {![regexp {^[0-9a-f]{40}$} $id]} { if {[string length $id] != 40} {
set ok 0 set ok 0
break break
} }
@ -133,10 +138,18 @@ proc getcommitlines {commfd} {
set olds [lrange $ids 1 end] set olds [lrange $ids 1 end]
set cmit [string range $cmit [expr {$j + 1}] end] set cmit [string range $cmit [expr {$j + 1}] end]
set commitlisted($id) 1 set commitlisted($id) 1
parsecommit $id $cmit 1 [lrange $ids 1 end] updatechildren $id [lrange $ids 1 end]
drawcommit $id 1 if {![info exists commitinfo($id)]} {
parsecommit $id $cmit 1
}
set commitrow($id) $commitidx
incr commitidx
lappend displayorder $id
set gotsome 1
}
if {$gotsome} {
layoutmore
} }
layoutmore
if {[clock clicks -milliseconds] >= $nextupdate} { if {[clock clicks -milliseconds] >= $nextupdate} {
doupdate 1 doupdate 1
} }
@ -164,14 +177,15 @@ proc doupdate {reading} {
proc readcommit {id} { proc readcommit {id} {
if {[catch {set contents [exec git-cat-file commit $id]}]} return if {[catch {set contents [exec git-cat-file commit $id]}]} return
parsecommit $id $contents 0 {} updatechildren $id {}
parsecommit $id $contents 0
} }
proc updatecommits {rargs} { proc updatecommits {rargs} {
stopfindproc stopfindproc
foreach v {children nchildren parents nparents commitlisted foreach v {children nchildren parents nparents commitlisted
commitinfo colormap selectedline matchinglines treediffs colormap selectedline matchinglines treediffs
mergefilelist currentid rowtextx commitrow lineid mergefilelist currentid rowtextx commitrow
rowidlist rowoffsets idrowranges idrangedrawn iddrawn rowidlist rowoffsets idrowranges idrangedrawn iddrawn
linesegends crossings cornercrossings} { linesegends crossings cornercrossings} {
global $v global $v
@ -202,7 +216,7 @@ proc updatechildren {id olds} {
} }
} }
proc parsecommit {id contents listed olds} { proc parsecommit {id contents listed} {
global commitinfo cdate global commitinfo cdate
set inhdr 1 set inhdr 1
@ -212,7 +226,6 @@ proc parsecommit {id contents listed olds} {
set audate {} set audate {}
set comname {} set comname {}
set comdate {} set comdate {}
updatechildren $id $olds
set hdrend [string first "\n\n" $contents] set hdrend [string first "\n\n" $contents]
if {$hdrend < 0} { if {$hdrend < 0} {
# should never happen... # should never happen...
@ -741,30 +754,30 @@ proc sanity {row {full 0}} {
global rowidlist rowoffsets global rowidlist rowoffsets
set col -1 set col -1
set ids $rowidlist($row) set ids [lindex $rowidlist $row]
foreach id $ids { foreach id $ids {
incr col incr col
if {$id eq {}} continue if {$id eq {}} continue
if {$col < [llength $ids] - 1 && if {$col < [llength $ids] - 1 &&
[lsearch -exact -start [expr {$col+1}] $ids $id] >= 0} { [lsearch -exact -start [expr {$col+1}] $ids $id] >= 0} {
puts "oops: [shortids $id] repeated in row $row col $col: {[shortids $rowidlist($row)]}" puts "oops: [shortids $id] repeated in row $row col $col: {[shortids [lindex $rowidlist $row]]}"
} }
set o [lindex $rowoffsets($row) $col] set o [lindex $rowoffsets $row $col]
set y $row set y $row
set x $col set x $col
while {$o ne {}} { while {$o ne {}} {
incr y -1 incr y -1
incr x $o incr x $o
if {[lindex $rowidlist($y) $x] != $id} { if {[lindex $rowidlist $y $x] != $id} {
puts "oops: rowoffsets wrong at row [expr {$y+1}] col [expr {$x-$o}]" puts "oops: rowoffsets wrong at row [expr {$y+1}] col [expr {$x-$o}]"
puts " id=[shortids $id] check started at row $row" puts " id=[shortids $id] check started at row $row"
for {set i $row} {$i >= $y} {incr i -1} { for {set i $row} {$i >= $y} {incr i -1} {
puts " row $i ids={[shortids $rowidlist($i)]} offs={$rowoffsets($i)}" puts " row $i ids={[shortids [lindex $rowidlist $i]]} offs={[lindex $rowoffsets $i]}"
} }
break break
} }
if {!$full} break if {!$full} break
set o [lindex $rowoffsets($y) $x] set o [lindex $rowoffsets $y $x]
} }
} }
} }
@ -775,10 +788,10 @@ proc makeuparrow {oid x y z} {
for {set i 1} {$i < $uparrowlen && $y > 1} {incr i} { for {set i 1} {$i < $uparrowlen && $y > 1} {incr i} {
incr y -1 incr y -1
incr x $z incr x $z
set off0 $rowoffsets($y) set off0 [lindex $rowoffsets $y]
for {set x0 $x} {1} {incr x0} { for {set x0 $x} {1} {incr x0} {
if {$x0 >= [llength $off0]} { if {$x0 >= [llength $off0]} {
set x0 [llength $rowoffsets([expr {$y-1}])] set x0 [llength [lindex $rowoffsets [expr {$y-1}]]]
break break
} }
set z [lindex $off0 $x0] set z [lindex $off0 $x0]
@ -788,11 +801,11 @@ proc makeuparrow {oid x y z} {
} }
} }
set z [expr {$x0 - $x}] set z [expr {$x0 - $x}]
set rowidlist($y) [linsert $rowidlist($y) $x $oid] lset rowidlist $y [linsert [lindex $rowidlist $y] $x $oid]
set rowoffsets($y) [linsert $rowoffsets($y) $x $z] lset rowoffsets $y [linsert [lindex $rowoffsets $y] $x $z]
} }
set tmp [lreplace $rowoffsets($y) $x $x {}] set tmp [lreplace [lindex $rowoffsets $y] $x $x {}]
set rowoffsets($y) [incrange $tmp [expr {$x+1}] -1] lset rowoffsets $y [incrange $tmp [expr {$x+1}] -1]
lappend idrowranges($oid) $y lappend idrowranges($oid) $y
} }
@ -800,9 +813,15 @@ proc initlayout {} {
global rowidlist rowoffsets displayorder global rowidlist rowoffsets displayorder
global rowlaidout rowoptim global rowlaidout rowoptim
global idinlist rowchk global idinlist rowchk
global commitidx numcommits
global nextcolor
set rowidlist(0) {} set commitidx 0
set rowoffsets(0) {} set numcommits 0
set displayorder {}
set nextcolor 0
set rowidlist {{}}
set rowoffsets {{}}
catch {unset idinlist} catch {unset idinlist}
catch {unset rowchk} catch {unset rowchk}
set rowlaidout 0 set rowlaidout 0
@ -851,6 +870,11 @@ proc showstuff {canshow} {
global canvy0 linespc global canvy0 linespc
global linesegends idrowranges idrangedrawn global linesegends idrowranges idrangedrawn
if {$numcommits == 0} {
global phase
set phase "incrdraw"
allcanvs delete all
}
set row $numcommits set row $numcommits
set numcommits $canshow set numcommits $canshow
allcanvs conf -scrollregion \ allcanvs conf -scrollregion \
@ -890,8 +914,8 @@ proc layoutrows {row endrow last} {
global commitidx global commitidx
global idinlist rowchk global idinlist rowchk
set idlist $rowidlist($row) set idlist [lindex $rowidlist $row]
set offs $rowoffsets($row) set offs [lindex $rowoffsets $row]
while {$row < $endrow} { while {$row < $endrow} {
set id [lindex $displayorder $row] set id [lindex $displayorder $row]
set oldolds {} set oldolds {}
@ -925,21 +949,21 @@ proc layoutrows {row endrow last} {
set rowchk($id) [expr {$row + $r}] set rowchk($id) [expr {$row + $r}]
} }
} }
set rowidlist($row) $idlist lset rowidlist $row $idlist
set rowoffsets($row) $offs lset rowoffsets $row $offs
} }
set col [lsearch -exact $idlist $id] set col [lsearch -exact $idlist $id]
if {$col < 0} { if {$col < 0} {
set col [llength $idlist] set col [llength $idlist]
lappend idlist $id lappend idlist $id
set rowidlist($row) $idlist lset rowidlist $row $idlist
set z {} set z {}
if {$nchildren($id) > 0} { if {$nchildren($id) > 0} {
set z [expr {[llength $rowidlist([expr {$row-1}])] - $col}] set z [expr {[llength [lindex $rowidlist [expr {$row-1}]]] - $col}]
unset idinlist($id) unset idinlist($id)
} }
lappend offs $z lappend offs $z
set rowoffsets($row) $offs lset rowoffsets $row $offs
if {$z ne {}} { if {$z ne {}} {
makeuparrow $id $col $row $z makeuparrow $id $col $row $z
} }
@ -981,20 +1005,19 @@ proc layoutrows {row endrow last} {
makeuparrow $oid $col $row $o makeuparrow $oid $col $row $o
incr col incr col
} }
set rowidlist($row) $idlist lappend rowidlist $idlist
set rowoffsets($row) $offs lappend rowoffsets $offs
} }
return $row return $row
} }
proc addextraid {id row} { proc addextraid {id row} {
global displayorder commitrow lineid commitinfo nparents global displayorder commitrow commitinfo nparents
global commitidx global commitidx
incr commitidx incr commitidx
lappend displayorder $id lappend displayorder $id
set commitrow($id) $row set commitrow($id) $row
set lineid($row) $id
readcommit $id readcommit $id
if {![info exists commitinfo($id)]} { if {![info exists commitinfo($id)]} {
set commitinfo($id) {"No commit information available"} set commitinfo($id) {"No commit information available"}
@ -1007,7 +1030,7 @@ proc layouttail {} {
global idrowranges linesegends global idrowranges linesegends
set row $commitidx set row $commitidx
set idlist $rowidlist($row) set idlist [lindex $rowidlist $row]
while {$idlist ne {}} { while {$idlist ne {}} {
set col [expr {[llength $idlist] - 1}] set col [expr {[llength $idlist] - 1}]
set id [lindex $idlist $col] set id [lindex $idlist $col]
@ -1018,18 +1041,20 @@ proc layouttail {} {
incr row incr row
set offs [ntimes $col 0] set offs [ntimes $col 0]
set idlist [lreplace $idlist $col $col] set idlist [lreplace $idlist $col $col]
set rowidlist($row) $idlist lappend rowidlist $idlist
set rowoffsets($row) $offs lappend rowoffsets $offs
} }
foreach id [array names idinlist] { foreach id [array names idinlist] {
addextraid $id $row addextraid $id $row
set rowidlist($row) [list $id] lset rowidlist $row [list $id]
set rowoffsets($row) 0 lset rowoffsets $row 0
makeuparrow $id 0 $row 0 makeuparrow $id 0 $row 0
lappend linesegends($row) $id lappend linesegends($row) $id
lappend idrowranges($id) $row lappend idrowranges($id) $row
incr row incr row
lappend rowidlist {}
lappend rowoffsets {}
} }
} }
@ -1037,17 +1062,17 @@ proc insert_pad {row col npad} {
global rowidlist rowoffsets global rowidlist rowoffsets
set pad [ntimes $npad {}] set pad [ntimes $npad {}]
set rowidlist($row) [eval linsert \$rowidlist($row) $col $pad] lset rowidlist $row [eval linsert [list [lindex $rowidlist $row]] $col $pad]
set tmp [eval linsert \$rowoffsets($row) $col $pad] set tmp [eval linsert [list [lindex $rowoffsets $row]] $col $pad]
set rowoffsets($row) [incrange $tmp [expr {$col + $npad}] [expr {-$npad}]] lset rowoffsets $row [incrange $tmp [expr {$col + $npad}] [expr {-$npad}]]
} }
proc optimize_rows {row col endrow} { proc optimize_rows {row col endrow} {
global rowidlist rowoffsets idrowranges global rowidlist rowoffsets idrowranges
for {} {$row < $endrow} {incr row} { for {} {$row < $endrow} {incr row} {
set idlist $rowidlist($row) set idlist [lindex $rowidlist $row]
set offs $rowoffsets($row) set offs [lindex $rowoffsets $row]
set haspad 0 set haspad 0
for {} {$col < [llength $offs]} {incr col} { for {} {$col < [llength $offs]} {incr col} {
if {[lindex $idlist $col] eq {}} { if {[lindex $idlist $col] eq {}} {
@ -1059,7 +1084,7 @@ proc optimize_rows {row col endrow} {
set isarrow 0 set isarrow 0
set x0 [expr {$col + $z}] set x0 [expr {$col + $z}]
set y0 [expr {$row - 1}] set y0 [expr {$row - 1}]
set z0 [lindex $rowoffsets($y0) $x0] set z0 [lindex $rowoffsets $y0 $x0]
if {$z0 eq {}} { if {$z0 eq {}} {
set id [lindex $idlist $col] set id [lindex $idlist $col]
if {[info exists idrowranges($id)] && if {[info exists idrowranges($id)] &&
@ -1076,11 +1101,11 @@ proc optimize_rows {row col endrow} {
} }
set z [lindex $offs $col] set z [lindex $offs $col]
set x0 [expr {$col + $z}] set x0 [expr {$col + $z}]
set z0 [lindex $rowoffsets($y0) $x0] set z0 [lindex $rowoffsets $y0 $x0]
} elseif {$z > 1 || ($z > 0 && $isarrow)} { } elseif {$z > 1 || ($z > 0 && $isarrow)} {
set npad [expr {$z - 1 + $isarrow}] set npad [expr {$z - 1 + $isarrow}]
set y1 [expr {$row + 1}] set y1 [expr {$row + 1}]
set offs2 $rowoffsets($y1) set offs2 [lindex $rowoffsets $y1]
set x1 -1 set x1 -1
foreach z $offs2 { foreach z $offs2 {
incr x1 incr x1
@ -1088,7 +1113,7 @@ proc optimize_rows {row col endrow} {
if {$x1 + $z > $col} { if {$x1 + $z > $col} {
incr npad incr npad
} }
set rowoffsets($y1) [incrange $offs2 $x1 $npad] lset rowoffsets $y1 [incrange $offs2 $x1 $npad]
break break
} }
set pad [ntimes $npad {}] set pad [ntimes $npad {}]
@ -1112,12 +1137,12 @@ proc optimize_rows {row col endrow} {
} }
if {[incr col] < [llength $idlist]} { if {[incr col] < [llength $idlist]} {
set y1 [expr {$row + 1}] set y1 [expr {$row + 1}]
set offs2 $rowoffsets($y1) set offs2 [lindex $rowoffsets $y1]
set x1 -1 set x1 -1
foreach z $offs2 { foreach z $offs2 {
incr x1 incr x1
if {$z eq {} || $x1 + $z < $col} continue if {$z eq {} || $x1 + $z < $col} continue
set rowoffsets($y1) [incrange $offs2 $x1 1] lset rowoffsets $y1 [incrange $offs2 $x1 1]
break break
} }
set idlist [linsert $idlist $col {}] set idlist [linsert $idlist $col {}]
@ -1126,8 +1151,8 @@ proc optimize_rows {row col endrow} {
set offs [incrange $tmp $col -1] set offs [incrange $tmp $col -1]
} }
} }
set rowidlist($row) $idlist lset rowidlist $row $idlist
set rowoffsets($row) $offs lset rowoffsets $row $offs
set col 0 set col 0
} }
} }
@ -1151,7 +1176,7 @@ proc drawlineseg {id i wid} {
if {$startrow == $row} return if {$startrow == $row} return
assigncolor $id assigncolor $id
set coords {} set coords {}
set col [lsearch -exact $rowidlist($row) $id] set col [lsearch -exact [lindex $rowidlist $row] $id]
if {$col < 0} { if {$col < 0} {
puts "oops: drawline: id $id not on row $row" puts "oops: drawline: id $id not on row $row"
return return
@ -1159,7 +1184,7 @@ proc drawlineseg {id i wid} {
set lasto {} set lasto {}
set ns 0 set ns 0
while {1} { while {1} {
set o [lindex $rowoffsets($row) $col] set o [lindex $rowoffsets $row $col]
if {$o eq {}} break if {$o eq {}} break
if {$o ne $lasto} { if {$o ne $lasto} {
# changing direction # changing direction
@ -1186,14 +1211,13 @@ proc drawlineseg {id i wid} {
} }
proc drawparentlinks {id row col olds wid} { proc drawparentlinks {id row col olds wid} {
global rowoffsets rowidlist canv colormap lthickness global rowidlist canv colormap lthickness
set row2 [expr {$row + 1}] set row2 [expr {$row + 1}]
set x [xc $row $col] set x [xc $row $col]
set y [yc $row] set y [yc $row]
set y2 [yc $row2] set y2 [yc $row2]
set ids $rowidlist($row2) set ids [lindex $rowidlist $row2]
set offs $rowidlist($row2)
# rmx = right-most X coord used # rmx = right-most X coord used
set rmx 0 set rmx 0
set wid [expr {$wid * $lthickness}] set wid [expr {$wid * $lthickness}]
@ -1241,7 +1265,7 @@ proc drawlines {id xtra} {
foreach child $children($id) { foreach child $children($id) {
if {[info exists iddrawn($child)]} { if {[info exists iddrawn($child)]} {
set row $commitrow($child) set row $commitrow($child)
set col [lsearch -exact $rowidlist($row) $child] set col [lsearch -exact [lindex $rowidlist $row] $child]
if {$col >= 0} { if {$col >= 0} {
drawparentlinks $child $row $col [list $id] $wid drawparentlinks $child $row $col [list $id] $wid
} }
@ -1266,7 +1290,7 @@ proc drawcmittext {id row col rmx} {
-fill $ofill -outline black -width 1] -fill $ofill -outline black -width 1]
$canv raise $t $canv raise $t
$canv bind $t <1> {selcanvline {} %x %y} $canv bind $t <1> {selcanvline {} %x %y}
set xt [xc $row [llength $rowidlist($row)]] set xt [xc $row [llength [lindex $rowidlist $row]]]
if {$xt < $rmx} { if {$xt < $rmx} {
set xt $rmx set xt $rmx
} }
@ -1290,12 +1314,12 @@ proc drawcmittext {id row col rmx} {
} }
proc drawcmitrow {row} { proc drawcmitrow {row} {
global displayorder rowidlist rowoffsets global displayorder rowidlist
global idrowranges idrangedrawn iddrawn global idrowranges idrangedrawn iddrawn
global commitinfo commitlisted parents numcommits global commitinfo commitlisted parents numcommits
if {![info exists rowidlist($row)]} return if {$row >= $numcommits} return
foreach id $rowidlist($row) { foreach id [lindex $rowidlist $row] {
if {![info exists idrowranges($id)]} continue if {![info exists idrowranges($id)]} continue
set i -1 set i -1
foreach {s e} $idrowranges($id) { foreach {s e} $idrowranges($id) {
@ -1314,7 +1338,7 @@ proc drawcmitrow {row} {
set id [lindex $displayorder $row] set id [lindex $displayorder $row]
if {[info exists iddrawn($id)]} return if {[info exists iddrawn($id)]} return
set col [lsearch -exact $rowidlist($row) $id] set col [lsearch -exact [lindex $rowidlist $row] $id]
if {$col < 0} { if {$col < 0} {
puts "oops, row $row id $id not in list" puts "oops, row $row id $id not in list"
return return
@ -1442,15 +1466,6 @@ proc assigncolor {id} {
set colormap($id) $c set colormap($id) $c
} }
proc initgraph {} {
global numcommits nextcolor linespc
global nchildren
allcanvs delete all
set nextcolor 0
set numcommits 0
}
proc bindline {t id} { proc bindline {t id} {
global canv global canv
@ -1532,9 +1547,9 @@ proc checkcrossings {row endrow} {
for {} {$row < $endrow} {incr row} { for {} {$row < $endrow} {incr row} {
set id [lindex $displayorder $row] set id [lindex $displayorder $row]
set i [lsearch -exact $rowidlist($row) $id] set i [lsearch -exact [lindex $rowidlist $row] $id]
if {$i < 0} continue if {$i < 0} continue
set idlist $rowidlist([expr {$row+1}]) set idlist [lindex $rowidlist [expr {$row+1}]]
foreach p $parents($id) { foreach p $parents($id) {
set j [lsearch -exact $idlist $p] set j [lsearch -exact $idlist $p]
if {$j > 0} { if {$j > 0} {
@ -1552,7 +1567,7 @@ proc notecrossings {row id lo hi corner} {
global rowidlist crossings cornercrossings global rowidlist crossings cornercrossings
for {set i $lo} {[incr i] < $hi} {} { for {set i $lo} {[incr i] < $hi} {} {
set p [lindex $rowidlist($row) $i] set p [lindex [lindex $rowidlist $row] $i]
if {$p == {}} continue if {$p == {}} continue
if {$i == $corner} { if {$i == $corner} {
if {![info exists cornercrossings($id)] if {![info exists cornercrossings($id)]
@ -1588,25 +1603,6 @@ proc xcoord {i level ln} {
return $x return $x
} }
proc drawcommit {id reading} {
global phase todo nchildren nextupdate
global displayorder parents
global commitrow commitidx lineid
if {$phase != "incrdraw"} {
set phase incrdraw
set displayorder {}
set todo {}
set commitidx 0
initlayout
initgraph
}
set commitrow($id) $commitidx
set lineid($commitidx) $id
incr commitidx
lappend displayorder $id
}
proc finishcommits {} { proc finishcommits {} {
global phase global phase
global canv mainfont ctext maincursor textcursor global canv mainfont ctext maincursor textcursor
@ -1674,7 +1670,7 @@ proc findmatches {f} {
proc dofind {} { proc dofind {} {
global findtype findloc findstring markedmatches commitinfo global findtype findloc findstring markedmatches commitinfo
global numcommits lineid linehtag linentag linedtag global numcommits displayorder linehtag linentag linedtag
global mainfont namefont canv canv2 canv3 selectedline global mainfont namefont canv canv2 canv3 selectedline
global matchinglines foundstring foundstrlen global matchinglines foundstring foundstrlen
@ -1705,7 +1701,7 @@ proc dofind {} {
set didsel 0 set didsel 0
set fldtypes {Headline Author Date Committer CDate Comment} set fldtypes {Headline Author Date Committer CDate Comment}
for {set l 0} {$l < $numcommits} {incr l} { for {set l 0} {$l < $numcommits} {incr l} {
set id $lineid($l) set id [lindex $displayorder $l]
set info $commitinfo($id) set info $commitinfo($id)
set doesmatch 0 set doesmatch 0
foreach f $info ty $fldtypes { foreach f $info ty $fldtypes {
@ -1830,7 +1826,7 @@ proc stopfindproc {{done 0}} {
proc findpatches {} { proc findpatches {} {
global findstring selectedline numcommits global findstring selectedline numcommits
global findprocpid findprocfile global findprocpid findprocfile
global finddidsel ctext lineid findinprogress global finddidsel ctext displayorder findinprogress
global findinsertpos global findinsertpos
if {$numcommits == 0} return if {$numcommits == 0} return
@ -1847,7 +1843,7 @@ proc findpatches {} {
if {[incr l] >= $numcommits} { if {[incr l] >= $numcommits} {
set l 0 set l 0
} }
append inputids $lineid($l) "\n" append inputids [lindex $displayorder $l] "\n"
} }
if {[catch { if {[catch {
@ -1918,7 +1914,7 @@ proc insertmatch {l id} {
} }
proc findfiles {} { proc findfiles {} {
global selectedline numcommits lineid ctext global selectedline numcommits displayorder ctext
global ffileline finddidsel parents nparents global ffileline finddidsel parents nparents
global findinprogress findstartline findinsertpos global findinprogress findstartline findinsertpos
global treediffs fdiffid fdiffsneeded fdiffpos global treediffs fdiffid fdiffsneeded fdiffpos
@ -1936,7 +1932,7 @@ proc findfiles {} {
set diffsneeded {} set diffsneeded {}
set fdiffsneeded {} set fdiffsneeded {}
while 1 { while 1 {
set id $lineid($l) set id [lindex $displayorder $l]
if {$findmergefiles || $nparents($id) == 1} { if {$findmergefiles || $nparents($id) == 1} {
if {![info exists treediffs($id)]} { if {![info exists treediffs($id)]} {
append diffsneeded "$id\n" append diffsneeded "$id\n"
@ -1965,7 +1961,7 @@ proc findfiles {} {
set finddidsel 0 set finddidsel 0
set findinsertpos end set findinsertpos end
set id $lineid($l) set id [lindex $displayorder $l]
. config -cursor watch . config -cursor watch
settextcursor watch settextcursor watch
set findinprogress 1 set findinprogress 1
@ -2035,7 +2031,7 @@ proc donefilediff {} {
proc findcont {id} { proc findcont {id} {
global findid treediffs parents nparents global findid treediffs parents nparents
global ffileline findstartline finddidsel global ffileline findstartline finddidsel
global lineid numcommits matchinglines findinprogress global displayorder numcommits matchinglines findinprogress
global findmergefiles global findmergefiles
set l $ffileline set l $ffileline
@ -2062,7 +2058,7 @@ proc findcont {id} {
set l 0 set l 0
} }
if {$l == $findstartline} break if {$l == $findstartline} break
set id $lineid($l) set id [lindex $displayorder $l]
} }
stopfindproc stopfindproc
if {!$finddidsel} { if {!$finddidsel} {
@ -2161,15 +2157,15 @@ proc appendwithlinks {text} {
proc selectline {l isnew} { proc selectline {l isnew} {
global canv canv2 canv3 ctext commitinfo selectedline global canv canv2 canv3 ctext commitinfo selectedline
global lineid linehtag linentag linedtag global displayorder linehtag linentag linedtag
global canvy0 linespc parents nparents children global canvy0 linespc parents nparents children
global cflist currentid sha1entry global cflist currentid sha1entry
global commentend idtags linknum global commentend idtags linknum
global mergemax global mergemax numcommits
$canv delete hover $canv delete hover
normalline normalline
if {![info exists lineid($l)]} return if {$l < 0 || $l >= $numcommits} return
set y [expr {$canvy0 + $l * $linespc}] set y [expr {$canvy0 + $l * $linespc}]
set ymax [lindex [$canv cget -scrollregion] 3] set ymax [lindex [$canv cget -scrollregion] 3]
set ytop [expr {$y - $linespc - 1}] set ytop [expr {$y - $linespc - 1}]
@ -2226,7 +2222,7 @@ proc selectline {l isnew} {
set selectedline $l set selectedline $l
set id $lineid($l) set id [lindex $displayorder $l]
set currentid $id set currentid $id
$sha1entry delete 0 end $sha1entry delete 0 end
$sha1entry insert 0 $id $sha1entry insert 0 $id
@ -2719,7 +2715,7 @@ proc sha1change {n1 n2 op} {
proc gotocommit {} { proc gotocommit {} {
global sha1string currentid commitrow tagids global sha1string currentid commitrow tagids
global lineid numcommits global displayorder numcommits
if {$sha1string == {} if {$sha1string == {}
|| ([info exists currentid] && $sha1string == $currentid)} return || ([info exists currentid] && $sha1string == $currentid)} return
@ -2730,8 +2726,8 @@ proc gotocommit {} {
if {[regexp {^[0-9a-f]{4,39}$} $id]} { if {[regexp {^[0-9a-f]{4,39}$} $id]} {
set matches {} set matches {}
for {set l 0} {$l < $numcommits} {incr l} { for {set l 0} {$l < $numcommits} {incr l} {
if {[string match $id* $lineid($l)]} { if {[string match $id* [lindex $displayorder $l]]} {
lappend matches $lineid($l) lappend matches [lindex $displayorder $l]
} }
} }
if {$matches ne {}} { if {$matches ne {}} {
@ -2948,15 +2944,15 @@ proc rowmenu {x y id} {
} }
proc diffvssel {dirn} { proc diffvssel {dirn} {
global rowmenuid selectedline lineid global rowmenuid selectedline displayorder
if {![info exists selectedline]} return if {![info exists selectedline]} return
if {$dirn} { if {$dirn} {
set oldid $lineid($selectedline) set oldid [lindex $displayorder $selectedline]
set newid $rowmenuid set newid $rowmenuid
} else { } else {
set oldid $rowmenuid set oldid $rowmenuid
set newid $lineid($selectedline) set newid [lindex $displayorder $selectedline]
} }
addtohistory [list doseldiff $oldid $newid] addtohistory [list doseldiff $oldid $newid]
doseldiff $oldid $newid doseldiff $oldid $newid