gitk: Make downward-pointing arrows end in vertical line segment
[git.git] / gitk
diff --git a/gitk b/gitk
index a70787a..69d67ee 100755 (executable)
--- a/gitk
+++ b/gitk
@@ -35,7 +35,6 @@ proc parse_args {rargs} {
 proc start_rev_list {rlargs} {
     global startmsecs nextupdate ncmupdate
     global commfd leftover tclencoding datemode
-    global commitdata
 
     set startmsecs [clock clicks -milliseconds]
     set nextupdate [expr {$startmsecs + 100}]
@@ -53,7 +52,6 @@ proc start_rev_list {rlargs} {
        exit 1
     }
     set leftover {}
-    set commitdata {}
     fconfigure $commfd -blocking 0 -translation lf
     if {$tclencoding != {}} {
        fconfigure $commfd -encoding $tclencoding
@@ -137,8 +135,8 @@ proc getcommitlines {commfd}  {
        set id [lindex $ids 0]
        set olds [lrange $ids 1 end]
        set commitlisted($id) 1
-       updatechildren $id [lrange $ids 1 end]
-       lappend commitdata [string range $cmit [expr {$j + 1}] end]
+       updatechildren $id $olds
+       set commitdata($id) [string range $cmit [expr {$j + 1}] end]
        set commitrow($id) $commitidx
        incr commitidx
        lappend displayorder $id
@@ -266,15 +264,11 @@ proc parsecommit {id contents listed} {
                             $comname $comdate $comment]
 }
 
-proc getcommit {id {row {}}} {
-    global commitdata commitrow commitinfo nparents
+proc getcommit {id} {
+    global commitdata commitinfo nparents
 
-    if {$row eq {}} {
-       if {![info exists commitrow($id)]} {return 0}
-       set row $commitrow($id)
-    }
-    if {$row < [llength $commitdata]} {
-       parsecommit $id [lindex $commitdata $row] 1
+    if {[info exists commitdata($id)]} {
+       parsecommit $id $commitdata($id) 1
     } else {
        readcommit $id
        if {![info exists commitinfo($id)]} {
@@ -338,6 +332,7 @@ proc error_popup msg {
     button $w.ok -text OK -command "destroy $w"
     pack $w.ok -side bottom -fill x
     bind $w <Visibility> "grab $w; focus $w"
+    bind $w <Key-Return> "destroy $w"
     tkwait window $w
 }
 
@@ -957,8 +952,9 @@ proc layoutrows {row endrow last} {
                        set offs [lreplace $offs $x $x]
                        set offs [incrange $offs $x 1]
                        set idinlist($i) 0
-                       lappend linesegends($row) $i
-                       lappend idrowranges($i) [expr {$row-1}]
+                       set rm1 [expr {$row - 1}]
+                       lappend linesegends($rm1) $i
+                       lappend idrowranges($i) $rm1
                        if {[incr nev -1] <= 0} break
                        continue
                    }
@@ -987,7 +983,6 @@ proc layoutrows {row endrow last} {
            unset idinlist($id)
        }
        if {[info exists idrowranges($id)]} {
-           lappend linesegends($row) $id
            lappend idrowranges($id) $row
        }
        incr row
@@ -1043,7 +1038,7 @@ proc addextraid {id row} {
 
 proc layouttail {} {
     global rowidlist rowoffsets idinlist commitidx
-    global idrowranges linesegends
+    global idrowranges
 
     set row $commitidx
     set idlist [lindex $rowidlist $row]
@@ -1052,7 +1047,6 @@ proc layouttail {} {
        set id [lindex $idlist $col]
        addextraid $id $row
        unset idinlist($id)
-       lappend linesegends($row) $id
        lappend idrowranges($id) $row
        incr row
        set offs [ntimes $col 0]
@@ -1066,7 +1060,6 @@ proc layouttail {} {
        lset rowidlist $row [list $id]
        lset rowoffsets $row 0
        makeuparrow $id 0 $row 0
-       lappend linesegends($row) $id
        lappend idrowranges($id) $row
        incr row
        lappend rowidlist {}
@@ -1084,12 +1077,23 @@ proc insert_pad {row col npad} {
 }
 
 proc optimize_rows {row col endrow} {
-    global rowidlist rowoffsets idrowranges
+    global rowidlist rowoffsets idrowranges linesegends displayorder
 
     for {} {$row < $endrow} {incr row} {
        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
@@ -1107,6 +1111,10 @@ 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}]
@@ -1340,7 +1348,6 @@ proc drawcmitrow {row} {
     global displayorder rowidlist
     global idrowranges idrangedrawn iddrawn
     global commitinfo commitlisted parents numcommits
-    global commitdata
 
     if {$row >= $numcommits} return
     foreach id [lindex $rowidlist $row] {
@@ -1368,7 +1375,7 @@ proc drawcmitrow {row} {
        return
     }
     if {![info exists commitinfo($id)]} {
-       getcommit $id $row
+       getcommit $id
     }
     assigncolor $id
     if {[info exists commitlisted($id)] && [info exists parents($id)]
@@ -1626,6 +1633,7 @@ proc xcoord {i level ln} {
 proc finishcommits {} {
     global commitidx phase
     global canv mainfont ctext maincursor textcursor
+    global findinprogress
 
     if {$commitidx > 0} {
        drawrest
@@ -1634,8 +1642,10 @@ proc finishcommits {} {
        $canv create text 3 3 -anchor nw -text "No commits selected" \
            -font $mainfont -tags textitems
     }
-    . config -cursor $maincursor
-    settextcursor $textcursor
+    if {![info exists findinprogress]} {
+       . config -cursor $maincursor
+       settextcursor $textcursor
+    }
     set phase {}
 }
 
@@ -1722,7 +1732,8 @@ proc dofind {} {
     set didsel 0
     set fldtypes {Headline Author Date Committer CDate Comment}
     set l -1
-    foreach d $commitdata {
+    foreach id $displayorder {
+       set d $commitdata($id)
        incr l
        if {$findtype == "Regexp"} {
            set doesmatch [regexp $foundstring $d]
@@ -1732,9 +1743,8 @@ proc dofind {} {
            set doesmatch [string match $matchstring $d]
        }
        if {!$doesmatch} continue
-       set id [lindex $displayorder $l]
        if {![info exists commitinfo($id)]} {
-           getcommit $id $l
+           getcommit $id
        }
        set info $commitinfo($id)
        set doesmatch 0
@@ -2614,7 +2624,9 @@ proc getblobdiffline {bdf ids} {
        set pad [string range "----------------------------------------" 1 $l]
        $ctext insert end "$pad $header $pad\n" filesep
        set diffinhdr 1
-    } elseif {[regexp {^(---|\+\+\+)} $line]} {
+    } elseif {$diffinhdr && [string compare -length 3 $line "---"] == 0} {
+       # do nothing
+    } elseif {$diffinhdr && [string compare -length 3 $line "+++"] == 0} {
        set diffinhdr 0
     } elseif {[regexp {^@@ -([0-9]+),([0-9]+) \+([0-9]+),([0-9]+) @@(.*)} \
                   $line match f1l f1c f2l f2c rest]} {