提交 42a671fc 编写于 作者: P Paul Mackerras

gitk: Fix some corner cases in the targetid/targetrow stuff

* Make sure targetrow is never >= numcommits
* Don't try to do anything about the target row if the targetid is
  no longer in the view; it'll just cause Tcl errors
* In insertrow, increment targetrow if we are inserting the fake
  commit at or before the target row
* In removerow, if we are removing the target row, make it the next
  one instead.
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 33de5c0d
......@@ -234,7 +234,7 @@ proc updatecommits {} {
proc reloadcommits {} {
global curview viewcomplete selectedline currentid thickerline
global showneartags treediffs commitinterest cached_commitrow
global progresscoords
global progresscoords targetid
if {!$viewcomplete($curview)} {
stop_rev_list $curview
......@@ -254,6 +254,7 @@ proc reloadcommits {} {
clear_display
catch {unset commitinterest}
catch {unset cached_commitrow}
catch {unset targetid}
setcanvscroll
getcommits
}
......@@ -561,7 +562,7 @@ proc fix_reversal {p a v} {
proc insertrow {id p v} {
global varcid varccommits parents children cmitlisted
global commitidx varctok vtokmod
global commitidx varctok vtokmod targetid targetrow
set a $varcid($v,$p)
set i [lsearch -exact $varccommits($v,$a) $p]
......@@ -580,12 +581,18 @@ proc insertrow {id p v} {
if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] < 0} {
modify_arc $v $a $i
}
if {[info exists targetid]} {
if {![comes_before $targetid $p]} {
incr targetrow
}
}
drawvisible
}
proc removerow {id v} {
global varcid varccommits parents children commitidx
global varctok vtokmod cmitlisted currentid selectedline
global targetid
if {[llength $parents($v,$id)] != 1} {
puts "oops: removerow [shortids $id] has [llength $parents($v,$id)] parents"
......@@ -615,6 +622,9 @@ proc removerow {id v} {
unset currentid
unset selectedline
}
if {[info exists targetid] && $targetid eq $id} {
set targetid $p
}
drawvisible
}
......@@ -756,6 +766,22 @@ proc rowofcommit {id} {
return $i
}
# Returns 1 if a is on an earlier row than b, otherwise 0
proc comes_before {a b} {
global varcid varctok curview
set v $curview
if {$a eq $b || ![info exists varcid($v,$a)] || \
![info exists varcid($v,$b)]} {
return 0
}
if {$varcid($v,$a) != $varcid($v,$b)} {
return [expr {[string compare [lindex $varctok($v) $varcid($v,$a)] \
[lindex $varctok($v) $varcid($v,$b)]] < 0}]
}
return [expr {[rowofcommit $a] < [rowofcommit $b]}]
}
proc bsearch {l elt} {
if {[llength $l] == 0 || $elt <= [lindex $l 0]} {
return 0
......@@ -4540,7 +4566,7 @@ proc undolayout {row} {
proc drawvisible {} {
global canv linespc curview vrowmod selectedline targetrow targetid
global need_redisplay cscroll
global need_redisplay cscroll numcommits
set fs [$canv yview]
set ymax [lindex [$canv cget -scrollregion] 3]
......@@ -4551,21 +4577,25 @@ proc drawvisible {} {
set y1 [expr {int($f1 * $ymax)}]
if {[info exists targetid]} {
set r [rowofcommit $targetid]
if {$r != $targetrow} {
# Fix up the scrollregion and change the scrolling position
# now that our target row has moved.
set diff [expr {($r - $targetrow) * $linespc}]
set targetrow $r
setcanvscroll
set ymax [lindex [$canv cget -scrollregion] 3]
incr y0 $diff
incr y1 $diff
set f0 [expr {$y0 / $ymax}]
set f1 [expr {$y1 / $ymax}]
allcanvs yview moveto $f0
$cscroll set $f0 $f1
set need_redisplay 1
if {[commitinview $targetid $curview]} {
set r [rowofcommit $targetid]
if {$r != $targetrow} {
# Fix up the scrollregion and change the scrolling position
# now that our target row has moved.
set diff [expr {($r - $targetrow) * $linespc}]
set targetrow $r
setcanvscroll
set ymax [lindex [$canv cget -scrollregion] 3]
incr y0 $diff
incr y1 $diff
set f0 [expr {$y0 / $ymax}]
set f1 [expr {$y1 / $ymax}]
allcanvs yview moveto $f0
$cscroll set $f0 $f1
set need_redisplay 1
}
} else {
unset targetid
}
}
......@@ -4580,6 +4610,9 @@ proc drawvisible {} {
} else {
set targetrow [expr {int(($row + $endrow) / 2)}]
}
if {$targetrow >= $numcommits} {
set targetrow [expr {$numcommits - 1}]
}
set targetid [commitonrow $targetrow]
drawcommits $row $endrow
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册