This commit is contained in:
Junio C Hamano
2005-11-18 17:43:38 -08:00

168
gitk
View File

@ -60,7 +60,7 @@ proc getcommits {rargs} {
proc getcommitlines {commfd} { proc getcommitlines {commfd} {
global commits parents cdate children global commits parents cdate children
global commitlisted phase commitinfo nextupdate global commitlisted phase nextupdate
global stopped redisplaying leftover global stopped redisplaying leftover
set stuff [read $commfd] set stuff [read $commfd]
@ -196,42 +196,41 @@ proc parsecommit {id contents listed olds} {
incr ncleft($p) incr ncleft($p)
} }
} }
foreach line [split $contents "\n"] { set hdrend [string first "\n\n" $contents]
if {$inhdr} { if {$hdrend < 0} {
if {$line == {}} { # should never happen...
set inhdr 0 set hdrend [string length $contents]
} else { }
set tag [lindex $line 0] set header [string range $contents 0 [expr {$hdrend - 1}]]
if {$tag == "author"} { set comment [string range $contents [expr {$hdrend + 2}] end]
set x [expr {[llength $line] - 2}] foreach line [split $header "\n"] {
set audate [lindex $line $x] set tag [lindex $line 0]
set auname [lrange $line 1 [expr {$x - 1}]] if {$tag == "author"} {
} elseif {$tag == "committer"} { set audate [lindex $line end-1]
set x [expr {[llength $line] - 2}] set auname [lrange $line 1 end-2]
set comdate [lindex $line $x] } elseif {$tag == "committer"} {
set comname [lrange $line 1 [expr {$x - 1}]] set comdate [lindex $line end-1]
} set comname [lrange $line 1 end-2]
}
} else {
if {$comment == {}} {
set headline [string trim $line]
} else {
append comment "\n"
}
if {!$listed} {
# git-rev-list indents the comment by 4 spaces;
# if we got this via git-cat-file, add the indentation
append comment " "
}
append comment $line
} }
} }
if {$audate != {}} { set headline {}
set audate [clock format $audate -format "%Y-%m-%d %H:%M:%S"] # take the first line of the comment as the headline
set i [string first "\n" $comment]
if {$i >= 0} {
set headline [string trim [string range $comment 0 $i]]
}
if {!$listed} {
# git-rev-list indents the comment by 4 spaces;
# if we got this via git-cat-file, add the indentation
set newcomment {}
foreach line [split $comment "\n"] {
append newcomment " "
append newcomment $line
}
set comment $newcomment
} }
if {$comdate != {}} { if {$comdate != {}} {
set cdate($id) $comdate set cdate($id) $comdate
set comdate [clock format $comdate -format "%Y-%m-%d %H:%M:%S"]
} }
set commitinfo($id) [list $headline $auname $audate \ set commitinfo($id) [list $headline $auname $audate \
$comname $comdate $comment] $comname $comdate $comment]
@ -683,7 +682,7 @@ Use and redistribute under the terms of the GNU General Public License} \
} }
proc assigncolor {id} { proc assigncolor {id} {
global commitinfo colormap commcolors colors nextcolor global colormap commcolors colors nextcolor
global parents nparents children nchildren global parents nparents children nchildren
global cornercrossings crossings global cornercrossings crossings
@ -783,10 +782,12 @@ proc bindline {t id} {
$canv bind $t <Button-1> "lineclick %x %y $id 1" $canv bind $t <Button-1> "lineclick %x %y $id 1"
} }
proc drawlines {id xtra} { proc drawlines {id xtra delold} {
global mainline mainlinearrow sidelines lthickness colormap canv global mainline mainlinearrow sidelines lthickness colormap canv
$canv delete lines.$id if {$delold} {
$canv delete lines.$id
}
if {[info exists mainline($id)]} { if {[info exists mainline($id)]} {
set t [$canv create line $mainline($id) \ set t [$canv create line $mainline($id) \
-width [expr {($xtra + 1) * $lthickness}] \ -width [expr {($xtra + 1) * $lthickness}] \
@ -858,7 +859,7 @@ proc drawcommitline {level} {
set mainline($id) [trimdiagstart $mainline($id)] set mainline($id) [trimdiagstart $mainline($id)]
} }
} }
drawlines $id 0 drawlines $id 0 0
set orad [expr {$linespc / 3}] set orad [expr {$linespc / 3}]
set t [$canv create oval [expr $x - $orad] [expr $y1 - $orad] \ set t [$canv create oval [expr $x - $orad] [expr $y1 - $orad] \
[expr $x + $orad - 1] [expr $y1 + $orad - 1] \ [expr $x + $orad - 1] [expr $y1 + $orad - 1] \
@ -878,6 +879,7 @@ proc drawcommitline {level} {
set headline [lindex $commitinfo($id) 0] set headline [lindex $commitinfo($id) 0]
set name [lindex $commitinfo($id) 1] set name [lindex $commitinfo($id) 1]
set date [lindex $commitinfo($id) 2] set date [lindex $commitinfo($id) 2]
set date [formatdate $date]
set linehtag($lineno) [$canv create text $xt $y1 -anchor w \ set linehtag($lineno) [$canv create text $xt $y1 -anchor w \
-text $headline -font $mainfont ] -text $headline -font $mainfont ]
$canv bind $linehtag($lineno) <Button-3> "rowmenu %X %Y $id" $canv bind $linehtag($lineno) <Button-3> "rowmenu %X %Y $id"
@ -1446,8 +1448,8 @@ proc decidenext {{noread 0}} {
} }
proc drawcommit {id} { proc drawcommit {id} {
global phase todo nchildren datemode nextupdate global phase todo nchildren datemode nextupdate revlistorder
global numcommits ncmupdate displayorder todo onscreen global numcommits ncmupdate displayorder todo onscreen parents
if {$phase != "incrdraw"} { if {$phase != "incrdraw"} {
set phase incrdraw set phase incrdraw
@ -1459,19 +1461,29 @@ proc drawcommit {id} {
lappend todo $id lappend todo $id
set onscreen($id) 0 set onscreen($id) 0
} }
set level [decidenext 1] if {$revlistorder} {
if {$level == {} || $id != [lindex $todo $level]} { set level [lsearch -exact $todo $id]
return if {$level < 0} {
} error_popup "oops, $id isn't in todo"
while 1 { return
lappend displayorder [lindex $todo $level]
if {[updatetodo $level $datemode]} {
set level [decidenext 1]
if {$level == {}} break
} }
set id [lindex $todo $level] lappend displayorder $id
if {![info exists commitlisted($id)]} { updatetodo $level 0
break } else {
set level [decidenext 1]
if {$level == {} || $id != [lindex $todo $level]} {
return
}
while 1 {
lappend displayorder [lindex $todo $level]
if {[updatetodo $level $datemode]} {
set level [decidenext 1]
if {$level == {}} break
}
set id [lindex $todo $level]
if {![info exists commitlisted($id)]} {
break
}
} }
} }
drawmore 1 drawmore 1
@ -1523,21 +1535,23 @@ proc drawrest {} {
global phase stopped redisplaying selectedline global phase stopped redisplaying selectedline
global datemode todo displayorder global datemode todo displayorder
global numcommits ncmupdate global numcommits ncmupdate
global nextupdate startmsecs global nextupdate startmsecs revlistorder
set level [decidenext] if {!$revlistorder} {
if {$level >= 0} { set level [decidenext]
set phase drawgraph if {$level >= 0} {
while 1 { set phase drawgraph
lappend displayorder [lindex $todo $level] while 1 {
set hard [updatetodo $level $datemode] lappend displayorder [lindex $todo $level]
if {$hard} { set hard [updatetodo $level $datemode]
set level [decidenext] if {$hard} {
if {$level < 0} break set level [decidenext]
if {$level < 0} break
}
} }
} }
drawmore 0
} }
drawmore 0
set phase {} set phase {}
set drawmsecs [expr [clock clicks -milliseconds] - $startmsecs] set drawmsecs [expr [clock clicks -milliseconds] - $startmsecs]
#puts "overall $drawmsecs ms for $numcommits commits" #puts "overall $drawmsecs ms for $numcommits commits"
@ -2146,8 +2160,10 @@ proc selectline {l isnew} {
$ctext mark set fmark.0 0.0 $ctext mark set fmark.0 0.0
$ctext mark gravity fmark.0 left $ctext mark gravity fmark.0 left
set info $commitinfo($id) set info $commitinfo($id)
$ctext insert end "Author: [lindex $info 1] [lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "Committer: [lindex $info 3] [lindex $info 4]\n" $ctext insert end "Author: [lindex $info 1] $date\n"
set date [formatdate [lindex $info 4]]
$ctext insert end "Committer: [lindex $info 3] $date\n"
if {[info exists idtags($id)]} { if {[info exists idtags($id)]} {
$ctext insert end "Tags:" $ctext insert end "Tags:"
foreach tag $idtags($id) { foreach tag $idtags($id) {
@ -3226,7 +3242,7 @@ proc lineclick {x y id isnew} {
normalline normalline
$canv delete hover $canv delete hover
# draw this line thicker than normal # draw this line thicker than normal
drawlines $id 1 drawlines $id 1 1
set thickerline $id set thickerline $id
if {$isnew} { if {$isnew} {
set ymax [lindex [$canv cget -scrollregion] 3] set ymax [lindex [$canv cget -scrollregion] 3]
@ -3255,7 +3271,8 @@ proc lineclick {x y id isnew} {
set info $commitinfo($id) set info $commitinfo($id)
$ctext insert end "\n\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 "\tAuthor:\t[lindex $info 1]\n"
$ctext insert end "\tDate:\t[lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "\tDate:\t$date\n"
if {[info exists children($id)]} { if {[info exists children($id)]} {
$ctext insert end "\nChildren:" $ctext insert end "\nChildren:"
set i 0 set i 0
@ -3267,7 +3284,8 @@ proc lineclick {x y id isnew} {
$ctext tag bind link$i <1> [list selbyid $child] $ctext tag bind link$i <1> [list selbyid $child]
$ctext insert end "\n\t[lindex $info 0]" $ctext insert end "\n\t[lindex $info 0]"
$ctext insert end "\n\tAuthor:\t[lindex $info 1]" $ctext insert end "\n\tAuthor:\t[lindex $info 1]"
$ctext insert end "\n\tDate:\t[lindex $info 2]\n" set date [formatdate [lindex $info 2]]
$ctext insert end "\n\tDate:\t$date\n"
} }
} }
$ctext conf -state disabled $ctext conf -state disabled
@ -3278,7 +3296,7 @@ proc lineclick {x y id isnew} {
proc normalline {} { proc normalline {} {
global thickerline global thickerline
if {[info exists thickerline]} { if {[info exists thickerline]} {
drawlines $thickerline 0 drawlines $thickerline 0 1
unset thickerline unset thickerline
} }
} }
@ -3650,6 +3668,20 @@ proc doquit {} {
destroy . destroy .
} }
proc formatdate {d} {
global hours nhours tfd
set hr [expr {$d / 3600}]
set ms [expr {$d % 3600}]
if {![info exists hours($hr)]} {
set hours($hr) [clock format $d -format "%Y-%m-%d %H"]
set nhours($hr) 0
}
incr nhours($hr)
set minsec [format "%.2d:%.2d" [expr {$ms/60}] [expr {$ms%60}]]
return "$hours($hr):$minsec"
}
# defaults... # defaults...
set datemode 0 set datemode 0
set boldnames 0 set boldnames 0
@ -3662,6 +3694,7 @@ set findmergefiles 0
set gaudydiff 0 set gaudydiff 0
set maxgraphpct 50 set maxgraphpct 50
set maxwidth 16 set maxwidth 16
set revlistorder 0
set colors {green red blue magenta darkgrey brown orange} set colors {green red blue magenta darkgrey brown orange}
@ -3678,6 +3711,7 @@ foreach arg $argv {
"^$" { } "^$" { }
"^-b" { set boldnames 1 } "^-b" { set boldnames 1 }
"^-d" { set datemode 1 } "^-d" { set datemode 1 }
"^-r" { set revlistorder 1 }
default { default {
lappend revtreeargs $arg lappend revtreeargs $arg
} }