Code

gitk: Fix potential bug with fake commit IDs in renumbervarc
[git.git] / 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 {