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}]
exit 1
}
set leftover {}
- set commitdata {}
fconfigure $commfd -blocking 0 -translation lf
if {$tclencoding != {}} {
fconfigure $commfd -encoding $tclencoding
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
$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)]} {
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
}
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
}
unset idinlist($id)
}
if {[info exists idrowranges($id)]} {
- lappend linesegends($row) $id
lappend idrowranges($id) $row
}
incr row
proc layouttail {} {
global rowidlist rowoffsets idinlist commitidx
- global idrowranges linesegends
+ global idrowranges
set row $commitidx
set idlist [lindex $rowidlist $row]
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]
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 {}
}
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
$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}]
global displayorder rowidlist
global idrowranges idrangedrawn iddrawn
global commitinfo commitlisted parents numcommits
- global commitdata
if {$row >= $numcommits} return
foreach id [lindex $rowidlist $row] {
return
}
if {![info exists commitinfo($id)]} {
- getcommit $id $row
+ getcommit $id
}
assigncolor $id
if {[info exists commitlisted($id)] && [info exists parents($id)]
proc finishcommits {} {
global commitidx phase
global canv mainfont ctext maincursor textcursor
+ global findinprogress
if {$commitidx > 0} {
drawrest
$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 {}
}
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]
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
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]} {