diff --git a/gitk-git/gitk b/gitk-git/gitk index 3353f4a271..f7f177621c 100644 --- a/gitk-git/gitk +++ b/gitk-git/gitk @@ -155,18 +155,16 @@ proc parseviewargs {n arglist} { set origargs [lreplace $origargs $i $i] incr i -1 } - # These request or affect diff output, which we don't want. - # Some could be used to set our defaults for diff display. "-[puabwcrRBMC]" - "--no-renames" - "--full-index" - "--binary" - "--abbrev=*" - "--find-copies-harder" - "-l*" - "--ext-diff" - "--no-ext-diff" - "--src-prefix=*" - "--dst-prefix=*" - "--no-prefix" - "-O*" - "--text" - "--full-diff" - "--ignore-space-at-eol" - "--ignore-space-change" - "-U*" - "--unified=*" { + # These request or affect diff output, which we don't want. + # Some could be used to set our defaults for diff display. lappend diffargs $arg } - # These cause our parsing of git log's output to fail, or else - # they're options we want to set ourselves, so ignore them. "--raw" - "--patch-with-raw" - "--patch-with-stat" - "--name-only" - "--name-status" - "--color" - "--color-words" - "--log-size" - "--pretty=*" - "--decorate" - "--abbrev-commit" - @@ -174,27 +172,29 @@ proc parseviewargs {n arglist} { "--no-color" - "-g" - "--walk-reflogs" - "--no-walk" - "--timestamp" - "relative-date" - "--date=*" - "--stdin" - "--objects" - "--objects-edge" - "--reverse" { + # These cause our parsing of git log's output to fail, or else + # they're options we want to set ourselves, so ignore them. } - # These are harmless, and some are even useful "--stat=*" - "--numstat" - "--shortstat" - "--summary" - "--check" - "--exit-code" - "--quiet" - "--topo-order" - "--full-history" - "--dense" - "--sparse" - "--follow" - "--left-right" - "--encoding=*" { + # These are harmless, and some are even useful lappend glflags $arg } - # These mean that we get a subset of the commits "--diff-filter=*" - "--no-merges" - "--unpacked" - "--max-count=*" - "--skip=*" - "--since=*" - "--after=*" - "--until=*" - "--before=*" - "--max-age=*" - "--min-age=*" - "--author=*" - "--committer=*" - "--grep=*" - "-[iE]" - "--remove-empty" - "--first-parent" - "--cherry-pick" - - "-S*" - "--pickaxe-all" - "--pickaxe-regex" - { + "-S*" - "--pickaxe-all" - "--pickaxe-regex" { + # These mean that we get a subset of the commits set filtered 1 lappend glflags $arg } - # This appears to be the only one that has a value as a - # separate word following it "-n" { + # This appears to be the only one that has a value as a + # separate word following it set filtered 1 set nextisval 1 lappend glflags $arg @@ -211,8 +211,8 @@ proc parseviewargs {n arglist} { # git rev-parse doesn't understand --merge lappend revargs --gitk-symmetric-diff-marker MERGE_HEAD...HEAD } - # Other flag arguments including - "-*" { + # Other flag arguments including - if {[string is digit -strict [string range $arg 1 end]]} { set filtered 1 } else { @@ -222,8 +222,8 @@ proc parseviewargs {n arglist} { } lappend glflags $arg } - # Non-flag arguments specify commits or ranges of commits default { + # Non-flag arguments specify commits or ranges of commits if {[string match "*...*" $arg]} { lappend revargs --gitk-symmetric-diff-marker } @@ -309,7 +309,7 @@ proc start_rev_list {view} { 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] @@ -367,8 +367,13 @@ proc start_rev_list {view} { } 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 != {}} { @@ -446,22 +451,26 @@ proc updatecommits {} { 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) @@ -4004,31 +4013,31 @@ proc ishighlighted {id} { return 0 } -proc bolden {row font} { - global canv linehtag selectedline boldrows need_redisplay +proc bolden {id font} { + global canv linehtag currentid boldids need_redisplay # need_redisplay = 1 means the display is stale and about to be redrawn if {$need_redisplay} return - lappend boldrows $row - $canv itemconf $linehtag($row) -font $font - if {$row == $selectedline} { + lappend boldids $id + $canv itemconf $linehtag($id) -font $font + if {[info exists currentid] && $id eq $currentid} { $canv delete secsel - set t [eval $canv create rect [$canv bbox $linehtag($row)] \ + set t [eval $canv create rect [$canv bbox $linehtag($id)] \ -outline {{}} -tags secsel \ -fill [$canv cget -selectbackground]] $canv lower $t } } -proc bolden_name {row font} { - global canv2 linentag selectedline boldnamerows need_redisplay +proc bolden_name {id font} { + global canv2 linentag currentid boldnameids need_redisplay if {$need_redisplay} return - lappend boldnamerows $row - $canv2 itemconf $linentag($row) -font $font - if {$row == $selectedline} { + lappend boldnameids $id + $canv2 itemconf $linentag($id) -font $font + if {[info exists currentid] && $id eq $currentid} { $canv2 delete secsel - set t [eval $canv2 create rect [$canv2 bbox $linentag($row)] \ + set t [eval $canv2 create rect [$canv2 bbox $linentag($id)] \ -outline {{}} -tags secsel \ -fill [$canv2 cget -selectbackground]] $canv2 lower $t @@ -4036,17 +4045,17 @@ proc bolden_name {row font} { } proc unbolden {} { - global boldrows + global boldids set stillbold {} - foreach row $boldrows { - if {![ishighlighted [commitonrow $row]]} { - bolden $row mainfont + foreach id $boldids { + if {![ishighlighted $id]} { + bolden $id mainfont } else { - lappend stillbold $row + lappend stillbold $id } } - set boldrows $stillbold + set boldids $stillbold } proc addvhighlight {n} { @@ -4087,7 +4096,7 @@ proc vhighlightmore {} { set row [rowofcommit $id] if {$r0 <= $row && $row <= $r1} { if {![highlighted $row]} { - bolden $row mainfontbold + bolden $id mainfontbold } set vhighlights($id) 1 } @@ -4102,7 +4111,7 @@ proc askvhighlight {row id} { if {[commitinview $id $hlview]} { if {[info exists iddrawn($id)] && ![ishighlighted $id]} { - bolden $row mainfontbold + bolden $id mainfontbold } set vhighlights($id) 1 } else { @@ -4170,15 +4179,15 @@ proc find_change {name ix op} { } proc findcom_change args { - global nhighlights boldnamerows + global nhighlights boldnameids global findpattern findtype findstring gdttype stopfinding # delete previous highlights, if any - foreach row $boldnamerows { - bolden_name $row mainfont + foreach id $boldnameids { + bolden_name $id mainfont } - set boldnamerows {} + set boldnameids {} catch {unset nhighlights} unbolden unmarkmatches @@ -4267,9 +4276,8 @@ proc readfhighlight {} { set fhl_list [lrange $fhl_list [expr {$i+1}] end] if {$line eq {}} continue if {![commitinview $line $curview]} continue - set row [rowofcommit $line] if {[info exists iddrawn($line)] && ![ishighlighted $line]} { - bolden $row mainfontbold + bolden $line mainfontbold } set fhighlights($line) 1 } @@ -4321,9 +4329,9 @@ proc askfindhighlight {row id} { } if {$isbold && [info exists iddrawn($id)]} { if {![ishighlighted $id]} { - bolden $row mainfontbold + bolden $id mainfontbold if {$isbold > 1} { - bolden_name $row mainfontbold + bolden_name $id mainfontbold } } if {$markingmatches} { @@ -4343,15 +4351,15 @@ proc markrowmatches {row id} { if {$findloc eq [mc "All fields"] || $findloc eq [mc "Headline"]} { set m [findmatches $headline] if {$m ne {}} { - markmatches $canv $row $headline $linehtag($row) $m \ - [$canv itemcget $linehtag($row) -font] $row + markmatches $canv $row $headline $linehtag($id) $m \ + [$canv itemcget $linehtag($id) -font] $row } } if {$findloc eq [mc "All fields"] || $findloc eq [mc "Author"]} { set m [findmatches $author] if {$m ne {}} { - markmatches $canv2 $row $author $linentag($row) $m \ - [$canv2 itemcget $linentag($row) -font] $row + markmatches $canv2 $row $author $linentag($id) $m \ + [$canv2 itemcget $linentag($id) -font] $row } } } @@ -4476,7 +4484,7 @@ proc askrelhighlight {row id} { } if {[info exists iddrawn($id)]} { if {$isbold && ![ishighlighted $id]} { - bolden $row mainfontbold + bolden $id mainfontbold } } set rhighlights($id) $isbold @@ -4644,14 +4652,56 @@ proc layoutmore {} { drawvisible } -proc doshowlocalchanges {} { - global curview mainheadid +# 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 - if {$mainheadid eq {}} return - if {[commitinview $mainheadid $curview]} { + 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 viewmainheadid + + if {$viewmainheadid($curview) eq {}} return + if {[commitinview $viewmainheadid($curview) $curview]} { dodiffindex } else { - interestedin $mainheadid dodiffindex + interestedin $viewmainheadid($curview) dodiffindex } } @@ -4669,19 +4719,24 @@ proc dohidelocalchanges {} { # 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} { @@ -4698,7 +4753,11 @@ proc readdiffindex {fd serial inst} { } # 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] @@ -4711,15 +4770,18 @@ proc readdiffindex {fd serial inst} { 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 @@ -4744,7 +4806,7 @@ proc readdifffiles {fd serial inst} { if {[commitinview $nullid2 $curview]} { set p $nullid2 } else { - set p $mainheadid + set p $viewmainheadid($curview) } insertfakerow $nullid $p } elseif {!$isdiff && [commitinview $nullid $curview]} { @@ -5469,7 +5531,7 @@ proc drawcmittext {id row col} { global cmitlisted commitinfo rowidlist parentlist global rowtextx idpos idtags idheads idotherrefs global linehtag linentag linedtag selectedline - global canvxmax boldrows boldnamerows fgcolor + global canvxmax boldids boldnameids fgcolor global mainheadid nullid nullid2 circleitem circlecolors ctxbut # listed is 0 for boundary, 1 for normal, 2 for negative, 3 for left, 4 for right @@ -5534,22 +5596,22 @@ proc drawcmittext {id row col} { set nfont mainfont set isbold [ishighlighted $id] if {$isbold > 0} { - lappend boldrows $row + lappend boldids $id set font mainfontbold if {$isbold > 1} { - lappend boldnamerows $row + lappend boldnameids $id set nfont mainfontbold } } - set linehtag($row) [$canv create text $xt $y -anchor w -fill $fgcolor \ - -text $headline -font $font -tags text] - $canv bind $linehtag($row) $ctxbut "rowmenu %X %Y $id" - set linentag($row) [$canv2 create text 3 $y -anchor w -fill $fgcolor \ - -text $name -font $nfont -tags text] - set linedtag($row) [$canv3 create text 3 $y -anchor w -fill $fgcolor \ - -text $date -font mainfont -tags text] + set linehtag($id) [$canv create text $xt $y -anchor w -fill $fgcolor \ + -text $headline -font $font -tags text] + $canv bind $linehtag($id) $ctxbut "rowmenu %X %Y $id" + set linentag($id) [$canv2 create text 3 $y -anchor w -fill $fgcolor \ + -text $name -font $nfont -tags text] + set linedtag($id) [$canv3 create text 3 $y -anchor w -fill $fgcolor \ + -text $date -font mainfont -tags text] if {$selectedline == $row} { - make_secsel $row + make_secsel $id } set xr [expr {$xt + [font measure $font $headline]}] if {$xr > $canvxmax} { @@ -5757,7 +5819,7 @@ proc drawvisible {} { proc clear_display {} { global iddrawn linesegs need_redisplay nrows_drawn global vhighlights fhighlights nhighlights rhighlights - global linehtag linentag linedtag boldrows boldnamerows + global linehtag linentag linedtag boldids boldnameids allcanvs delete all catch {unset iddrawn} @@ -5765,8 +5827,8 @@ proc clear_display {} { catch {unset linehtag} catch {unset linentag} catch {unset linedtag} - set boldrows {} - set boldnamerows {} + set boldids {} + set boldnameids {} catch {unset vhighlights} catch {unset fhighlights} catch {unset nhighlights} @@ -6474,20 +6536,20 @@ proc dispnexttag {} { } } -proc make_secsel {l} { +proc make_secsel {id} { global linehtag linentag linedtag canv canv2 canv3 - if {![info exists linehtag($l)]} return + if {![info exists linehtag($id)]} return $canv delete secsel - set t [eval $canv create rect [$canv bbox $linehtag($l)] -outline {{}} \ + set t [eval $canv create rect [$canv bbox $linehtag($id)] -outline {{}} \ -tags secsel -fill [$canv cget -selectbackground]] $canv lower $t $canv2 delete secsel - set t [eval $canv2 create rect [$canv2 bbox $linentag($l)] -outline {{}} \ + set t [eval $canv2 create rect [$canv2 bbox $linentag($id)] -outline {{}} \ -tags secsel -fill [$canv2 cget -selectbackground]] $canv2 lower $t $canv3 delete secsel - set t [eval $canv3 create rect [$canv3 bbox $linedtag($l)] -outline {{}} \ + set t [eval $canv3 create rect [$canv3 bbox $linedtag($id)] -outline {{}} \ -tags secsel -fill [$canv3 cget -selectbackground]] $canv3 lower $t } @@ -6553,7 +6615,7 @@ proc selectline {l isnew {desired_loc {}}} { drawvisible } - make_secsel $l + make_secsel $id if {$isnew} { addtohistory [list selbyid $id] @@ -8109,16 +8171,16 @@ proc redrawtags {id} { $canv itemconf $circleitem($row) -fill $ofill $canv delete tag.$id set xt [eval drawtags $id $idpos($id)] - $canv coords $linehtag($row) $xt [lindex $idpos($id) 2] - set text [$canv itemcget $linehtag($row) -text] - set font [$canv itemcget $linehtag($row) -font] + $canv coords $linehtag($id) $xt [lindex $idpos($id) 2] + set text [$canv itemcget $linehtag($id) -text] + set font [$canv itemcget $linehtag($id) -font] set xr [expr {$xt + [font measure $font $text]}] if {$xr > $canvxmax} { set canvxmax $xr setcanvscroll } if {[info exists currentid] && $currentid == $id} { - make_secsel $row + make_secsel $id } } @@ -8208,7 +8270,6 @@ proc mkbranch {} { grid $top.id $top.sha1 -sticky w label $top.nlab -text [mc "Name:"] entry $top.name -width 40 - bind $top.name "[list mkbrgo $top]" grid $top.nlab $top.name -sticky w frame $top.buts button $top.buts.go -text [mc "Create"] -command [list mkbrgo $top] @@ -8342,6 +8403,7 @@ proc cherrypick {} { } 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 @@ -8449,7 +8511,7 @@ proc headmenu {x y id head} { proc cobranch {} { global headmenuid headmenuhead headids - global showlocalchanges mainheadid + global showlocalchanges # check the tree is clean first?? nowbusy checkout [mc "Checking out"] @@ -8470,6 +8532,7 @@ proc cobranch {} { 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]} { @@ -8487,6 +8550,7 @@ proc readcheckoutstat {fd newhead newheadid} { set oldmainid $mainheadid set mainhead $newhead set mainheadid $newheadid + set viewmainheadid($curview) $newheadid redrawtags $oldmainid redrawtags $newheadid selbyid $newheadid @@ -10766,8 +10830,8 @@ set nhl_names {} set highlight_paths {} set findpattern {} set searchdirn -forwards -set boldrows {} -set boldnamerows {} +set boldids {} +set boldnameids {} set diffelide {0 0} set markingmatches 0 set linkentercount 0