gitk: Show local changes properly when we have a path limit

Since gitk looks for the HEAD commit to attach the fake commits for
local changes to, we can miss out on seeing the fake commits if we
have a path limit and the HEAD commit doesn't alter any of the files
in the path limit.

This fixes it by running

	git rev-list -1 $head -- $paths

if we have a path limit, and taking the result of that as the commit
to attach the fake commits to.  This means that we can be attaching
the fake commits to a different commit in each view, so we use a new
$viewmainhead($view) for that.

This also fixes a buglet where updatecommits would only fix up the
fake commits if the HEAD changed since the last call to updatecommits,
whereas it should fix them up if the HEAD has changed since this view
was last created or updated.

Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Paul Mackerras 2008-11-18 19:54:14 +11:00
parent 2958228430
commit cdc8429c94

112
gitk
View File

@ -309,7 +309,7 @@ proc start_rev_list {view} {
global viewargs viewargscmd viewfiles vfilelimit global viewargs viewargscmd viewfiles vfilelimit
global showlocalchanges global showlocalchanges
global viewactive viewinstances vmergeonly global viewactive viewinstances vmergeonly
global mainheadid global mainheadid viewmainheadid viewmainheadid_orig
global vcanopt vflags vrevs vorigargs global vcanopt vflags vrevs vorigargs
set startmsecs [clock clicks -milliseconds] set startmsecs [clock clicks -milliseconds]
@ -367,8 +367,13 @@ proc start_rev_list {view} {
} }
set i [reg_instance $fd] set i [reg_instance $fd]
set viewinstances($view) [list $i] set viewinstances($view) [list $i]
if {$showlocalchanges && $mainheadid ne {}} { set viewmainheadid($view) $mainheadid
interestedin $mainheadid dodiffindex set viewmainheadid_orig($view) $mainheadid
if {$files ne {} && $mainheadid ne {}} {
get_viewmainhead $view
}
if {$showlocalchanges && $viewmainheadid($view) ne {}} {
interestedin $viewmainheadid($view) dodiffindex
} }
fconfigure $fd -blocking 0 -translation lf -eofchar {} fconfigure $fd -blocking 0 -translation lf -eofchar {}
if {$tclencoding != {}} { if {$tclencoding != {}} {
@ -446,22 +451,26 @@ proc updatecommits {} {
global curview vcanopt vorigargs vfilelimit viewinstances global curview vcanopt vorigargs vfilelimit viewinstances
global viewactive viewcomplete tclencoding global viewactive viewcomplete tclencoding
global startmsecs showneartags showlocalchanges global startmsecs showneartags showlocalchanges
global mainheadid pending_select global mainheadid viewmainheadid viewmainheadid_orig pending_select
global isworktree global isworktree
global varcid vposids vnegids vflags vrevs global varcid vposids vnegids vflags vrevs
set isworktree [expr {[exec git rev-parse --is-inside-work-tree] == "true"}] set isworktree [expr {[exec git rev-parse --is-inside-work-tree] == "true"}]
set oldmainid $mainheadid
rereadrefs rereadrefs
if {$showlocalchanges} { set view $curview
if {$mainheadid ne $oldmainid} { if {$mainheadid ne $viewmainheadid_orig($view)} {
if {$showlocalchanges} {
dohidelocalchanges dohidelocalchanges
} }
if {[commitinview $mainheadid $curview]} { set viewmainheadid($view) $mainheadid
dodiffindex set viewmainheadid_orig($view) $mainheadid
if {$vfilelimit($view) ne {}} {
get_viewmainhead $view
} }
} }
set view $curview if {$showlocalchanges} {
doshowlocalchanges
}
if {$vcanopt($view)} { if {$vcanopt($view)} {
set oldpos $vposids($view) set oldpos $vposids($view)
set oldneg $vnegids($view) set oldneg $vnegids($view)
@ -4643,14 +4652,56 @@ proc layoutmore {} {
drawvisible drawvisible
} }
proc doshowlocalchanges {} { # With path limiting, we mightn't get the actual HEAD commit,
global curview mainheadid # so ask git rev-list what is the first ancestor of HEAD that
# touches a file in the path limit.
proc get_viewmainhead {view} {
global viewmainheadid vfilelimit viewinstances mainheadid
if {$mainheadid eq {}} return catch {
if {[commitinview $mainheadid $curview]} { set rfd [open [concat | git rev-list -1 $mainheadid \
-- $vfilelimit($view)] r]
set j [reg_instance $rfd]
lappend viewinstances($view) $j
fconfigure $rfd -blocking 0
filerun $rfd [list getviewhead $rfd $j $view]
set viewmainheadid($curview) {}
}
}
# git rev-list should give us just 1 line to use as viewmainheadid($view)
proc getviewhead {fd inst view} {
global viewmainheadid commfd curview viewinstances showlocalchanges
set id {}
if {[gets $fd line] < 0} {
if {![eof $fd]} {
return 1
}
} elseif {[string length $line] == 40 && [string is xdigit $line]} {
set id $line
}
set viewmainheadid($view) $id
close $fd
unset commfd($inst)
set i [lsearch -exact $viewinstances($view) $inst]
if {$i >= 0} {
set viewinstances($view) [lreplace $viewinstances($view) $i $i]
}
if {$showlocalchanges && $id ne {} && $view == $curview} {
doshowlocalchanges
}
return 0
}
proc doshowlocalchanges {} {
global curview viewmainheadid
if {$viewmainheadid($curview) eq {}} return
if {[commitinview $viewmainheadid($curview) $curview]} {
dodiffindex dodiffindex
} else { } else {
interestedin $mainheadid dodiffindex interestedin $viewmainheadid($curview) dodiffindex
} }
} }
@ -4668,19 +4719,24 @@ proc dohidelocalchanges {} {
# spawn off a process to do git diff-index --cached HEAD # spawn off a process to do git diff-index --cached HEAD
proc dodiffindex {} { proc dodiffindex {} {
global lserial showlocalchanges global lserial showlocalchanges vfilelimit curview
global isworktree global isworktree
if {!$showlocalchanges || !$isworktree} return if {!$showlocalchanges || !$isworktree} return
incr lserial incr lserial
set fd [open "|git diff-index --cached HEAD" r] set cmd "|git diff-index --cached HEAD"
if {$vfilelimit($curview) ne {}} {
set cmd [concat $cmd -- $vfilelimit($curview)]
}
set fd [open $cmd r]
fconfigure $fd -blocking 0 fconfigure $fd -blocking 0
set i [reg_instance $fd] set i [reg_instance $fd]
filerun $fd [list readdiffindex $fd $lserial $i] filerun $fd [list readdiffindex $fd $lserial $i]
} }
proc readdiffindex {fd serial inst} { proc readdiffindex {fd serial inst} {
global mainheadid nullid nullid2 curview commitinfo commitdata lserial global viewmainheadid nullid nullid2 curview commitinfo commitdata lserial
global vfilelimit
set isdiff 1 set isdiff 1
if {[gets $fd line] < 0} { if {[gets $fd line] < 0} {
@ -4697,7 +4753,11 @@ proc readdiffindex {fd serial inst} {
} }
# now see if there are any local changes not checked in to the index # now see if there are any local changes not checked in to the index
set fd [open "|git diff-files" r] set cmd "|git diff-files"
if {$vfilelimit($curview) ne {}} {
set cmd [concat $cmd -- $vfilelimit($curview)]
}
set fd [open $cmd r]
fconfigure $fd -blocking 0 fconfigure $fd -blocking 0
set i [reg_instance $fd] set i [reg_instance $fd]
filerun $fd [list readdifffiles $fd $serial $i] filerun $fd [list readdifffiles $fd $serial $i]
@ -4710,15 +4770,18 @@ proc readdiffindex {fd serial inst} {
if {[commitinview $nullid $curview]} { if {[commitinview $nullid $curview]} {
removefakerow $nullid removefakerow $nullid
} }
insertfakerow $nullid2 $mainheadid insertfakerow $nullid2 $viewmainheadid($curview)
} elseif {!$isdiff && [commitinview $nullid2 $curview]} { } elseif {!$isdiff && [commitinview $nullid2 $curview]} {
if {[commitinview $nullid $curview]} {
removefakerow $nullid
}
removefakerow $nullid2 removefakerow $nullid2
} }
return 0 return 0
} }
proc readdifffiles {fd serial inst} { proc readdifffiles {fd serial inst} {
global mainheadid nullid nullid2 curview global viewmainheadid nullid nullid2 curview
global commitinfo commitdata lserial global commitinfo commitdata lserial
set isdiff 1 set isdiff 1
@ -4743,7 +4806,7 @@ proc readdifffiles {fd serial inst} {
if {[commitinview $nullid2 $curview]} { if {[commitinview $nullid2 $curview]} {
set p $nullid2 set p $nullid2
} else { } else {
set p $mainheadid set p $viewmainheadid($curview)
} }
insertfakerow $nullid $p insertfakerow $nullid $p
} elseif {!$isdiff && [commitinview $nullid $curview]} { } elseif {!$isdiff && [commitinview $nullid $curview]} {
@ -8341,6 +8404,7 @@ proc cherrypick {} {
} }
addnewchild $newhead $oldhead addnewchild $newhead $oldhead
if {[commitinview $oldhead $curview]} { if {[commitinview $oldhead $curview]} {
# XXX this isn't right if we have a path limit...
insertrow $newhead $oldhead $curview insertrow $newhead $oldhead $curview
if {$mainhead ne {}} { if {$mainhead ne {}} {
movehead $newhead $mainhead movehead $newhead $mainhead
@ -8448,7 +8512,7 @@ proc headmenu {x y id head} {
proc cobranch {} { proc cobranch {} {
global headmenuid headmenuhead headids global headmenuid headmenuhead headids
global showlocalchanges mainheadid global showlocalchanges
# check the tree is clean first?? # check the tree is clean first??
nowbusy checkout [mc "Checking out"] nowbusy checkout [mc "Checking out"]
@ -8469,6 +8533,7 @@ proc cobranch {} {
proc readcheckoutstat {fd newhead newheadid} { proc readcheckoutstat {fd newhead newheadid} {
global mainhead mainheadid headids showlocalchanges progresscoords global mainhead mainheadid headids showlocalchanges progresscoords
global viewmainheadid curview
if {[gets $fd line] >= 0} { if {[gets $fd line] >= 0} {
if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} { if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} {
@ -8486,6 +8551,7 @@ proc readcheckoutstat {fd newhead newheadid} {
set oldmainid $mainheadid set oldmainid $mainheadid
set mainhead $newhead set mainhead $newhead
set mainheadid $newheadid set mainheadid $newheadid
set viewmainheadid($curview) $newheadid
redrawtags $oldmainid redrawtags $oldmainid
redrawtags $newheadid redrawtags $newheadid
selbyid $newheadid selbyid $newheadid