提交 c8c9f3d9 编写于 作者: P Paul Mackerras

gitk: Fix potential bug with fake commit IDs in renumbervarc

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: NPaul Mackerras <paulus@samba.org>
上级 cd2bcae7
......@@ -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
......@@ -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
......@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册