send-email: respect in-reply-to regardless of threading
[gitweb.git] / git-gui / lib / blame.tcl
index 00ecf21333c976d4c6002cd66a055803362f3523..b6e42cbc8fe0a49c301335f78cc2941bd9d59870 100644 (file)
@@ -33,13 +33,6 @@ variable group_colors {
        #ececec
 }
 
-# Switches for original location detection
-#
-variable original_options [list -C -C]
-if {[git-version >= 1.5.3]} {
-       lappend original_options -w ; # ignore indentation changes
-}
-
 # Current blame data; cleared/reset on each load
 #
 field commit               ; # input commit to blame
@@ -80,6 +73,7 @@ constructor new {i_commit i_path} {
        label $w.header.commit_l \
                -text [mc "Commit:"] \
                -background gold \
+               -foreground black \
                -anchor w \
                -justify left
        set w_back $w.header.commit_b
@@ -89,6 +83,7 @@ constructor new {i_commit i_path} {
                -relief flat \
                -state disabled \
                -background gold \
+               -foreground black \
                -activebackground gold
        bind $w_back <Button-1> "
                if {\[$w_back cget -state\] eq {normal}} {
@@ -98,16 +93,19 @@ constructor new {i_commit i_path} {
        label $w.header.commit \
                -textvariable @commit \
                -background gold \
+               -foreground black \
                -anchor w \
                -justify left
        label $w.header.path_l \
                -text [mc "File:"] \
                -background gold \
+               -foreground black \
                -anchor w \
                -justify left
        set w_path $w.header.path
        label $w_path \
                -background gold \
+               -foreground black \
                -anchor w \
                -justify left
        pack $w.header.commit_l -side left
@@ -135,7 +133,9 @@ constructor new {i_commit i_path} {
                -takefocus 0 \
                -highlightthickness 0 \
                -padx 0 -pady 0 \
-               -background white -borderwidth 0 \
+               -background white \
+               -foreground black \
+               -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 40 \
@@ -148,7 +148,9 @@ constructor new {i_commit i_path} {
                -takefocus 0 \
                -highlightthickness 0 \
                -padx 0 -pady 0 \
-               -background white -borderwidth 0 \
+               -background white \
+               -foreground black \
+               -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 40 \
@@ -166,7 +168,9 @@ constructor new {i_commit i_path} {
                -takefocus 0 \
                -highlightthickness 0 \
                -padx 0 -pady 0 \
-               -background white -borderwidth 0 \
+               -background white \
+               -foreground black \
+               -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 40 \
@@ -184,7 +188,9 @@ constructor new {i_commit i_path} {
                -takefocus 0 \
                -highlightthickness 0 \
                -padx 0 -pady 0 \
-               -background white -borderwidth 0 \
+               -background white \
+               -foreground black \
+               -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 40 \
@@ -213,7 +219,9 @@ constructor new {i_commit i_path} {
 
        set w_cviewer $w.file_pane.cm.t
        text $w_cviewer \
-               -background white -borderwidth 0 \
+               -background white \
+               -foreground black \
+               -borderwidth 0 \
                -state disabled \
                -wrap none \
                -height 10 \
@@ -248,6 +256,9 @@ constructor new {i_commit i_path} {
        $w.ctxm add command \
                -label [mc "Copy Commit"] \
                -command [cb _copycommit]
+       $w.ctxm add command \
+               -label [mc "Do Full Copy Detection"] \
+               -command [cb _fullcopyblame]
 
        foreach i $w_columns {
                for {set g 0} {$g < [llength $group_colors]} {incr g} {
@@ -318,19 +329,27 @@ constructor new {i_commit i_path} {
        bind $w.file_pane <Configure> \
        "if {{$w.file_pane} eq {%W}} {[cb _resize %h]}"
 
+       wm protocol $top WM_DELETE_WINDOW "destroy $top"
+       bind $top <Destroy> [cb _kill]
+
        _load $this {}
 }
 
+method _kill {} {
+       if {$current_fd ne {}} {
+               kill_file_process $current_fd
+               catch {close $current_fd}
+               set current_fd {}
+       }
+}
+
 method _load {jump} {
        variable group_colors
 
        _hide_tooltip $this
 
        if {$total_lines != 0 || $current_fd ne {}} {
-               if {$current_fd ne {}} {
-                       catch {close $current_fd}
-                       set current_fd {}
-               }
+               _kill $this
 
                foreach i $w_columns {
                        $i conf -state normal
@@ -496,7 +515,6 @@ method _exec_blame {cur_w cur_d options cur_s} {
 method _read_blame {fd cur_w cur_d} {
        upvar #0 $cur_d line_data
        variable group_colors
-       variable original_options
 
        if {$fd ne $current_fd} {
                catch {close $fd}
@@ -669,6 +687,18 @@ method _read_blame {fd cur_w cur_d} {
        if {[eof $fd]} {
                close $fd
                if {$cur_w eq $w_asim} {
+                       # Switches for original location detection
+                       set threshold [get_config gui.copyblamethreshold]
+                       set original_options [list "-C$threshold"]
+
+                       if {![is_config_true gui.fastcopyblame]} {
+                               # thorough copy search; insert before the threshold
+                               set original_options [linsert $original_options 0 -C]
+                       }
+                       if {[git-version >= 1.5.3]} {
+                               lappend original_options -w ; # ignore indentation changes
+                       }
+
                        _exec_blame $this $w_amov @amov_data \
                                $original_options \
                                [mc "Loading original location annotations..."]
@@ -681,6 +711,72 @@ method _read_blame {fd cur_w cur_d} {
        }
 } ifdeleted { catch {close $fd} }
 
+method _find_commit_bound {data_list start_idx delta} {
+       upvar #0 $data_list line_data
+       set pos $start_idx
+       set limit       [expr {[llength $line_data] - 1}]
+       set base_commit [lindex $line_data $pos 0]
+
+       while {$pos > 0 && $pos < $limit} {
+               set new_pos [expr {$pos + $delta}]
+               if {[lindex $line_data $new_pos 0] ne $base_commit} {
+                       return $pos
+               }
+
+               set pos $new_pos
+       }
+
+       return $pos
+}
+
+method _fullcopyblame {} {
+       if {$current_fd ne {}} {
+               tk_messageBox \
+                       -icon error \
+                       -type ok \
+                       -title [mc "Busy"] \
+                       -message [mc "Annotation process is already running."]
+
+               return
+       }
+
+       # Switches for original location detection
+       set threshold [get_config gui.copyblamethreshold]
+       set original_options [list -C -C "-C$threshold"]
+
+       if {[git-version >= 1.5.3]} {
+               lappend original_options -w ; # ignore indentation changes
+       }
+
+       # Find the line range
+       set pos @$::cursorX,$::cursorY
+       set lno [lindex [split [$::cursorW index $pos] .] 0]
+       set min_amov_lno [_find_commit_bound $this @amov_data $lno -1]
+       set max_amov_lno [_find_commit_bound $this @amov_data $lno 1]
+       set min_asim_lno [_find_commit_bound $this @asim_data $lno -1]
+       set max_asim_lno [_find_commit_bound $this @asim_data $lno 1]
+
+       if {$min_asim_lno < $min_amov_lno} {
+               set min_amov_lno $min_asim_lno
+       }
+
+       if {$max_asim_lno > $max_amov_lno} {
+               set max_amov_lno $max_asim_lno
+       }
+
+       lappend original_options -L "$min_amov_lno,$max_amov_lno"
+
+       # Clear lines
+       for {set i $min_amov_lno} {$i <= $max_amov_lno} {incr i} {
+               lset amov_data $i [list ]
+       }
+
+       # Start the back-end process
+       _exec_blame $this $w_amov @amov_data \
+               $original_options \
+               [mc "Running thorough copy detection..."]
+}
+
 method _click {cur_w pos} {
        set lno [lindex [split [$cur_w index $pos] .] 0]
        _showcommit $this $cur_w $lno