From 16c1ff968ac9717c958129eb05aa089cc0ca51e7 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 30 Mar 2006 18:43:51 +1100 Subject: gitk: Use the new --boundary flag to git-rev-list With this, we can show the boundary (open-circle) commits immediately after their last child, which looks much better than putting all the boundary commits at the bottom of the graph. Signed-off-by: Paul Mackerras diff --git a/gitk b/gitk index 03cd475..1989aa5 100755 --- a/gitk +++ b/gitk @@ -46,7 +46,7 @@ proc start_rev_list {rlargs} { } if {[catch { set commfd [open [concat | git-rev-list --header $order \ - --parents $rlargs] r] + --parents --boundary $rlargs] r] } err]} { puts stderr "Error executing git-rev-list: $err" exit 1 @@ -114,8 +114,13 @@ proc getcommitlines {commfd} { set start [expr {$i + 1}] set j [string first "\n" $cmit] set ok 0 + set listed 1 if {$j >= 0} { set ids [string range $cmit 0 [expr {$j - 1}]] + if {[string range $ids 0 0] == "-"} { + set listed 0 + set ids [string range $ids 1 end] + } set ok 1 foreach id $ids { if {[string length $id] != 40} { @@ -133,8 +138,12 @@ proc getcommitlines {commfd} { exit 1 } set id [lindex $ids 0] - set olds [lrange $ids 1 end] - set commitlisted($id) 1 + if {$listed} { + set olds [lrange $ids 1 end] + set commitlisted($id) 1 + } else { + set olds {} + } updatechildren $id $olds set commitdata($id) [string range $cmit [expr {$j + 1}] end] set commitrow($id) $commitidx -- cgit v0.10.2-6-g49f6 From 7b5ff7e7d715391b9745a46fcfaacf1d97d4dc9f Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Thu, 30 Mar 2006 20:50:40 +1100 Subject: gitk: Show diffs for boundary commits With this we run git-diff-tree on a commit even if we think it has no parents, either because it really has no parents or because it is a boundary commit. This means that gitk shows the diff for a boundary commit when it is selected. Signed-off-by: Paul Mackerras diff --git a/gitk b/gitk index 1989aa5..b61e138 100755 --- a/gitk +++ b/gitk @@ -2386,9 +2386,9 @@ proc selectline {l isnew} { $cflist delete 0 end $cflist insert end "Comments" - if {$nparents($id) == 1} { + if {$nparents($id) <= 1} { startdiff $id - } elseif {$nparents($id) > 1} { + } else { mergediff $id } } -- cgit v0.10.2-6-g49f6 From f3408449622cad37ce29f23754c8e7a8fb453ff1 Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 31 Mar 2006 09:54:24 +1100 Subject: gitk: Prevent parent link from overwriting commit headline When I made drawlineseg responsible for drawing the link to the first child rather than drawparentlinks, that meant that the right-most X value computed by drawparentlinks didn't include those first-child links, and thus the first-child link could go over the top of the commit headline. This fixes it. Signed-off-by: Paul Mackerras diff --git a/gitk b/gitk index b61e138..9c43587 100755 --- a/gitk +++ b/gitk @@ -1304,17 +1304,21 @@ proc drawparentlinks {id row col olds} { # rmx = right-most X coord used set rmx 0 foreach p $olds { + set i [lsearch -exact $ids $p] + if {$i < 0} { + puts "oops, parent $p of $id not in list" + continue + } + set x2 [xc $row2 $i] + if {$x2 > $rmx} { + set rmx $x2 + } if {[info exists idrowranges($p)] && $row2 == [lindex $idrowranges($p) 0] && $row2 < [lindex $idrowranges($p) 1]} { # drawlineseg will do this one for us continue } - set i [lsearch -exact $ids $p] - if {$i < 0} { - puts "oops, parent $p of $id not in list" - continue - } assigncolor $p # should handle duplicated parents here... set coords [list $x $y] @@ -1323,10 +1327,6 @@ proc drawparentlinks {id row col olds} { } elseif {$i > $col + 1} { lappend coords [xc $row [expr {$i - 1}]] $y } - set x2 [xc $row2 $i] - if {$x2 > $rmx} { - set rmx $x2 - } lappend coords $x2 $y2 set t [$canv create line $coords -width [linewidth $p] \ -fill $colormap($p) -tags lines.$p] -- cgit v0.10.2-6-g49f6 From be0cd0981f1811b9e5177f1f5c8ff900c33fbdbb Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 31 Mar 2006 09:55:11 +1100 Subject: gitk: Allow top panes to scroll horizontally with mouse button 2 Signed-off-by: Paul Mackerras diff --git a/gitk b/gitk index 9c43587..e8e0c73 100755 --- a/gitk +++ b/gitk @@ -512,8 +512,8 @@ proc makewindow {rargs} { #bindall {selcanvline %W %x %y} bindall "allcanvs yview scroll -5 units" bindall "allcanvs yview scroll 5 units" - bindall <2> "allcanvs scan mark 0 %y" - bindall "allcanvs scan dragto 0 %y" + bindall <2> "canvscan mark %W %x %y" + bindall "canvscan dragto %W %x %y" bind . "selnextline -1" bind . "selnextline 1" bind . "goforw" @@ -568,6 +568,19 @@ proc makewindow {rargs} { $rowctxmenu add command -label "Write commit to file" -command writecommit } +# mouse-2 makes all windows scan vertically, but only the one +# the cursor is in scans horizontally +proc canvscan {op w x y} { + global canv canv2 canv3 + foreach c [list $canv $canv2 $canv3] { + if {$c == $w} { + $c scan $op $x $y + } else { + $c scan $op 0 $y + } + } +} + proc scrollcanv {cscroll f0 f1} { $cscroll set $f0 $f1 drawfrac $f0 $f1 @@ -833,7 +846,7 @@ proc initlayout {} { global rowidlist rowoffsets displayorder global rowlaidout rowoptim global idinlist rowchk - global commitidx numcommits + global commitidx numcommits canvxmax canv global nextcolor set commitidx 0 @@ -846,6 +859,16 @@ proc initlayout {} { catch {unset rowchk} set rowlaidout 0 set rowoptim 0 + set canvxmax [$canv cget -width] +} + +proc setcanvscroll {} { + global canv canv2 canv3 numcommits linespc canvxmax canvy0 + + set ymax [expr {$canvy0 + ($numcommits - 0.5) * $linespc + 2}] + $canv conf -scrollregion [list 0 0 $canvxmax $ymax] + $canv2 conf -scrollregion [list 0 0 0 $ymax] + $canv3 conf -scrollregion [list 0 0 0 $ymax] } proc visiblerows {} { @@ -887,7 +910,6 @@ proc layoutmore {} { proc showstuff {canshow} { global numcommits - global canvy0 linespc global linesegends idrowranges idrangedrawn if {$numcommits == 0} { @@ -897,8 +919,7 @@ proc showstuff {canshow} { } set row $numcommits set numcommits $canshow - allcanvs conf -scrollregion \ - [list 0 0 0 [expr {$canvy0 + ($numcommits - 0.5) * $linespc + 2}]] + setcanvscroll set rows [visiblerows] set r0 [lindex $rows 0] set r1 [lindex $rows 1] @@ -1366,7 +1387,7 @@ proc drawcmittext {id row col rmx} { global commitlisted commitinfo rowidlist global rowtextx idpos idtags idheads idotherrefs global linehtag linentag linedtag - global mainfont namefont + global mainfont namefont canvxmax set ofill [expr {[info exists commitlisted($id)]? "blue": "white"}] set x [xc $row $col] @@ -1398,6 +1419,11 @@ proc drawcmittext {id row col rmx} { -text $name -font $namefont] set linedtag($row) [$canv3 create text 3 $y -anchor w \ -text $date -font $mainfont] + set xr [expr {$xt + [font measure $mainfont $headline]}] + if {$xr > $canvxmax} { + set canvxmax $xr + setcanvscroll + } } proc drawcmitrow {row} { @@ -2757,15 +2783,14 @@ proc setcoords {} { } proc redisplay {} { - global canv canvy0 linespc numcommits + global canv global selectedline set ymax [lindex [$canv cget -scrollregion] 3] if {$ymax eq {} || $ymax == 0} return set span [$canv yview] clear_display - allcanvs conf -scrollregion \ - [list 0 0 0 [expr {$canvy0 + ($numcommits - 0.5) * $linespc + 2}]] + setcanvscroll allcanvs yview moveto [lindex $span 0] drawvisible if {[info exists selectedline]} { -- cgit v0.10.2-6-g49f6 From 879e8b1aad021cade0a254db0a5b67f56d99902a Mon Sep 17 00:00:00 2001 From: Paul Mackerras Date: Fri, 31 Mar 2006 10:45:14 +1100 Subject: gitk: Better workaround for arrows on diagonal line segments Instead of adding extra padding to create a vertical line segment at the lower end of a line that has an arrow, this now just draws a very short vertical line segment at the lower end. This alternative workaround for the Tk8.4 behaviour (not drawing arrows on diagonal line segments) doesn't have the problem of making the graph very wide when people do a lot of merges in a row (hi Junio :). Signed-off-by: Paul Mackerras diff --git a/gitk b/gitk index e8e0c73..fa1e83c 100755 --- a/gitk +++ b/gitk @@ -1113,17 +1113,6 @@ proc optimize_rows {row col endrow} { set idlist [lindex $rowidlist $row] set offs [lindex $rowoffsets $row] set haspad 0 - set downarrowcols {} - if {[info exists linesegends($row)]} { - set downarrowcols $linesegends($row) - if {$col > 0} { - while {$downarrowcols ne {}} { - set i [lsearch -exact $idlist [lindex $downarrowcols 0]] - if {$i < 0 || $i >= $col} break - set downarrowcols [lrange $downarrowcols 1 end] - } - } - } for {} {$col < [llength $offs]} {incr col} { if {[lindex $idlist $col] eq {}} { set haspad 1 @@ -1141,10 +1130,6 @@ proc optimize_rows {row col endrow} { $y0 > [lindex $idrowranges($id) 0]} { set isarrow 1 } - } elseif {$downarrowcols ne {} && - [lindex $idlist $col] eq [lindex $downarrowcols 0]} { - set downarrowcols [lrange $downarrowcols 1 end] - set isarrow 1 } if {$z < -1 || ($z < 0 && $isarrow)} { set npad [expr {-1 - $z + $isarrow}] @@ -1258,7 +1243,7 @@ proc linewidth {id} { proc drawlineseg {id i} { global rowoffsets rowidlist idrowranges global displayorder - global canv colormap + global canv colormap linespc set startrow [lindex $idrowranges($id) [expr {2 * $i}]] set row [lindex $idrowranges($id) [expr {2 * $i + 1}]] @@ -1306,6 +1291,26 @@ proc drawlineseg {id i} { } if {[llength $coords] < 4} return set last [expr {[llength $idrowranges($id)] / 2 - 1}] + if {$i < $last} { + # This line has an arrow at the lower end: check if the arrow is + # on a diagonal segment, and if so, work around the Tk 8.4 + # refusal to draw arrows on diagonal lines. + set x0 [lindex $coords 0] + set x1 [lindex $coords 2] + if {$x0 != $x1} { + set y0 [lindex $coords 1] + set y1 [lindex $coords 3] + if {$y0 - $y1 <= 2 * $linespc && $x1 == [lindex $coords 4]} { + # we have a nearby vertical segment, just trim off the diag bit + set coords [lrange $coords 2 end] + } else { + set slope [expr {($x0 - $x1) / ($y0 - $y1)}] + set xi [expr {$x0 - $slope * $linespc / 2}] + set yi [expr {$y0 - $linespc / 2}] + set coords [lreplace $coords 0 1 $xi $y0 $xi $yi] + } + } + } set arrow [expr {2 * ($i > 0) + ($i < $last)}] set arrow [lindex {none first last both} $arrow] set t [$canv create line $coords -width [linewidth $id] \ -- cgit v0.10.2-6-g49f6