global viewargs viewargscmd viewfiles vfilelimit
global showlocalchanges
global viewactive viewinstances vmergeonly
- global mainheadid
+ global mainheadid viewmainheadid viewmainheadid_orig
global vcanopt vflags vrevs vorigargs
set startmsecs [clock clicks -milliseconds]
}
set i [reg_instance $fd]
set viewinstances($view) [list $i]
- if {$showlocalchanges && $mainheadid ne {}} {
- interestedin $mainheadid dodiffindex
+ set viewmainheadid($view) $mainheadid
+ 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 {}
if {$tclencoding != {}} {
global curview vcanopt vorigargs vfilelimit viewinstances
global viewactive viewcomplete tclencoding
global startmsecs showneartags showlocalchanges
- global mainheadid pending_select
+ global mainheadid viewmainheadid viewmainheadid_orig pending_select
global isworktree
global varcid vposids vnegids vflags vrevs
set isworktree [expr {[exec git rev-parse --is-inside-work-tree] == "true"}]
- set oldmainid $mainheadid
rereadrefs
- if {$showlocalchanges} {
- if {$mainheadid ne $oldmainid} {
+ set view $curview
+ if {$mainheadid ne $viewmainheadid_orig($view)} {
+ if {$showlocalchanges} {
dohidelocalchanges
}
- if {[commitinview $mainheadid $curview]} {
- dodiffindex
+ set viewmainheadid($view) $mainheadid
+ set viewmainheadid_orig($view) $mainheadid
+ if {$vfilelimit($view) ne {}} {
+ get_viewmainhead $view
}
}
- set view $curview
+ if {$showlocalchanges} {
+ doshowlocalchanges
+ }
if {$vcanopt($view)} {
set oldpos $vposids($view)
set oldneg $vnegids($view)
drawvisible
}
+# With path limiting, we mightn't get the actual HEAD commit,
+# 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
+
+ catch {
+ 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 mainheadid
+ global curview viewmainheadid
- if {$mainheadid eq {}} return
- if {[commitinview $mainheadid $curview]} {
+ if {$viewmainheadid($curview) eq {}} return
+ if {[commitinview $viewmainheadid($curview) $curview]} {
dodiffindex
} else {
- interestedin $mainheadid dodiffindex
+ interestedin $viewmainheadid($curview) dodiffindex
}
}
# spawn off a process to do git diff-index --cached HEAD
proc dodiffindex {} {
- global lserial showlocalchanges
+ global lserial showlocalchanges vfilelimit curview
global isworktree
if {!$showlocalchanges || !$isworktree} return
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
set i [reg_instance $fd]
filerun $fd [list readdiffindex $fd $lserial $i]
}
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
if {[gets $fd line] < 0} {
}
# 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
set i [reg_instance $fd]
filerun $fd [list readdifffiles $fd $serial $i]
if {[commitinview $nullid $curview]} {
removefakerow $nullid
}
- insertfakerow $nullid2 $mainheadid
+ insertfakerow $nullid2 $viewmainheadid($curview)
} elseif {!$isdiff && [commitinview $nullid2 $curview]} {
+ if {[commitinview $nullid $curview]} {
+ removefakerow $nullid
+ }
removefakerow $nullid2
}
return 0
}
proc readdifffiles {fd serial inst} {
- global mainheadid nullid nullid2 curview
+ global viewmainheadid nullid nullid2 curview
global commitinfo commitdata lserial
set isdiff 1
if {[commitinview $nullid2 $curview]} {
set p $nullid2
} else {
- set p $mainheadid
+ set p $viewmainheadid($curview)
}
insertfakerow $nullid $p
} elseif {!$isdiff && [commitinview $nullid $curview]} {
}
addnewchild $newhead $oldhead
if {[commitinview $oldhead $curview]} {
+ # XXX this isn't right if we have a path limit...
insertrow $newhead $oldhead $curview
if {$mainhead ne {}} {
movehead $newhead $mainhead
proc cobranch {} {
global headmenuid headmenuhead headids
- global showlocalchanges mainheadid
+ global showlocalchanges
# check the tree is clean first??
nowbusy checkout [mc "Checking out"]
proc readcheckoutstat {fd newhead newheadid} {
global mainhead mainheadid headids showlocalchanges progresscoords
+ global viewmainheadid curview
if {[gets $fd line] >= 0} {
if {[regexp {([0-9]+)% \(([0-9]+)/([0-9]+)\)} $line match p m n]} {
set oldmainid $mainheadid
set mainhead $newhead
set mainheadid $newheadid
+ set viewmainheadid($curview) $newheadid
redrawtags $oldmainid
redrawtags $newheadid
selbyid $newheadid