1
0
mirror of https://github.com/git/git.git synced 2024-09-30 09:01:24 +02:00

gitk: Fix cherry-picking to insert a real row not a fake row

The insertrow/removerow functions were really only suitable for
inserting/removing a fake row such as the ones used for showing
the local changes.  When used to insert a real new row from a
cherry-pick, they left things in an inconsistent state which then
caused various strange layout errors.

This renames insertrow/removerow to insertfakerow/removefakerow
and adds a new insertrow that does actually go to all the trouble
of creating a new arc and setting it up.  This is more work but
keeps things consistent.

This also fixes a bug where cherrypick was not setting mainheadid,
and one where selectline wasn't always resulting in targetrow/id
being set to the selected row/id.  Also insert/removefakerow now
adjust numcommits and call setcanvscroll.

Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Paul Mackerras 2008-02-13 22:12:31 +11:00
parent 5a7f577dce
commit b8a938cf78

78
gitk

@ -568,13 +568,48 @@ proc fix_reversal {p a v} {
}
proc insertrow {id p v} {
global varcid varccommits parents children cmitlisted
global commitidx varctok vtokmod targetid targetrow
global cmitlisted children parents varcid varctok vtokmod
global varccommits ordertok commitidx numcommits curview
global targetid targetrow
readcommit $id
set vid $v,$id
set cmitlisted($vid) 1
set children($vid) {}
set parents($vid) [list $p]
set a [newvarc $v $id]
set varcid($vid) $a
if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] < 0} {
modify_arc $v $a
}
lappend varccommits($v,$a) $id
set vp $v,$p
if {[llength [lappend children($vp) $id]] > 1} {
set children($vp) [lsort -command [list vtokcmp $v] $children($vp)]
catch {unset ordertok}
}
fix_reversal $p $a $v
incr commitidx($v)
if {$v == $curview} {
set numcommits $commitidx($v)
setcanvscroll
if {[info exists targetid]} {
if {![comes_before $targetid $p]} {
incr targetrow
}
}
}
}
proc insertfakerow {id p} {
global varcid varccommits parents children cmitlisted
global commitidx varctok vtokmod targetid targetrow curview numcommits
set v $curview
set a $varcid($v,$p)
set i [lsearch -exact $varccommits($v,$a) $p]
if {$i < 0} {
puts "oops: insertrow can't find [shortids $p] on arc $a"
puts "oops: insertfakerow can't find [shortids $p] on arc $a"
return
}
set children($v,$id) {}
@ -582,7 +617,7 @@ proc insertrow {id p v} {
set varcid($v,$id) $a
lappend children($v,$p) $id
set cmitlisted($v,$id) 1
incr commitidx($v)
set numcommits [incr commitidx($v)]
# note we deliberately don't update varcstart($v) even if $i == 0
set varccommits($v,$a) [linsert $varccommits($v,$a) $i $id]
if {[string compare [lindex $varctok($v) $a] $vtokmod($v)] < 0} {
@ -593,23 +628,25 @@ proc insertrow {id p v} {
incr targetrow
}
}
setcanvscroll
drawvisible
}
proc removerow {id v} {
proc removefakerow {id} {
global varcid varccommits parents children commitidx
global varctok vtokmod cmitlisted currentid selectedline
global targetid
global targetid curview numcommits
set v $curview
if {[llength $parents($v,$id)] != 1} {
puts "oops: removerow [shortids $id] has [llength $parents($v,$id)] parents"
puts "oops: removefakerow [shortids $id] has [llength $parents($v,$id)] parents"
return
}
set p [lindex $parents($v,$id) 0]
set a $varcid($v,$id)
set i [lsearch -exact $varccommits($v,$a) $id]
if {$i < 0} {
puts "oops: removerow can't find [shortids $id] on arc $a"
puts "oops: removefakerow can't find [shortids $id] on arc $a"
return
}
unset varcid($v,$id)
@ -617,7 +654,7 @@ proc removerow {id v} {
unset parents($v,$id)
unset children($v,$id)
unset cmitlisted($v,$id)
incr commitidx($v) -1
set numcommits [incr commitidx($v) -1]
set j [lsearch -exact $children($v,$p) $id]
if {$j >= 0} {
set children($v,$p) [lreplace $children($v,$p) $j $j]
@ -632,6 +669,7 @@ proc removerow {id v} {
if {[info exists targetid] && $targetid eq $id} {
set targetid $p
}
setcanvscroll
drawvisible
}
@ -3534,10 +3572,10 @@ proc dohidelocalchanges {} {
global nullid nullid2 lserial curview
if {[commitinview $nullid $curview]} {
removerow $nullid $curview
removefakerow $nullid
}
if {[commitinview $nullid2 $curview]} {
removerow $nullid2 $curview
removefakerow $nullid2
}
incr lserial
}
@ -3581,11 +3619,11 @@ proc readdiffindex {fd serial} {
set commitinfo($nullid2) [list $hl {} {} {} {} " $hl\n"]
set commitdata($nullid2) "\n $hl\n"
if {[commitinview $nullid $curview]} {
removerow $nullid $curview
removefakerow $nullid
}
insertrow $nullid2 $mainheadid $curview
insertfakerow $nullid2 $mainheadid
} elseif {!$isdiff && [commitinview $nullid2 $curview]} {
removerow $nullid2 $curview
removefakerow $nullid2
}
return 0
}
@ -3618,9 +3656,9 @@ proc readdifffiles {fd serial} {
} else {
set p $mainheadid
}
insertrow $nullid $p $curview
insertfakerow $nullid $p
} elseif {!$isdiff && [commitinview $nullid $curview]} {
removerow $nullid $curview
removefakerow $nullid
}
return 0
}
@ -5347,6 +5385,7 @@ proc selectline {l isnew} {
global commentend idtags linknum
global mergemax numcommits pending_select
global cmitmode showneartags allcommits
global targetrow targetid
catch {unset pending_select}
$canv delete hover
@ -5399,6 +5438,8 @@ proc selectline {l isnew} {
set selectedline $l
set currentid $id
set targetid $id
set targetrow $l
$sha1entry delete 0 end
$sha1entry insert 0 $id
$sha1entry selection from 0
@ -6995,7 +7036,7 @@ proc mkbrgo {top} {
proc cherrypick {} {
global rowmenuid curview
global mainhead
global mainhead mainheadid
set oldhead [exec git rev-parse HEAD]
set dheads [descheads $rowmenuid]
@ -7026,6 +7067,7 @@ proc cherrypick {} {
if {$mainhead ne {}} {
movehead $newhead $mainhead
movedhead $newhead $mainhead
set mainheadid $newhead
}
redrawtags $oldhead
redrawtags $newhead
@ -7035,7 +7077,7 @@ proc cherrypick {} {
}
proc resethead {} {
global mainheadid mainhead rowmenuid confirm_ok resettype
global mainhead rowmenuid confirm_ok resettype
set confirm_ok 0
set w ".confirmreset"