Add -r flag and some speedups

The -r flag means "rev-list order", i.e. just display the commits
in the order they come from git-rev-list.

The speedups include:
- don't process the whole commit line-by-line, only the header
- don't convert dates when reading the commits, rather do it when
  needed
- don't do the $canv delete lines.$id in drawlines when drawing the
  graph initially (it was taking a lot of the total time)
- cache the date conversion for each hour (more important with tk8.5,
  since [clock format] is a lot slower in 8.5 than in 8.4).

Signed-off-by: Paul Mackerras <paulus@samba.org>
main
Paul Mackerras 2005-11-15 10:34:03 +11:00
parent 8b7e5d76e8
commit 232475d382
1 changed files with 101 additions and 67 deletions

108
gitk
View File

@ -60,7 +60,7 @@ proc getcommits {rargs} {


proc getcommitlines {commfd} { proc getcommitlines {commfd} {
global commits parents cdate children global commits parents cdate children
global commitlisted phase commitinfo nextupdate global commitlisted phase nextupdate
global stopped redisplaying leftover global stopped redisplaying leftover


set stuff [read $commfd] set stuff [read $commfd]
@ -196,42 +196,41 @@ proc parsecommit {id contents listed olds} {
incr ncleft($p) incr ncleft($p)
} }
} }
foreach line [split $contents "\n"] { set hdrend [string first "\n\n" $contents]
if {$inhdr} { if {$hdrend < 0} {
if {$line == {}} { # should never happen...
set inhdr 0 set hdrend [string length $contents]
} else { }
set header [string range $contents 0 [expr {$hdrend - 1}]]
set comment [string range $contents [expr {$hdrend + 2}] end]
foreach line [split $header "\n"] {
set tag [lindex $line 0] set tag [lindex $line 0]
if {$tag == "author"} { if {$tag == "author"} {
set x [expr {[llength $line] - 2}] set audate [lindex $line end-1]
set audate [lindex $line $x] set auname [lrange $line 1 end-2]
set auname [lrange $line 1 [expr {$x - 1}]]
} elseif {$tag == "committer"} { } elseif {$tag == "committer"} {
set x [expr {[llength $line] - 2}] set comdate [lindex $line end-1]
set comdate [lindex $line $x] set comname [lrange $line 1 end-2]
set comname [lrange $line 1 [expr {$x - 1}]]
} }
} }
} else { set headline {}
if {$comment == {}} { # take the first line of the comment as the headline
set headline [string trim $line] set i [string first "\n" $comment]
} else { if {$i >= 0} {
append comment "\n" set headline [string trim [string range $comment 0 $i]]
} }
if {!$listed} { if {!$listed} {
# git-rev-list indents the comment by 4 spaces; # git-rev-list indents the comment by 4 spaces;
# if we got this via git-cat-file, add the indentation # if we got this via git-cat-file, add the indentation
append comment " " set newcomment {}
foreach line [split $comment "\n"] {
append newcomment " "
append newcomment $line
} }
append comment $line set comment $newcomment
}
}
if {$audate != {}} {
set audate [clock format $audate -format "%Y-%m-%d %H:%M:%S"]
} }
if {$comdate != {}} { if {$comdate != {}} {
set cdate($id) $comdate set cdate($id) $comdate
set comdate [clock format $comdate -format "%Y-%m-%d %H:%M:%S"]
} }
set commitinfo($id) [list $headline $auname $audate \ set commitinfo($id) [list $headline $auname $audate \
$comname $comdate $comment] $comname $comdate $comment]
@ -683,7 +682,7 @@ Use and redistribute under the terms of the GNU General Public License} \
} }


