gitk: Fix bug causing the "can't unset idinlist(...)" error

Under some circumstances, having duplicate parents in a commit could
trigger a "can't unset idinlist" Tcl error.  This fixes the cause
(the logic in layoutrows could end up putting the same commit into
rowidlist twice) and also puts a catch around the unset to ignore
the error.

Thanks to Jeff King for coming up with a test script to generate a
repo that shows the problem.

Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Paul Mackerras 2007-08-12 17:23:47 +10:00
parent 3244729aac
commit 67a4f1a7f5

5
gitk
View File

@ -2880,6 +2880,7 @@ proc layoutrows {row endrow last} {
} elseif {!$idinlist($p)} { } elseif {!$idinlist($p)} {
lappend oldolds $p lappend oldolds $p
} }
set idinlist($p) 1
} }
set nev [expr {[llength $idlist] + [llength $newolds] set nev [expr {[llength $idlist] + [llength $newolds]
+ [llength $oldolds] - $maxwidth + 1}] + [llength $oldolds] - $maxwidth + 1}]
@ -2952,12 +2953,10 @@ proc layoutrows {row endrow last} {
lset offs $col {} lset offs $col {}
} }
foreach i $newolds { foreach i $newolds {
set idinlist($i) 1
set idrowranges($i) $id set idrowranges($i) $id
} }
incr col $l incr col $l
foreach oid $oldolds { foreach oid $oldolds {
set idinlist($oid) 1
set idlist [linsert $idlist $col $oid] set idlist [linsert $idlist $col $oid]
set offs [linsert $offs $col $o] set offs [linsert $offs $col $o]
makeuparrow $oid $col $row $o makeuparrow $oid $col $row $o
@ -2998,7 +2997,7 @@ proc layouttail {} {
set col [expr {[llength $idlist] - 1}] set col [expr {[llength $idlist] - 1}]
set id [lindex $idlist $col] set id [lindex $idlist $col]
addextraid $id $row addextraid $id $row
unset idinlist($id) catch {unset idinlist($id)}
lappend idrowranges($id) $id lappend idrowranges($id) $id
lappend rowrangelist $idrowranges($id) lappend rowrangelist $idrowranges($id)
unset idrowranges($id) unset idrowranges($id)