Skip to content

Commit

Permalink
gitk: Fix potential bug with fake commit IDs in renumbervarc
Browse files Browse the repository at this point in the history
When a fake row is added, we add its (fake) ID to the children list
for its (fake) parent.  If renumbervarc were to then renumber the
parent it would incorrectly use the fake child.  This avoids the
problem by adding a last_real_child procedure which won't return
a fake ID, and using it in renumbervarc.  For symmetry this also adds
a first_real_child procedure and uses it in ordertoken.

Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
Paul Mackerras committed Jan 6, 2008
1 parent cd2bcae commit c8c9f3d
Showing 1 changed file with 28 additions and 9 deletions.
37 changes: 28 additions & 9 deletions gitk
Original file line number Diff line number Diff line change
Expand Up @@ -462,8 +462,8 @@ proc renumbervarc {a v} {
set tok $oldtok
}
set ka 0
if {[llength $children($v,$id)] > 0} {
set kid [lindex $children($v,$id) end]
set kid [last_real_child $v,$id]
if {$kid ne {}} {
set k $varcid($v,$kid)
if {[string compare [lindex $varctok($v) $k] $tok] > 0} {
set ki $kid
Expand Down Expand Up @@ -628,6 +628,30 @@ proc removerow {id v} {
drawvisible
}

proc first_real_child {vp} {
global children nullid nullid2

foreach id $children($vp) {
if {$id ne $nullid && $id ne $nullid2} {
return $id
}
}
return {}
}

proc last_real_child {vp} {
global children nullid nullid2

set kids $children($vp)
for {set i [llength $kids]} {[incr i -1] >= 0} {} {
set id [lindex $kids $i]
if {$id ne $nullid && $id ne $nullid2} {
return $id
}
}
return {}
}

proc vtokcmp {v a b} {
global varctok varcid

Expand Down Expand Up @@ -3376,17 +3400,12 @@ proc ordertoken {id} {
set tok $ordertok($p)
break
}
if {[llength $children($curview,$p)] == 0} {
set id [first_real_child $curview,$p]
if {$id eq {}} {
# it's a root
set tok [lindex $varctok($curview) $a]
break
}
set id [lindex $children($curview,$p) 0]
if {$id eq $nullid || $id eq $nullid2} {
# XXX treat it as a root
set tok [lindex $varctok($curview) $a]
break
}
if {[llength $parents($curview,$id)] == 1} {
lappend todo [list $p {}]
} else {
Expand Down

0 comments on commit c8c9f3d

Please sign in to comment.