proc assigncolor {id} { proc assigncolor {id} {
global commitinfo colormap commcolors colors nextcolor global colormap commcolors colors nextcolor
global parents nparents children nchildren global parents nparents children nchildren
global cornercrossings crossings global cornercrossings crossings


@ -783,10 +782,12 @@ proc bindline {t id} {
$canv bind $t <Button-1> "lineclick %x %y $id 1" $canv bind $t <Button-1> "lineclick %x %y $id 1"
} }


proc drawlines {id xtra} { proc drawlines {id xtra delold} {
global mainline mainlinearrow sidelines lthickness colormap canv global mainline mainlinearrow sidelines lthickness colormap canv


if {$delold} {
$canv delete lines.$id $canv delete lines.$id
}
if {[info exists mainline($id)]} { if {[info exists mainline($id)]} {
set t [$canv create line $mainline($id) \ set t [$canv create line $mainline($id) \
-width [expr {($xtra + 1) * $lthickness}] \ -width [expr {($xtra + 1) * $lthickness}] \
@ -858,7 +859,7 @@ proc drawcommitline {level} {
set mainline($id) [trimdiagstart $mainline($id)] set mainline($id) [trimdiagstart $mainline($id)]
} }
} }
drawlines $id 0 drawlines $id 0 0
set orad [expr {$linespc / 3}] set orad [expr {$linespc / 3}]
set t [$canv create oval [expr $x - $orad] [expr $y1 - $orad] \ set t [$canv create oval [expr $x - $orad] [expr $y1 - $orad] \
[expr $x + $orad - 1] [expr $y1 + $orad - 1] \ [expr $x + $orad - 1] [expr $y1 + $orad - 1] \
@ -878,6 +879,7 @@ proc drawcommitline {level} {
set headline [lindex $commitinfo($id) 0] set headline [lindex $commitinfo($id) 0]
set name [lindex $commitinfo($id) 1] set name [lindex $commitinfo($id) 1]
set date [lindex $commitinfo($id) 2] set date [lindex $commitinfo($id) 2]
set date [formatdate $date]
set linehtag($lineno) [$canv create text $xt $y1 -anchor w \ set linehtag($lineno) [$canv create text $xt $y1 -anchor w \
-text $headline -font $mainfont ] -text $headline -font $mainfont ]
$canv bind $linehtag($lineno) <Button-3> "rowmenu %X %Y $id" $canv bind $linehtag($lineno) <Button-3> "rowmenu %X %Y $id"
@ -1446,8 +1448,8 @@ proc decidenext {{noread 0}} {
} }


proc drawcommit {id} { proc drawcommit {id} {
global phase todo nchildren datemode nextupdate global phase todo nchildren datemode nextupdate revlistorder
global numcommits ncmupdate displayorder todo onscreen global numcommits ncmupdate displayorder todo onscreen parents


if {$phase != "incrdraw"} { if {$phase != "incrdraw"} {
set phase incrdraw set phase incrdraw
@ -1459,6 +1461,15 @@ proc drawcommit {id} {
lappend todo $id lappend todo $id
set onscreen($id) 0 set onscreen($id) 0
} }
if {$revlistorder} {
set level [lsearch -exact $todo $id]
if {$level < 0} {
error_popup "oops, $id isn't in todo"
return
}
lappend displayorder $id
updatetodo $level 0
} else {
set level [decidenext 1] set level [decidenext 1]
if {$level == {} || $id != [lindex $todo $level]} { if {$level == {} || $id != [lindex $todo $level]} {
return return
@ -1474,6 +1485,7 @@ proc drawcommit {id} {
break break
} }
} }
}
drawmore 1 drawmore 1
} }


@ -1523,8 +1535,9 @@ proc drawrest {} {
global phase stopped redisplaying selectedline global phase stopped redisplaying selectedline
global datemode todo displayorder global datemode todo displayorder
global numcommits ncmupdate global numcommits ncmupdate
global nextupdate startmsecs global nextupdate startmsecs revlistorder


if {!$revlistorder} {
set level [decidenext] set level [decidenext]
if {$level >= 0} { if {$level >= 0} {
set phase drawgraph set phase drawgraph
@ -1536,8 +1549,9 @@ proc drawrest {} {
if {$level < 0} break if {$level < 0} break
} }
} }
drawmore 0
} }
}
drawmore 0
set phase {} set phase {}
set drawmsecs [expr [clock clicks -milliseconds] - $startmsecs] set drawmsecs [expr [clock clicks -milliseconds] - $startmsecs]
#puts "overall $drawmsecs ms for $numcommits commits" #puts "overall $drawmsecs ms for $numcommits commits"
@ -2146,8 +2160,10 @@ proc selectline {l isnew} {
$ctext mark set fmark.0 0.0 $ctext mark set fmark.0 0.0
$ctext mark gravity fmark.0 left $ctext mark gravity fmark.0 left
set info $commitinfo($id) set info $commitinfo($id)
$ctext insert end "Author: [lindex $info 1] [lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "Committer: [lindex $info 3] [lindex $info 4]\n" $ctext insert end "Author: [lindex $info 1] $date\n"
set date [formatdate [lindex $info 4]]
$ctext insert end "Committer: [lindex $info 3] $date\n"
if {[info exists idtags($id)]} { if {[info exists idtags($id)]} {
$ctext insert end "Tags:" $ctext insert end "Tags:"
foreach tag $idtags($id) { foreach tag $idtags($id) {
@ -3226,7 +3242,7 @@ proc lineclick {x y id isnew} {
normalline normalline
$canv delete hover $canv delete hover
# draw this line thicker than normal # draw this line thicker than normal
drawlines $id 1 drawlines $id 1 1
set thickerline $id set thickerline $id
if {$isnew} { if {$isnew} {
set ymax [lindex [$canv cget -scrollregion] 3] set ymax [lindex [$canv cget -scrollregion] 3]
@ -3255,7 +3271,8 @@ proc lineclick {x y id isnew} {
set info $commitinfo($id) set info $commitinfo($id)
$ctext insert end "\n\t[lindex $info 0]\n" $ctext insert end "\n\t[lindex $info 0]\n"
$ctext insert end "\tAuthor:\t[lindex $info 1]\n" $ctext insert end "\tAuthor:\t[lindex $info 1]\n"
$ctext insert end "\tDate:\t[lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "\tDate:\t$date\n"
if {[info exists children($id)]} { if {[info exists children($id)]} {
$ctext insert end "\nChildren:" $ctext insert end "\nChildren:"
set i 0 set i 0
@ -3267,7 +3284,8 @@ proc lineclick {x y id isnew} {
$ctext tag bind link$i <1> [list selbyid $child] $ctext tag bind link$i <1> [list selbyid $child]
$ctext insert end "\n\t[lindex $info 0]" $ctext insert end "\n\t[lindex $info 0]"
$ctext insert end "\n\tAuthor:\t[lindex $info 1]" $ctext insert end "\n\tAuthor:\t[lindex $info 1]"
$ctext insert end "\n\tDate:\t[lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "\n\tDate:\t$date\n"
} }
} }
$ctext conf -state disabled $ctext conf -state disabled
@ -3278,7 +3296,7 @@ proc lineclick {x y id isnew} {
proc normalline {} { proc normalline {} {
global thickerline global thickerline
if {[info exists thickerline]} { if {[info exists thickerline]} {
drawlines $thickerline 0 drawlines $thickerline 0 1
unset thickerline unset thickerline
} }
} }
@ -3650,6 +3668,20 @@ proc doquit {} {
destroy . destroy .
} }


proc formatdate {d} {
global hours nhours tfd

set hr [expr {$d / 3600}]
set ms [expr {$d % 3600}]
if {![info exists hours($hr)]} {
set hours($hr) [clock format $d -format "%Y-%m-%d %H"]
set nhours($hr) 0
}
incr nhours($hr)
set minsec [format "%.2d:%.2d" [expr {$ms/60}] [expr {$ms%60}]]
return "$hours($hr):$minsec"
}

# defaults... # defaults...
set datemode 0 set datemode 0
set boldnames 0 set boldnames 0
@ -3662,6 +3694,7 @@ set findmergefiles 0
set gaudydiff 0 set gaudydiff 0
set maxgraphpct 50 set maxgraphpct 50
set maxwidth 16 set maxwidth 16
set revlistorder 0


set colors {green red blue magenta darkgrey brown orange} set colors {green red blue magenta darkgrey brown orange}


@ -3678,6 +3711,7 @@ foreach arg $argv {
"^$" { } "^$" { }
"^-b" { set boldnames 1 } "^-b" { set boldnames 1 }
"^-d" { set datemode 1 } "^-d" { set datemode 1 }
"^-r" { set revlistorder 1 }
default { default {
lappend revtreeargs $arg lappend revtreeargs $arg
} }