gitk: Fix potential bug with fake commit IDs in renumbervarc
authorPaul Mackerras <paulus@samba.org>
Sun, 6 Jan 2008 02:54:58 +0000 (13:54 +1100)
committerPaul Mackerras <paulus@samba.org>
Sun, 6 Jan 2008 02:54:58 +0000 (13:54 +1100)
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>
gitk
diff --git a/gitk b/gitk
index cddd2189e507068e0d53d12624e0636f2a1efeeb..fda06186b4dcf7d42560cd1ac6cf25d06e295925 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -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 {