This will make it easier to switch between views efficiently, and
turns out to be slightly faster as well.
Signed-off-by: Paul Mackerras <paulus@samba.org>
global commitlisted nextupdate
global leftover
global displayorder commitidx commitrow commitdata
global commitlisted nextupdate
global leftover
global displayorder commitidx commitrow commitdata
+ global parentlist childlist children
set stuff [read $commfd]
if {$stuff == {}} {
set stuff [read $commfd]
if {$stuff == {}} {
set id [lindex $ids 0]
if {$listed} {
set olds [lrange $ids 1 end]
set id [lindex $ids 0]
if {$listed} {
set olds [lrange $ids 1 end]
- set commitlisted($id) 1
+ if {[llength $olds] > 1} {
+ set olds [lsort -unique $olds]
+ }
+ foreach p $olds {
+ lappend children($p) $id
+ }
- updatechildren $id $olds
+ lappend parentlist $olds
+ if {[info exists children($id)]} {
+ lappend childlist $children($id)
+ } else {
+ lappend childlist {}
+ }
set commitdata($id) [string range $cmit [expr {$j + 1}] end]
set commitrow($id) $commitidx
incr commitidx
lappend displayorder $id
set commitdata($id) [string range $cmit [expr {$j + 1}] end]
set commitrow($id) $commitidx
incr commitidx
lappend displayorder $id
+ lappend commitlisted $listed
set gotsome 1
}
if {$gotsome} {
set gotsome 1
}
if {$gotsome} {
proc readcommit {id} {
if {[catch {set contents [exec git-cat-file commit $id]}]} return
proc readcommit {id} {
if {[catch {set contents [exec git-cat-file commit $id]}]} return
parsecommit $id $contents 0
}
proc updatecommits {rargs} {
stopfindproc
parsecommit $id $contents 0
}
proc updatecommits {rargs} {
stopfindproc
- foreach v {children nchildren parents nparents commitlisted
- colormap selectedline matchinglines treediffs
+ foreach v {colormap selectedline matchinglines treediffs
mergefilelist currentid rowtextx commitrow
rowidlist rowoffsets idrowranges idrangedrawn iddrawn
linesegends crossings cornercrossings} {
mergefilelist currentid rowtextx commitrow
rowidlist rowoffsets idrowranges idrangedrawn iddrawn
linesegends crossings cornercrossings} {
-proc updatechildren {id olds} {
- global children nchildren parents nparents
-
- if {![info exists nchildren($id)]} {
- set children($id) {}
- set nchildren($id) 0
- }
- set parents($id) $olds
- set nparents($id) [llength $olds]
- foreach p $olds {
- if {![info exists nchildren($p)]} {
- set children($p) [list $id]
- set nchildren($p) 1
- } elseif {[lsearch -exact $children($p) $id] < 0} {
- lappend children($p) $id
- incr nchildren($p)
- }
- }
-}
-
proc parsecommit {id contents listed} {
global commitinfo cdate
proc parsecommit {id contents listed} {
global commitinfo cdate
- global commitdata commitinfo nparents
+ global commitdata commitinfo
if {[info exists commitdata($id)]} {
parsecommit $id $commitdata($id) 1
if {[info exists commitdata($id)]} {
parsecommit $id $commitdata($id) 1
readcommit $id
if {![info exists commitinfo($id)]} {
set commitinfo($id) {"No commit information available"}
readcommit $id
if {![info exists commitinfo($id)]} {
set commitinfo($id) {"No commit information available"}
- global rowidlist rowoffsets displayorder
+ global rowidlist rowoffsets displayorder commitlisted
global rowlaidout rowoptim
global idinlist rowchk
global commitidx numcommits canvxmax canv
global nextcolor
global rowlaidout rowoptim
global idinlist rowchk
global commitidx numcommits canvxmax canv
global nextcolor
+ global parentlist childlist children
set commitidx 0
set numcommits 0
set displayorder {}
set commitidx 0
set numcommits 0
set displayorder {}
+ set commitlisted {}
+ set parentlist {}
+ set childlist {}
+ catch {unset children}
set nextcolor 0
set rowidlist {{}}
set rowoffsets {{}}
set nextcolor 0
set rowidlist {{}}
set rowoffsets {{}}
proc layoutrows {row endrow last} {
global rowidlist rowoffsets displayorder
global uparrowlen downarrowlen maxwidth mingaplen
proc layoutrows {row endrow last} {
global rowidlist rowoffsets displayorder
global uparrowlen downarrowlen maxwidth mingaplen
- global nchildren parents nparents
+ global childlist parentlist
global idrowranges linesegends
global commitidx
global idinlist rowchk
global idrowranges linesegends
global commitidx
global idinlist rowchk
set id [lindex $displayorder $row]
set oldolds {}
set newolds {}
set id [lindex $displayorder $row]
set oldolds {}
set newolds {}
- foreach p $parents($id) {
+ foreach p [lindex $parentlist $row] {
if {![info exists idinlist($p)]} {
lappend newolds $p
} elseif {!$idinlist($p)} {
if {![info exists idinlist($p)]} {
lappend newolds $p
} elseif {!$idinlist($p)} {
lappend idlist $id
lset rowidlist $row $idlist
set z {}
lappend idlist $id
lset rowidlist $row $idlist
set z {}
- if {$nchildren($id) > 0} {
+ if {[lindex $childlist $row] ne {}} {
set z [expr {[llength [lindex $rowidlist [expr {$row-1}]]] - $col}]
unset idinlist($id)
}
set z [expr {[llength [lindex $rowidlist [expr {$row-1}]]] - $col}]
unset idinlist($id)
}
}
proc addextraid {id row} {
}
proc addextraid {id row} {
- global displayorder commitrow commitinfo nparents
+ global displayorder commitrow commitinfo
+ global parentlist childlist children
incr commitidx
lappend displayorder $id
incr commitidx
lappend displayorder $id
set commitrow($id) $row
readcommit $id
if {![info exists commitinfo($id)]} {
set commitinfo($id) {"No commit information available"}
set commitrow($id) $row
readcommit $id
if {![info exists commitinfo($id)]} {
set commitinfo($id) {"No commit information available"}
+ }
+ if {[info exists children($id)]} {
+ lappend childlist $children($id)
+ } else {
+ lappend childlist {}
proc drawlines {id} {
global colormap canv
global idrowranges idrangedrawn
proc drawlines {id} {
global colormap canv
global idrowranges idrangedrawn
- global children iddrawn commitrow rowidlist
+ global childlist iddrawn commitrow rowidlist
$canv delete lines.$id
set nr [expr {[llength $idrowranges($id)] / 2}]
$canv delete lines.$id
set nr [expr {[llength $idrowranges($id)] / 2}]
- if {[info exists children($id)]} {
- foreach child $children($id) {
- if {[info exists iddrawn($child)]} {
- set row $commitrow($child)
- set col [lsearch -exact [lindex $rowidlist $row] $child]
- if {$col >= 0} {
- drawparentlinks $child $row $col [list $id]
- }
+ foreach child [lindex $childlist $commitrow($id)] {
+ if {[info exists iddrawn($child)]} {
+ set row $commitrow($child)
+ set col [lsearch -exact [lindex $rowidlist $row] $child]
+ if {$col >= 0} {
+ drawparentlinks $child $row $col [list $id]
global linehtag linentag linedtag
global mainfont namefont canvxmax
global linehtag linentag linedtag
global mainfont namefont canvxmax
- set ofill [expr {[info exists commitlisted($id)]? "blue": "white"}]
+ set ofill [expr {[lindex $commitlisted $row]? "blue": "white"}]
set x [xc $row $col]
set y [yc $row]
set orad [expr {$linespc / 3}]
set x [xc $row $col]
set y [yc $row]
set orad [expr {$linespc / 3}]
proc drawcmitrow {row} {
global displayorder rowidlist
global idrowranges idrangedrawn iddrawn
proc drawcmitrow {row} {
global displayorder rowidlist
global idrowranges idrangedrawn iddrawn
- global commitinfo commitlisted parents numcommits
+ global commitinfo commitlisted parentlist numcommits
if {$row >= $numcommits} return
foreach id [lindex $rowidlist $row] {
if {$row >= $numcommits} return
foreach id [lindex $rowidlist $row] {
getcommit $id
}
assigncolor $id
getcommit $id
}
assigncolor $id
- if {[info exists commitlisted($id)] && [info exists parents($id)]
- && $parents($id) ne {}} {
- set rmx [drawparentlinks $id $row $col $parents($id)]
+ set olds [lindex $parentlist $row]
+ if {$olds ne {}} {
+ set rmx [drawparentlinks $id $row $col $olds]
proc assigncolor {id} {
global colormap colors nextcolor
proc assigncolor {id} {
global colormap colors nextcolor
- global parents nparents children nchildren
+ global commitrow parentlist children childlist
global cornercrossings crossings
if {[info exists colormap($id)]} return
set ncolors [llength $colors]
global cornercrossings crossings
if {[info exists colormap($id)]} return
set ncolors [llength $colors]
- if {$nchildren($id) == 1} {
- set child [lindex $children($id) 0]
+ if {[info exists commitrow($id)]} {
+ set kids [lindex $childlist $commitrow($id)]
+ } elseif {[info exists children($id)]} {
+ set kids $children($id)
+ } else {
+ set kids {}
+ }
+ if {[llength $kids] == 1} {
+ set child [lindex $kids 0]
if {[info exists colormap($child)]
if {[info exists colormap($child)]
- && $nparents($child) == 1} {
+ && [llength [lindex $parentlist $commitrow($child)]] == 1} {
set colormap($id) $colormap($child)
return
}
set colormap($id) $colormap($child)
return
}
set origbad $badcolors
}
if {[llength $badcolors] < $ncolors - 1} {
set origbad $badcolors
}
if {[llength $badcolors] < $ncolors - 1} {
- foreach child $children($id) {
if {[info exists colormap($child)]
&& [lsearch -exact $badcolors $colormap($child)] < 0} {
lappend badcolors $colormap($child)
}
if {[info exists colormap($child)]
&& [lsearch -exact $badcolors $colormap($child)] < 0} {
lappend badcolors $colormap($child)
}
- if {[info exists parents($child)]} {
- foreach p $parents($child) {
- if {[info exists colormap($p)]
- && [lsearch -exact $badcolors $colormap($p)] < 0} {
- lappend badcolors $colormap($p)
- }
+ foreach p [lindex $parentlist $commitrow($child)] {
+ if {[info exists colormap($p)]
+ && [lsearch -exact $badcolors $colormap($p)] < 0} {
+ lappend badcolors $colormap($p)
}
proc checkcrossings {row endrow} {
}
proc checkcrossings {row endrow} {
- global displayorder parents rowidlist
+ global displayorder parentlist rowidlist
for {} {$row < $endrow} {incr row} {
set id [lindex $displayorder $row]
set i [lsearch -exact [lindex $rowidlist $row] $id]
if {$i < 0} continue
set idlist [lindex $rowidlist [expr {$row+1}]]
for {} {$row < $endrow} {incr row} {
set id [lindex $displayorder $row]
set i [lsearch -exact [lindex $rowidlist $row] $id]
if {$i < 0} continue
set idlist [lindex $rowidlist [expr {$row+1}]]
- foreach p $parents($id) {
+ foreach p [lindex $parentlist $row] {
set j [lsearch -exact $idlist $p]
if {$j > 0} {
if {$j < $i - 1} {
set j [lsearch -exact $idlist $p]
if {$j > 0} {
if {$j < $i - 1} {
showstuff $commitidx
set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}]
showstuff $commitidx
set drawmsecs [expr {[clock clicks -milliseconds] - $startmsecs}]
- #puts "overall $drawmsecs ms for $numcommits commits"
+ puts "overall $drawmsecs ms for $numcommits commits"
proc findfiles {} {
global selectedline numcommits displayorder ctext
proc findfiles {} {
global selectedline numcommits displayorder ctext
- global ffileline finddidsel parents nparents
+ global ffileline finddidsel parentlist
global findinprogress findstartline findinsertpos
global treediffs fdiffid fdiffsneeded fdiffpos
global findmergefiles
global findinprogress findstartline findinsertpos
global treediffs fdiffid fdiffsneeded fdiffpos
global findmergefiles
set fdiffsneeded {}
while 1 {
set id [lindex $displayorder $l]
set fdiffsneeded {}
while 1 {
set id [lindex $displayorder $l]
- if {$findmergefiles || $nparents($id) == 1} {
+ if {$findmergefiles || [llength [lindex $parentlist $l]] == 1} {
if {![info exists treediffs($id)]} {
append diffsneeded "$id\n"
lappend fdiffsneeded $id
if {![info exists treediffs($id)]} {
append diffsneeded "$id\n"
lappend fdiffsneeded $id
. config -cursor watch
settextcursor watch
set findinprogress 1
. config -cursor watch
settextcursor watch
set findinprogress 1
set treediffs($nullid) {}
if {[info exists findid] && $nullid eq $findid} {
unset findid
set treediffs($nullid) {}
if {[info exists findid] && $nullid eq $findid} {
unset findid
}
if {[info exists findid] && $fdiffid eq $findid} {
unset findid
}
if {[info exists findid] && $fdiffid eq $findid} {
unset findid
}
}
}
proc findcont {id} {
}
}
}
proc findcont {id} {
- global findid treediffs parents nparents
+ global findid treediffs parentlist
global ffileline findstartline finddidsel
global displayorder numcommits matchinglines findinprogress
global findmergefiles
set l $ffileline
global ffileline findstartline finddidsel
global displayorder numcommits matchinglines findinprogress
global findmergefiles
set l $ffileline
- while 1 {
- if {$findmergefiles || $nparents($id) == 1} {
+ while {1} {
+ set id [lindex $displayorder $l]
+ if {$findmergefiles || [llength [lindex $parentlist $l]] == 1} {
if {![info exists treediffs($id)]} {
set findid $id
set ffileline $l
if {![info exists treediffs($id)]} {
set findid $id
set ffileline $l
set l 0
}
if {$l == $findstartline} break
set l 0
}
if {$l == $findstartline} break
- set id [lindex $displayorder $l]
}
stopfindproc
if {!$finddidsel} {
}
stopfindproc
if {!$finddidsel} {
proc selectline {l isnew} {
global canv canv2 canv3 ctext commitinfo selectedline
global displayorder linehtag linentag linedtag
proc selectline {l isnew} {
global canv canv2 canv3 ctext commitinfo selectedline
global displayorder linehtag linentag linedtag
- global canvy0 linespc parents nparents children
+ global canvy0 linespc parentlist childlist
global cflist currentid sha1entry
global commentend idtags linknum
global mergemax numcommits
global cflist currentid sha1entry
global commentend idtags linknum
global mergemax numcommits
- if {$nparents($id) > 1} {
+ set olds [lindex $parentlist $l]
+ if {[llength $olds] > 1} {
- foreach p $parents($id) {
if {$np >= $mergemax} {
set tag mmax
} else {
if {$np >= $mergemax} {
set tag mmax
} else {
- if {[info exists parents($id)]} {
- foreach p $parents($id) {
- append comment "Parent: [commit_descriptor $p]\n"
- }
+ foreach p $olds {
+ append comment "Parent: [commit_descriptor $p]\n"
- if {[info exists children($id)]} {
- foreach c $children($id) {
- append comment "Child: [commit_descriptor $c]\n"
- }
+ foreach c [lindex $childlist $l] {
+ append comment "Child: [commit_descriptor $c]\n"
}
append comment "\n"
append comment [lindex $info 5]
}
append comment "\n"
append comment [lindex $info 5]
$cflist delete 0 end
$cflist insert end "Comments"
$cflist delete 0 end
$cflist insert end "Comments"
- if {$nparents($id) <= 1} {
+ if {[llength $olds] <= 1} {
-proc mergediff {id} {
- global parents diffmergeid diffopts mdifffd
+proc mergediff {id l} {
+ global diffmergeid diffopts mdifffd
global difffilestart diffids
global difffilestart diffids
set diffmergeid $id
set diffids $id
set diffmergeid $id
set diffids $id
}
fconfigure $mdf -blocking 0
set mdifffd($id) $mdf
}
fconfigure $mdf -blocking 0
set mdifffd($id) $mdf
- fileevent $mdf readable [list getmergediffline $mdf $id]
+ set np [llength [lindex $parentlist $l]]
+ fileevent $mdf readable [list getmergediffline $mdf $id $np]
set nextupdate [expr {[clock clicks -milliseconds] + 100}]
}
set nextupdate [expr {[clock clicks -milliseconds] + 100}]
}
-proc getmergediffline {mdf id} {
- global diffmergeid ctext cflist nextupdate nparents mergemax
+proc getmergediffline {mdf id np} {
+ global diffmergeid ctext cflist nextupdate mergemax
global difffilestart mdifffd
set n [gets $mdf line]
global difffilestart mdifffd
set n [gets $mdf line]
# do nothing
} else {
# parse the prefix - one ' ', '-' or '+' for each parent
# do nothing
} else {
# parse the prefix - one ' ', '-' or '+' for each parent
set spaces {}
set minuses {}
set pluses {}
set spaces {}
set minuses {}
set pluses {}
}
proc gettreediffs {ids} {
}
proc gettreediffs {ids} {
- global treediff parents treepending
+ global treediff treepending
set treepending $ids
set treediff {}
if {[catch \
set treepending $ids
set treediff {}
if {[catch \
}
proc lineclick {x y id isnew} {
}
proc lineclick {x y id isnew} {
- global ctext commitinfo children cflist canv thickerline
+ global ctext commitinfo childlist commitrow cflist canv thickerline
if {![info exists commitinfo($id)] && ![getcommit $id]} return
unmarkmatches
if {![info exists commitinfo($id)] && ![getcommit $id]} return
unmarkmatches
$ctext insert end "\tAuthor:\t[lindex $info 1]\n"
set date [formatdate [lindex $info 2]]
$ctext insert end "\tDate:\t$date\n"
$ctext insert end "\tAuthor:\t[lindex $info 1]\n"
set date [formatdate [lindex $info 2]]
$ctext insert end "\tDate:\t$date\n"
- if {[info exists children($id)]} {
+ set kids [lindex $childlist $commitrow($id)]
+ if {$kids ne {}} {
$ctext insert end "\nChildren:"
set i 0
$ctext insert end "\nChildren:"
set i 0
- foreach child $children($id) {
incr i
if {![info exists commitinfo($child)] && ![getcommit $child]} continue
set info $commitinfo($child)
incr i
if {![info exists commitinfo($child)] && ![getcommit $child]} continue
set info $commitinfo($child)