X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=gitk;h=6dc4b24f060e790d46b19f3510fee1e507057960;hb=3e386508f87278610d1892aaaa08cd17907f71c5;hp=59cdd853e2649c4f1ce38acad366016a11b4f884;hpb=200e7fbbac82b6665f8175af0e375fbef3568c30;p=git.git diff --git a/gitk b/gitk index 59cdd853..6dc4b24f 100755 --- a/gitk +++ b/gitk @@ -18,7 +18,7 @@ proc gitdir {} { proc getcommits {rargs} { global commits commfd phase canv mainfont env - global startmsecs nextupdate + global startmsecs nextupdate ncmupdate global ctext maincursor textcursor leftover # check that we can find a .git directory somewhere... @@ -31,6 +31,7 @@ proc getcommits {rargs} { set phase getcommits set startmsecs [clock clicks -milliseconds] set nextupdate [expr $startmsecs + 100] + set ncmupdate 1 if [catch { set parse_args [concat --default HEAD $rargs] set parsed_args [split [eval exec git-rev-parse $parse_args] "\n"] @@ -48,13 +49,13 @@ proc getcommits {rargs} { exit 1 } set leftover {} - fconfigure $commfd -blocking 0 -translation binary - fileevent $commfd readable "getcommitlines $commfd" + fconfigure $commfd -blocking 0 -translation lf + fileevent $commfd readable [list getcommitlines $commfd] $canv delete all $canv create text 3 3 -anchor nw -text "Reading commits..." \ -font $mainfont -tags textitems . config -cursor watch - $ctext config -cursor watch + settextcursor watch } proc getcommitlines {commfd} { @@ -109,7 +110,7 @@ to allow selection of commits to be displayed.)} parsecommit $id $cmit 1 drawcommit $id if {[clock clicks -milliseconds] >= $nextupdate} { - doupdate + doupdate 1 } while {$redisplaying} { set redisplaying 0 @@ -120,7 +121,7 @@ to allow selection of commits to be displayed.)} drawcommit $id if {$stopped} break if {[clock clicks -milliseconds] >= $nextupdate} { - doupdate + doupdate 1 } } } @@ -128,13 +129,24 @@ to allow selection of commits to be displayed.)} } } -proc doupdate {} { - global commfd nextupdate +proc doupdate {reading} { + global commfd nextupdate numcommits ncmupdate - incr nextupdate 100 - fileevent $commfd readable {} + if {$reading} { + fileevent $commfd readable {} + } update - fileevent $commfd readable "getcommitlines $commfd" + set nextupdate [expr {[clock clicks -milliseconds] + 100}] + if {$numcommits < 100} { + set ncmupdate [expr {$numcommits + 1}] + } elseif {$numcommits < 10000} { + set ncmupdate [expr {$numcommits + 10}] + } else { + set ncmupdate [expr {$numcommits + 100}] + } + if {$reading} { + fileevent $commfd readable [list getcommitlines $commfd] + } } proc readcommit {id} { @@ -277,7 +289,7 @@ proc makewindow {} { global canv canv2 canv3 linespc charspc ctext cflist textfont global findtype findtypemenu findloc findstring fstring geometry global entries sha1entry sha1string sha1but - global maincursor textcursor + global maincursor textcursor curtextcursor global rowctxmenu gaudydiff mergemax menu .bar @@ -387,7 +399,7 @@ proc makewindow {} { set ctext .ctop.cdet.left.ctext text $ctext -bg white -state disabled -font $textfont \ -width $geometry(ctextw) -height $geometry(ctexth) \ - -yscrollcommand ".ctop.cdet.left.sb set" + -yscrollcommand ".ctop.cdet.left.sb set" -wrap none scrollbar .ctop.cdet.left.sb -command "$ctext yview" pack .ctop.cdet.left.sb -side right -fill y pack $ctext -side left -fill both -expand 1 @@ -465,6 +477,7 @@ proc makewindow {} { set maincursor [. cget -cursor] set textcursor [$ctext cget -cursor] + set curtextcursor $textcursor set rowctxmenu .rowctxmenu menu $rowctxmenu -tearoff 0 @@ -714,7 +727,7 @@ proc bindline {t id} { $canv bind $t "lineenter %x %y $id" $canv bind $t "linemotion %x %y $id" $canv bind $t "lineleave $id" - $canv bind $t "lineclick %x %y $id" + $canv bind $t "lineclick %x %y $id 1" } proc drawcommitline {level} { @@ -1089,7 +1102,7 @@ proc decidenext {{noread 0}} { proc drawcommit {id} { global phase todo nchildren datemode nextupdate - global startcommits + global startcommits numcommits ncmupdate if {$phase != "incrdraw"} { set phase incrdraw @@ -1118,8 +1131,9 @@ proc drawcommit {id} { if {![info exists commitlisted($id)]} { break } - if {[clock clicks -milliseconds] >= $nextupdate} { - doupdate + if {[clock clicks -milliseconds] >= $nextupdate + && $numcommits >= $ncmupdate} { + doupdate 1 if {$stopped} break } } @@ -1142,15 +1156,27 @@ proc finishcommits {} { drawrest $level [llength $startcommits] } . config -cursor $maincursor - $ctext config -cursor $textcursor + settextcursor $textcursor +} + +# Don't change the text pane cursor if it is currently the hand cursor, +# showing that we are over a sha1 ID link. +proc settextcursor {c} { + global ctext curtextcursor + + if {[$ctext cget -cursor] == $curtextcursor} { + $ctext config -cursor $c + } + set curtextcursor $c } proc drawgraph {} { - global nextupdate startmsecs startcommits todo + global nextupdate startmsecs startcommits todo ncmupdate if {$startcommits == {}} return set startmsecs [clock clicks -milliseconds] set nextupdate [expr $startmsecs + 100] + set ncmupdate 1 initgraph set todo [lindex $startcommits 0] drawrest 0 1 @@ -1159,7 +1185,7 @@ proc drawgraph {} { proc drawrest {level startix} { global phase stopped redisplaying selectedline global datemode currentparents todo - global numcommits + global numcommits ncmupdate global nextupdate startmsecs startcommits idline if {$level >= 0} { @@ -1188,9 +1214,9 @@ proc drawrest {level startix} { if {$level < 0} break drawslants $level } - if {[clock clicks -milliseconds] >= $nextupdate} { - update - incr nextupdate 100 + if {[clock clicks -milliseconds] >= $nextupdate + && $numcommits >= $ncmupdate} { + doupdate 0 } } } @@ -1377,7 +1403,7 @@ proc stopfindproc {{done 0}} { unset findinprogress if {$phase != "incrdraw"} { . config -cursor $maincursor - $ctext config -cursor $textcursor + settextcursor $textcursor } } } @@ -1420,7 +1446,7 @@ proc findpatches {} { fileevent $f readable readfindproc set finddidsel 0 . config -cursor watch - $ctext config -cursor watch + settextcursor watch set findinprogress 1 } @@ -1525,7 +1551,7 @@ proc findfiles {} { set id $lineid($l) set p [lindex $parents($id) 0] . config -cursor watch - $ctext config -cursor watch + settextcursor watch set findinprogress 1 findcont [list $id $p] update @@ -1675,7 +1701,7 @@ proc unmarkmatches {} { } proc selcanvline {w x y} { - global canv canvy0 ctext linespc selectedline + global canv canvy0 ctext linespc global lineid linehtag linentag linedtag rowtextx set ymax [lindex [$canv cget -scrollregion] 3] if {$ymax == {}} return @@ -1692,13 +1718,21 @@ proc selcanvline {w x y} { selectline $l 1 } +proc commit_descriptor {p} { + global commitinfo + set l "..." + if {[info exists commitinfo($p)]} { + set l [lindex $commitinfo($p) 0] + } + return "$p ($l)" +} + proc selectline {l isnew} { global canv canv2 canv3 ctext commitinfo selectedline global lineid linehtag linentag linedtag - global canvy0 linespc parents nparents + global canvy0 linespc parents nparents children nchildren global cflist currentid sha1entry global commentend idtags idline - global history historyindex $canv delete hover if {![info exists lineid($l)] || ![info exists linehtag($l)]} return @@ -1749,19 +1783,8 @@ proc selectline {l isnew} { allcanvs yview moveto [expr $newtop * 1.0 / $ymax] } - if {$isnew && (![info exists selectedline] || $selectedline != $l)} { - if {$historyindex < [llength $history]} { - set history [lreplace $history $historyindex end $l] - } else { - lappend history $l - } - incr historyindex - if {$historyindex > 1} { - .ctop.top.bar.leftbut conf -state normal - } else { - .ctop.top.bar.leftbut conf -state disabled - } - .ctop.top.bar.rightbut conf -state disabled + if {$isnew} { + addtohistory [list selectline $l 0] } set selectedline $l @@ -1787,9 +1810,21 @@ proc selectline {l isnew} { } $ctext insert end "\n" } - $ctext insert end "\n" + set commentstart [$ctext index "end - 1c"] - set comment [lindex $info 5] + set comment {} + if {[info exists parents($id)]} { + foreach p $parents($id) { + append comment "Parent: [commit_descriptor $p]\n" + } + } + if {[info exists children($id)]} { + foreach c $children($id) { + append comment "Child: [commit_descriptor $c]\n" + } + } + append comment "\n" + append comment [lindex $info 5] $ctext insert end $comment $ctext insert end "\n" @@ -1802,10 +1837,14 @@ proc selectline {l isnew} { set linkid [string range $comment $s $e] if {![info exists idline($linkid)]} continue incr e - $ctext tag conf link$i -foreground blue -underline 1 + $ctext tag add link "$commentstart + $s c" "$commentstart + $e c" $ctext tag add link$i "$commentstart + $s c" "$commentstart + $e c" $ctext tag bind link$i <1> [list selectline $idline($linkid) 1] + incr i } + $ctext tag conf link -foreground blue -underline 1 + $ctext tag bind link { %W configure -cursor hand2 } + $ctext tag bind link { %W configure -cursor $curtextcursor } $ctext tag delete Comments $ctext tag remove found 1.0 end @@ -1829,12 +1868,42 @@ proc selnextline {dir} { selectline $l 1 } +proc unselectline {} { + global selectedline + + catch {unset selectedline} + allcanvs delete secsel +} + +proc addtohistory {cmd} { + global history historyindex + + if {$historyindex > 0 + && [lindex $history [expr {$historyindex - 1}]] == $cmd} { + return + } + + if {$historyindex < [llength $history]} { + set history [lreplace $history $historyindex end $cmd] + } else { + lappend history $cmd + } + incr historyindex + if {$historyindex > 1} { + .ctop.top.bar.leftbut conf -state normal + } else { + .ctop.top.bar.leftbut conf -state disabled + } + .ctop.top.bar.rightbut conf -state disabled +} + proc goback {} { global history historyindex if {$historyindex > 1} { incr historyindex -1 - selectline [lindex $history [expr {$historyindex - 1}]] 0 + set cmd [lindex $history [expr {$historyindex - 1}]] + eval $cmd .ctop.top.bar.rightbut conf -state normal } if {$historyindex <= 1} { @@ -1846,9 +1915,9 @@ proc goforw {} { global history historyindex if {$historyindex < [llength $history]} { - set l [lindex $history $historyindex] + set cmd [lindex $history $historyindex] incr historyindex - selectline $l 0 + eval $cmd .ctop.top.bar.leftbut conf -state normal } if {$historyindex >= [llength $history]} { @@ -2596,7 +2665,7 @@ proc setcoords {} { } proc redisplay {} { - global selectedline stopped redisplaying phase + global stopped redisplaying phase if {$stopped > 1} return if {$phase == "getcommits"} return set redisplaying 1 @@ -2608,7 +2677,7 @@ proc redisplay {} { } proc incrfont {inc} { - global mainfont namefont textfont selectedline ctext canv phase + global mainfont namefont textfont ctext canv phase global stopped entries unmarkmatches set mainfont [lreplace $mainfont 1 1 [expr {[lindex $mainfont 1] + $inc}]] @@ -2750,34 +2819,40 @@ proc linehover {} { $canv raise $t } -proc lineclick {x y id} { +proc lineclick {x y id isnew} { global ctext commitinfo children cflist canv unmarkmatches + unselectline + if {$isnew} { + addtohistory [list lineclick $x $x $id 0] + } $canv delete hover # fill the details pane with info about this line $ctext conf -state normal $ctext delete 0.0 end - $ctext insert end "Parent:\n " - catch {destroy $ctext.$id} - button $ctext.$id -text "Go:" -command "selbyid $id" \ - -padx 4 -pady 0 - $ctext window create end -window $ctext.$id -align center + $ctext tag conf link -foreground blue -underline 1 + $ctext tag bind link { %W configure -cursor hand2 } + $ctext tag bind link { %W configure -cursor $curtextcursor } + $ctext insert end "Parent:\t" + $ctext insert end $id [list link link0] + $ctext tag bind link0 <1> [list selbyid $id] set info $commitinfo($id) - $ctext insert end "\t[lindex $info 0]\n" + $ctext insert end "\n\t[lindex $info 0]\n" $ctext insert end "\tAuthor:\t[lindex $info 1]\n" $ctext insert end "\tDate:\t[lindex $info 2]\n" - $ctext insert end "\tID:\t$id\n" if {[info exists children($id)]} { $ctext insert end "\nChildren:" + set i 0 foreach child $children($id) { - $ctext insert end "\n " - catch {destroy $ctext.$child} - button $ctext.$child -text "Go:" -command "selbyid $child" \ - -padx 4 -pady 0 - $ctext window create end -window $ctext.$child -align center + incr i set info $commitinfo($child) - $ctext insert end "\t[lindex $info 0]" + $ctext insert end "\n\t" + $ctext insert end $child [list link link$i] + $ctext tag bind link$i <1> [list selbyid $child] + $ctext insert end "\n\t[lindex $info 0]" + $ctext insert end "\n\tAuthor:\t[lindex $info 1]" + $ctext insert end "\n\tDate:\t[lindex $info 2]\n" } } $ctext conf -state disabled @@ -2817,8 +2892,6 @@ proc rowmenu {x y id} { proc diffvssel {dirn} { global rowmenuid selectedline lineid - global ctext cflist - global commitinfo if {![info exists selectedline]} return if {$dirn} { @@ -2828,15 +2901,32 @@ proc diffvssel {dirn} { set oldid $rowmenuid set newid $lineid($selectedline) } + addtohistory [list doseldiff $oldid $newid] + doseldiff $oldid $newid +} + +proc doseldiff {oldid newid} { + global ctext cflist + global commitinfo + $ctext conf -state normal $ctext delete 0.0 end $ctext mark set fmark.0 0.0 $ctext mark gravity fmark.0 left $cflist delete 0 end $cflist insert end "Top" - $ctext insert end "From $oldid\n " + $ctext insert end "From " + $ctext tag conf link -foreground blue -underline 1 + $ctext tag bind link { %W configure -cursor hand2 } + $ctext tag bind link { %W configure -cursor $curtextcursor } + $ctext tag bind link0 <1> [list selbyid $oldid] + $ctext insert end $oldid [list link link0] + $ctext insert end "\n " $ctext insert end [lindex $commitinfo($oldid) 0] - $ctext insert end "\n\nTo $newid\n " + $ctext insert end "\n\nTo " + $ctext tag bind link1 <1> [list selbyid $newid] + $ctext insert end $newid [list link link1] + $ctext insert end "\n " $ctext insert end [lindex $commitinfo($newid) 0] $ctext insert end "\n" $ctext conf -state disabled