X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=lib%2Fblame.tcl;h=86160092c662673dfe0d852228097d9a68ed91df;hb=c9e6bfd8a9a18c12d01e0d96c74ca0a7f64a2846;hp=8ac0104187e4a06fd70b93c68134d875613f7c32;hpb=a0db0d61fbc447f13cb0aadf01c83eb193b22dc9;p=git.git diff --git a/lib/blame.tcl b/lib/blame.tcl index 8ac010418..86160092c 100644 --- a/lib/blame.tcl +++ b/lib/blame.tcl @@ -8,6 +8,7 @@ field path ; # input filename to view in $commit field w field w_line +field w_cgrp field w_load field w_file field w_cmit @@ -30,6 +31,12 @@ field r_orig_line ; # original line number field r_final_line ; # final line number field r_line_count ; # lines in this region +variable active_color #98e1a0 +variable group_colors { + #cbcbcb + #e1e1e1 +} + constructor new {i_commit i_path} { set commit $i_commit set path $i_path @@ -47,25 +54,37 @@ constructor new {i_commit i_path} { pack $w.path -side top -fill x frame $w.out - text $w.out.loaded_t \ + set w_load $w.out.loaded_t + text $w_load \ -background white -borderwidth 0 \ -state disabled \ -wrap none \ -height 40 \ -width 1 \ -font font_diff - $w.out.loaded_t tag conf annotated -background grey + $w_load tag conf annotated -background grey - text $w.out.linenumber_t \ + set w_line $w.out.linenumber_t + text $w_line \ -background white -borderwidth 0 \ -state disabled \ -wrap none \ -height 40 \ -width 5 \ -font font_diff - $w.out.linenumber_t tag conf linenumber -justify right + $w_line tag conf linenumber -justify right - text $w.out.file_t \ + set w_cgrp $w.out.commit_t + text $w_cgrp \ + -background white -borderwidth 0 \ + -state disabled \ + -wrap none \ + -height 40 \ + -width 4 \ + -font font_diff + + set w_file $w.out.file_t + text $w_file \ -background white -borderwidth 0 \ -state disabled \ -wrap none \ @@ -74,21 +93,23 @@ constructor new {i_commit i_path} { -xscrollcommand [list $w.out.sbx set] \ -font font_diff - scrollbar $w.out.sbx -orient h -command [list $w.out.file_t xview] + scrollbar $w.out.sbx -orient h -command [list $w_file xview] scrollbar $w.out.sby -orient v \ -command [list scrollbar2many [list \ - $w.out.loaded_t \ - $w.out.linenumber_t \ - $w.out.file_t \ + $w_load \ + $w_line \ + $w_cgrp \ + $w_file \ ] yview] grid \ - $w.out.linenumber_t \ - $w.out.loaded_t \ - $w.out.file_t \ + $w_cgrp \ + $w_line \ + $w_load \ + $w_file \ $w.out.sby \ -sticky nsew - grid conf $w.out.sbx -column 2 -sticky we - grid columnconfigure $w.out 2 -weight 1 + grid conf $w.out.sbx -column 3 -sticky we + grid columnconfigure $w.out 3 -weight 1 grid rowconfigure $w.out 0 -weight 1 pack $w.out -fill both -expand 1 @@ -101,7 +122,8 @@ constructor new {i_commit i_path} { pack $w.status -side bottom -fill x frame $w.cm - text $w.cm.t \ + set w_cmit $w.cm.t + text $w_cmit \ -background white -borderwidth 0 \ -state disabled \ -wrap none \ @@ -110,11 +132,11 @@ constructor new {i_commit i_path} { -xscrollcommand [list $w.cm.sbx set] \ -yscrollcommand [list $w.cm.sby set] \ -font font_diff - scrollbar $w.cm.sbx -orient h -command [list $w.cm.t xview] - scrollbar $w.cm.sby -orient v -command [list $w.cm.t yview] + scrollbar $w.cm.sbx -orient h -command [list $w_cmit xview] + scrollbar $w.cm.sby -orient v -command [list $w_cmit yview] pack $w.cm.sby -side right -fill y pack $w.cm.sbx -side bottom -fill x - pack $w.cm.t -expand 1 -fill both + pack $w_cmit -expand 1 -fill both pack $w.cm -side bottom -fill x menu $w.ctxm -tearoff 0 @@ -122,23 +144,17 @@ constructor new {i_commit i_path} { -label "Copy Commit" \ -command [cb _copycommit] - set w_line $w.out.linenumber_t - set w_load $w.out.loaded_t - set w_file $w.out.file_t - set w_cmit $w.cm.t - foreach i [list \ - $w.out.loaded_t \ - $w.out.linenumber_t \ - $w.out.file_t] { - $i tag conf in_sel \ - -background [$i cget -foreground] \ - -foreground [$i cget -background] + $w_cgrp \ + $w_load \ + $w_line \ + $w_file] { $i conf -yscrollcommand \ [list many2scrollbar [list \ - $w.out.loaded_t \ - $w.out.linenumber_t \ - $w.out.file_t \ + $w_cgrp \ + $w_load \ + $w_line \ + $w_file \ ] yview $w.out.sby] bind $i "[cb _click $i @%x,%y]; focus $i" bind_button3 $i " @@ -150,10 +166,11 @@ constructor new {i_commit i_path} { } foreach i [list \ - $w.out.loaded_t \ - $w.out.linenumber_t \ - $w.out.file_t \ - $w.cm.t] { + $w_cgrp \ + $w_load \ + $w_line \ + $w_file \ + $w_cmit] { bind $i {catch {%W yview scroll -1 units};break} bind $i {catch {%W yview scroll 1 units};break} bind $i {catch {%W xview scroll -1 units};break} @@ -166,8 +183,8 @@ constructor new {i_commit i_path} { bind $i {catch {%W yview scroll 1 pages};break} } - bind $w.cm.t "focus $w.cm.t" - bind $top "focus $top" + bind $w_cmit [list focus $w_cmit] + bind $top [list focus $top] bind $top [list delete_this $this] if {$commit eq {}} { @@ -182,16 +199,25 @@ constructor new {i_commit i_path} { method _read_file {fd} { $w_load conf -state normal + $w_cgrp conf -state normal $w_line conf -state normal $w_file conf -state normal while {[gets $fd line] >= 0} { regsub "\r\$" $line {} line incr total_lines - $w_load insert end "\n" - $w_line insert end "$total_lines\n" linenumber - $w_file insert end "$line\n" + + if {$total_lines > 1} { + $w_load insert end "\n" + $w_cgrp insert end "\n" + $w_line insert end "\n" + $w_file insert end "\n" + } + + $w_line insert end "$total_lines" linenumber + $w_file insert end "$line" } $w_load conf -state disabled + $w_cgrp conf -state disabled $w_line conf -state disabled $w_file conf -state disabled @@ -212,6 +238,9 @@ method _read_file {fd} { } ifdeleted { catch {close $fd} } method _read_blame {fd} { + variable group_colors + + $w_cgrp conf -state normal while {[gets $fd line] >= 0} { if {[regexp {^([a-z0-9]{40}) (\d+) (\d+) (\d+)$} $line line \ cmit original_line final_line line_count]} { @@ -221,11 +250,14 @@ method _read_blame {fd} { set r_line_count $line_count if {[catch {set g $order($cmit)}]} { - $w_line tag conf g$cmit - $w_file tag conf g$cmit - $w_line tag raise in_sel - $w_file tag raise in_sel - $w_file tag raise sel + set bg [lindex $group_colors 0] + set group_colors [lrange $group_colors 1 end] + lappend group_colors $bg + + $w_cgrp tag conf g$cmit -background $bg + $w_line tag conf g$cmit -background $bg + $w_file tag conf g$cmit -background $bg + set order($cmit) $commit_count incr commit_count lappend commit_list $cmit @@ -236,18 +268,46 @@ method _read_blame {fd} { set lno $r_final_line set cmit $r_commit + if {[regexp {^0{40}$} $cmit]} { + set abbr work + } else { + set abbr [string range $cmit 0 4] + } + + if {![catch {set ncmit $line_commit([expr {$lno - 1}])}]} { + if {$ncmit eq $cmit} { + set abbr | + } + } + while {$n > 0} { + set lno_e "$lno.0 lineend + 1c" if {[catch {set g g$line_commit($lno)}]} { - $w_load tag add annotated $lno.0 "$lno.0 lineend + 1c" + $w_load tag add annotated $lno.0 $lno_e } else { - $w_line tag remove g$g $lno.0 "$lno.0 lineend + 1c" - $w_file tag remove g$g $lno.0 "$lno.0 lineend + 1c" + $w_cgrp tag remove g$g $lno.0 $lno_e + $w_line tag remove g$g $lno.0 $lno_e + $w_file tag remove g$g $lno.0 $lno_e + + $w_cgrp tag remove a$g $lno.0 $lno_e + $w_line tag remove a$g $lno.0 $lno_e + $w_file tag remove a$g $lno.0 $lno_e } set line_commit($lno) $cmit set line_file($lno) $file - $w_line tag add g$cmit $lno.0 "$lno.0 lineend + 1c" - $w_file tag add g$cmit $lno.0 "$lno.0 lineend + 1c" + + $w_cgrp delete $lno.0 "$lno.0 lineend" + $w_cgrp insert $lno.0 $abbr + set abbr | + + $w_cgrp tag add g$cmit $lno.0 $lno_e + $w_line tag add g$cmit $lno.0 $lno_e + $w_file tag add g$cmit $lno.0 $lno_e + + $w_cgrp tag add a$cmit $lno.0 $lno_e + $w_line tag add a$cmit $lno.0 $lno_e + $w_file tag add a$cmit $lno.0 $lno_e if {$highlight_line == -1} { if {[lindex [$w_file yview] 0] == 0} { @@ -263,6 +323,13 @@ method _read_blame {fd} { incr blame_lines } + if {![catch {set ncmit $line_commit($lno)}]} { + if {$ncmit eq $cmit} { + $w_cgrp delete $lno.0 "$lno.0 lineend + 1c" + $w_cgrp insert $lno.0 "|\n" + } + } + set hc $highlight_commit if {$hc ne {} && [expr {$order($hc) + 1}] == $order($cmit)} { @@ -272,6 +339,7 @@ method _read_blame {fd} { set header($r_commit,$key) $data } } + $w_cgrp conf -state disabled if {[eof $fd]} { close $fd @@ -295,65 +363,49 @@ method _status {} { method _click {cur_w pos} { set lno [lindex [split [$cur_w index $pos] .] 0] if {$lno eq {}} return - - $w_line tag remove in_sel 0.0 end - $w_file tag remove in_sel 0.0 end - $w_line tag add in_sel $lno.0 "$lno.0 + 1 line" - $w_file tag add in_sel $lno.0 "$lno.0 + 1 line" - _showcommit $this $lno } -variable blame_colors { - #ff4040 - #ff40ff - #4040ff -} - method _showcommit {lno} { global repo_config - variable blame_colors + variable active_color if {$highlight_commit ne {}} { - set idx $order($highlight_commit) - set i 0 - foreach c $blame_colors { - set h [lindex $commit_list [expr {$idx - 1 + $i}]] - $w_line tag conf g$h -background white - $w_file tag conf g$h -background white - incr i - } + set cmit $highlight_commit + $w_cgrp tag conf a$cmit -background {} + $w_line tag conf a$cmit -background {} + $w_file tag conf a$cmit -background {} } $w_cmit conf -state normal $w_cmit delete 0.0 end - if {[catch {set cmit $line_commit($lno)} myerr]} { - puts "myerr = $myerr" + if {[catch {set cmit $line_commit($lno)}]} { set cmit {} $w_cmit insert end "Loading annotation..." } else { - set idx $order($cmit) - set i 0 - foreach c $blame_colors { - set h [lindex $commit_list [expr {$idx - 1 + $i}]] - $w_line tag conf g$h -background $c - $w_file tag conf g$h -background $c - incr i - } + $w_cgrp tag conf a$cmit -background $active_color + $w_line tag conf a$cmit -background $active_color + $w_file tag conf a$cmit -background $active_color set author_name {} set author_email {} set author_time {} catch {set author_name $header($cmit,author)} catch {set author_email $header($cmit,author-mail)} - catch {set author_time [clock format $header($cmit,author-time)]} + catch {set author_time [clock format \ + $header($cmit,author-time) \ + -format {%Y-%m-%d %H:%M:%S} + ]} set committer_name {} set committer_email {} set committer_time {} catch {set committer_name $header($cmit,committer)} catch {set committer_email $header($cmit,committer-mail)} - catch {set committer_time [clock format $header($cmit,committer-time)]} + catch {set committer_time [clock format \ + $header($cmit,committer-time) \ + -format {%Y-%m-%d %H:%M:%S} + ]} if {[catch {set msg $header($cmit,message)}]} { set msg {} @@ -381,12 +433,12 @@ method _showcommit {lno} { set header($cmit,message) $msg } - $w_cmit insert end "commit $cmit\n" - $w_cmit insert end "Author: $author_name $author_email $author_time\n" - $w_cmit insert end "Committer: $committer_name $committer_email $committer_time\n" - $w_cmit insert end "Original File: [escape_path $line_file($lno)]\n" - $w_cmit insert end "\n" - $w_cmit insert end $msg + $w_cmit insert end "commit $cmit +Author: $author_name $author_email $author_time +Committer: $committer_name $committer_email $committer_time +Original File: [escape_path $line_file($lno)] + +$msg" } $w_cmit conf -state disabled