mirror of
https://github.com/git/git.git
synced 2024-11-05 08:47:56 +01:00
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: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
cd2bcae798
commit
c8c9f3d9cc
1 changed files with 28 additions and 9 deletions
37
gitk
37
gitk
|
@ -462,8 +462,8 @@ proc renumbervarc {a v} {
|
||||||
set tok $oldtok
|
set tok $oldtok
|
||||||
}
|
}
|
||||||
set ka 0
|
set ka 0
|
||||||
if {[llength $children($v,$id)] > 0} {
|
set kid [last_real_child $v,$id]
|
||||||
set kid [lindex $children($v,$id) end]
|
if {$kid ne {}} {
|
||||||
set k $varcid($v,$kid)
|
set k $varcid($v,$kid)
|
||||||
if {[string compare [lindex $varctok($v) $k] $tok] > 0} {
|
if {[string compare [lindex $varctok($v) $k] $tok] > 0} {
|
||||||
set ki $kid
|
set ki $kid
|
||||||
|
@ -628,6 +628,30 @@ proc removerow {id v} {
|
||||||
drawvisible
|
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} {
|
proc vtokcmp {v a b} {
|
||||||
global varctok varcid
|
global varctok varcid
|
||||||
|
|
||||||
|
@ -3376,17 +3400,12 @@ proc ordertoken {id} {
|
||||||
set tok $ordertok($p)
|
set tok $ordertok($p)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if {[llength $children($curview,$p)] == 0} {
|
set id [first_real_child $curview,$p]
|
||||||
|
if {$id eq {}} {
|
||||||
# it's a root
|
# it's a root
|
||||||
set tok [lindex $varctok($curview) $a]
|
set tok [lindex $varctok($curview) $a]
|
||||||
break
|
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} {
|
if {[llength $parents($curview,$id)] == 1} {
|
||||||
lappend todo [list $p {}]
|
lappend todo [list $p {}]
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue