From 1d10f36d7fc8aa500198d0bccd3ec2dfad3762c0 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Sun, 15 May 2005 12:55:47 +0000 Subject: [PATCH] Made commit list reading asynchronous Added control+/- to increase/decrease font sizes Rearranged code a little. --- gitk | 255 ++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 163 insertions(+), 92 deletions(-) diff --git a/gitk b/gitk index 3444bac558..3fd260dbfe 100755 --- a/gitk +++ b/gitk @@ -7,48 +7,35 @@ exec wish "$0" -- "${1+$@}" # and distributed under the terms of the GNU General Public Licence, # either version 2, or (at your option) any later version. -# CVS $Revision: 1.8 $ - -set datemode 0 -set boldnames 0 -set revtreeargs {} -set diffopts "-U 5 -p" - -set mainfont {Helvetica 9} -set namefont $mainfont -set textfont {Courier 9} -if {$boldnames} { - lappend namefont bold -} - -set colors {green red blue magenta darkgrey brown orange} -set colorbycommitter false - -catch {source ~/.gitk} - -foreach arg $argv { - switch -regexp -- $arg { - "^$" { } - "^-b" { set boldnames 1 } - "^-c" { set colorbycommitter 1 } - "^-d" { set datemode 1 } - "^-.*" { - puts stderr "unrecognized option $arg" - exit 1 - } - default { - lappend revtreeargs $arg - } - } -} +# CVS $Revision: 1.9 $ proc getcommits {rargs} { - global commits parents cdate nparents children nchildren + global commits commfd phase canv mainfont if {$rargs == {}} { set rargs HEAD } set commits {} - if [catch {set clist [eval exec git-rev-tree $rargs]} err] { + set phase getcommits + if [catch {set commfd [open "|git-rev-tree $rargs" r]} err] { + puts stder "Error executing git-rev-tree: $err" + exit 1 + } + fconfigure $commfd -blocking 0 + fileevent $commfd readable "getcommitline $commfd" + $canv delete all + $canv create text 3 3 -anchor nw -text "Reading commits..." \ + -font $mainfont -tags textitems +} + +proc getcommitline {commfd} { + global commits parents cdate nparents children nchildren + set n [gets $commfd line] + if {$n < 0} { + if {![eof $commfd]} return + if {![catch {close $commfd} err]} { + after idle drawgraph + return + } if {[string range $err 0 4] == "usage"} { puts stderr "Error reading commits: bad arguments to git-rev-tree" puts stderr "Note: arguments to gitk are passed to git-rev-tree" @@ -56,37 +43,35 @@ proc getcommits {rargs} { } else { puts stderr "Error reading commits: $err" } - return 0 + exit 1 } - foreach c [split $clist "\n"] { - set i 0 - set cid {} - foreach f $c { - if {$i == 0} { - set d $f - } else { - set id [lindex [split $f :] 0] - if {![info exists nchildren($id)]} { - set children($id) {} - set nchildren($id) 0 - } - if {$i == 1} { - set cid $id - lappend commits $id - set parents($id) {} - set cdate($id) $d - set nparents($id) 0 - } else { - lappend parents($cid) $id - incr nparents($cid) - incr nchildren($id) - lappend children($id) $cid - } + + set i 0 + set cid {} + foreach f $line { + if {$i == 0} { + set d $f + } else { + set id [lindex [split $f :] 0] + if {![info exists nchildren($id)]} { + set children($id) {} + set nchildren($id) 0 + } + if {$i == 1} { + set cid $id + lappend commits $id + set parents($id) {} + set cdate($id) $d + set nparents($id) 0 + } else { + lappend parents($cid) $id + incr nparents($cid) + incr nchildren($id) + lappend children($id) $cid } - incr i } + incr i } - return 1 } proc readcommit {id} { @@ -140,7 +125,7 @@ proc makewindow {} { menu .bar .bar add cascade -label "File" -menu .bar.file menu .bar.file - .bar.file add command -label "Quit" -command "set stopped 1; destroy ." + .bar.file add command -label "Quit" -command doquit menu .bar.help .bar add cascade -label "Help" -menu .bar.help .bar.help add command -label "About gitk" -command about @@ -235,11 +220,15 @@ proc makewindow {} { bind . b "$ctext yview scroll -1 p" bind . d "$ctext yview scroll 18 u" bind . u "$ctext yview scroll -18 u" - bind . Q "set stopped 1; destroy ." - bind . "set stopped 1; destroy ." + bind . Q doquit + bind . doquit bind . dofind bind . findnext bind . findprev + bind . {incrfont 1} + bind . {incrfont 1} + bind . {incrfont -1} + bind . {incrfont -1} bind $cflist <> listboxsel } @@ -272,7 +261,7 @@ Copyright Use and redistribute under the terms of the GNU General Public License -(CVS $Revision: 1.8 $)} \ +(CVS $Revision: 1.9 $)} \ -justify center -aspect 400 pack $w.m -side top -fill x -padx 20 -pady 20 button $w.ok -text Close -command "destroy $w" @@ -354,32 +343,45 @@ proc assigncolor {id} { } } -proc drawgraph {startlist} { +proc drawgraph {} { global parents children nparents nchildren commits global canv canv2 canv3 mainfont namefont canvx0 canvy0 canvy linespc global datemode cdate global lineid linehtag linentag linedtag commitinfo global nextcolor colormap numcommits - global stopped + global stopped phase redisplaying selectedline - set nextcolor 0 + allcanvs delete all + set start {} foreach id $commits { + if {$nchildren($id) == 0} { + lappend start $id + } set ncleft($id) $nchildren($id) } - foreach id $startlist { + if {$start == {}} { + $canv create text 3 3 -anchor nw -font $mainfont \ + -text "ERROR: No starting commits found" + set phase {} + return + } + + set nextcolor 0 + foreach id $start { assigncolor $id } - set todo $startlist + set todo $start set level [expr [llength $todo] - 1] set y2 $canvy0 set nullentry -1 set lineno -1 set numcommits 0 + set phase drawgraph while 1 { set canvy $y2 allcanvs conf -scrollregion [list 0 0 0 $canvy] update - if {$stopped} return + if {$stopped} break incr numcommits incr lineno set nlines [llength $todo] @@ -549,6 +551,18 @@ proc drawgraph {startlist} { } } } + set phase {} + if {$redisplaying} { + if {$stopped == 0 && [info exists selectedline]} { + selectline $selectedline + } + if {$stopped == 1} { + set stopped 0 + after idle drawgraph + } else { + set redisplaying 0 + } + } } proc dofind {} { @@ -896,27 +910,84 @@ proc listboxsel {} { } } -if {![getcommits $revtreeargs]} { - exit 1 +proc setcoords {} { + global linespc charspc canvx0 canvy0 mainfont + set linespc [font metrics $mainfont -linespace] + set charspc [font measure $mainfont "m"] + set canvy0 [expr 3 + 0.5 * $linespc] + set canvx0 [expr 3 + 0.5 * $linespc] } -set linespc [font metrics $mainfont -linespace] -set charspc [font measure $mainfont "m"] - -set canvy0 [expr 3 + 0.5 * $linespc] -set canvx0 [expr 3 + 0.5 * $linespc] -set namex [expr 45 * $charspc] -set datex [expr 75 * $charspc] - -set stopped 0 -makewindow - -set start {} -foreach id $commits { - if {$nchildren($id) == 0} { - lappend start $id +proc redisplay {} { + global selectedline stopped redisplaying phase + if {$stopped > 1} return + if {$phase == "getcommits"} return + set redisplaying 1 + if {$phase == "drawgraph"} { + set stopped 1 + } else { + drawgraph } } -if {$start != {}} { - drawgraph $start + +proc incrfont {inc} { + global mainfont namefont textfont selectedline ctext canv phase + global stopped + unmarkmatches + set mainfont [lreplace $mainfont 1 1 [expr {[lindex $mainfont 1] + $inc}]] + set namefont [lreplace $namefont 1 1 [expr {[lindex $namefont 1] + $inc}]] + set textfont [lreplace $textfont 1 1 [expr {[lindex $textfont 1] + $inc}]] + setcoords + $ctext conf -font $textfont + $ctext tag conf filesep -font [concat $textfont bold] + if {$phase == "getcommits"} { + $canv itemconf textitems -font $mainfont + } + redisplay } + +proc doquit {} { + global stopped + set stopped 100 + destroy . +} + +# defaults... +set datemode 0 +set boldnames 0 +set diffopts "-U 5 -p" + +set mainfont {Helvetica 9} +set namefont $mainfont +set textfont {Courier 9} +if {$boldnames} { + lappend namefont bold +} + +set colors {green red blue magenta darkgrey brown orange} +set colorbycommitter false + +catch {source ~/.gitk} + +set revtreeargs {} +foreach arg $argv { + switch -regexp -- $arg { + "^$" { } + "^-b" { set boldnames 1 } + "^-c" { set colorbycommitter 1 } + "^-d" { set datemode 1 } + "^-.*" { + puts stderr "unrecognized option $arg" + exit 1 + } + default { + lappend revtreeargs $arg + } + } +} + +set stopped 0 +set redisplaying 0 +setcoords +makewindow +getcommits $revtreeargs