git-gui: More performance improvements to rescan logic.
[gitweb.git] / git-gui
diff --git a/git-gui b/git-gui
index ed745ee52e5f812167ff7fb91890d72821341955..1833fa86cee2415e670becd206de1d054feff61e 100755 (executable)
--- a/git-gui
+++ b/git-gui
@@ -70,7 +70,7 @@ proc repository_state {hdvar ctvar} {
 proc update_status {{final Ready.}} {
        global HEAD PARENT commit_type
        global ui_index ui_other ui_status_value ui_comm
-       global status_active file_states
+       global status_active file_states status_start
 
        if {$status_active || ![lock_index read]} return
 
@@ -84,6 +84,7 @@ proc update_status {{final Ready.}} {
                set commit_type $new_type
        }
 
+       set status_start [clock seconds]
        array unset file_states
        foreach w [list $ui_index $ui_other] {
                $w conf -state normal
@@ -230,7 +231,7 @@ proc read_ls_others {fd final} {
 }
 
 proc status_eof {fd buf final} {
-       global status_active $buf
+       global status_active status_start $buf
        global ui_fname_value ui_status_value file_states
 
        if {[eof $fd]} {
@@ -240,8 +241,12 @@ proc status_eof {fd buf final} {
                if {[incr status_active -1] == 0} {
                        unlock_index
 
-                       set ui_status_value $final
+                       set e1 [clock seconds]
                        display_all_files
+                       set e2 [clock seconds]
+puts "TIME [expr $e1 - $status_start] + [expr $e2 - $e1] = [expr $e2 - $status_start]"
+
+                       set ui_status_value $final
 
                        if {$ui_fname_value != {} && [array names file_states \
                                -exact $ui_fname_value] != {}}  {
@@ -664,11 +669,11 @@ proc push_to {remote} {
 ## ui helpers
 
 proc mapcol {state path} {
-       global all_cols
+       global all_cols ui_other
 
        if {[catch {set r $all_cols($state)}]} {
                puts "error: no column for state={$state} $path"
-               return o
+               return $ui_other
        }
        return $r
 }
@@ -716,31 +721,34 @@ proc bsearch {w path} {
 
 set next_icon_id 0
 
-proc merge_state {path state} {
+proc merge_state {path new_state} {
        global file_states next_icon_id
 
-       if {[array names file_states -exact $path] == {}}  {
-               set m __
-               set s [list $m icon[incr next_icon_id]]
+       set s0 [string index $new_state 0]
+       set s1 [string index $new_state 1]
+
+       if {[catch {set info $file_states($path)}]} {
+               set state __
+               set icon n[incr next_icon_id]
        } else {
-               set s $file_states($path)
-               set m [lindex $s 0]
+               set state [lindex $info 0]
+               set icon [lindex $info 1]
        }
 
-       if {[string index $state 0] == {_}} {
-               set state [string index $m 0][string index $state 1]
-       } elseif {[string index $state 0] == {*}} {
-               set state _[string index $state 1]
+       if {$s0 == {_}} {
+               set s0 [string index $state 0]
+       } elseif {$s0 == {*}} {
+               set s0 _
        }
 
-       if {[string index $state 1] == {_}} {
-               set state [string index $state 0][string index $m 1]
-       } elseif {[string index $state 1] == {*}} {
-               set state [string index $state 0]_
+       if {$s1 == {_}} {
+               set s1 [string index $state 1]
+       } elseif {$s1 == {*}} {
+               set s_
        }
 
-       set file_states($path) [lreplace $s 0 0 $state]
-       return $m
+       set file_states($path) [list $s0$s1 $icon]
+       return $state
 }
 
 proc display_file {path state} {
@@ -750,19 +758,12 @@ proc display_file {path state} {
        if {$status_active} return
 
        set s $file_states($path)
+       set old_w [mapcol $old_m $path]
+       set new_w [mapcol $new_m $path]
        set new_m [lindex $s 0]
-       set new_col [mapcol $new_m $path]
        set new_ico [mapicon $new_m $path]
 
-       if {$new_col == {o}} {
-               set old_w $ui_index
-               set new_w $ui_other
-       } else {
-               set old_w $ui_other
-               set new_w $ui_index
-       }
-
-       if {$new_col != [mapcol $old_m $path]} {
+       if {$new_w != $old_w} {
                set lno [bsearch $old_w $path]
                if {$lno >= 0} {
                        incr lno
@@ -795,18 +796,12 @@ proc display_all_files {} {
        foreach path [lsort [array names file_states]] {
                set s $file_states($path)
                set m [lindex $s 0]
-
-               if {[mapcol $m $path] == {o}} {
-                       set aw $ui_other
-               } else {
-                       set aw $ui_index
-               }
-
-               $aw image create end \
+               set w [mapcol $m $path]
+               $w image create end \
                        -align center -padx 5 -pady 1 \
                        -name [lindex $s 1] \
                        -image [mapicon $m $path]
-               $aw insert end "$path\n"
+               $w insert end "$path\n"
        }
 
        $ui_index conf -state disabled
@@ -1025,6 +1020,8 @@ static unsigned char file_merge_bits[] = {
    0xfa, 0x17, 0x02, 0x10, 0xfe, 0x1f};
 } -maskdata $filemask
 
+set ui_index .vpane.files.index.list
+set ui_other .vpane.files.other.list
 set max_status_desc 0
 foreach i {
                {__ i plain    "Unmodified"}
@@ -1035,7 +1032,7 @@ foreach i {
                {_O o plain    "Untracked"}
                {A_ o fulltick "Added"}
                {AM o parttick "Partially added"}
-               {AD o question  "Added (but now gone)"}
+               {AD o question "Added (but now gone)"}
 
                {_D i question "Missing"}
                {D_ i removed  "Removed"}
@@ -1048,7 +1045,11 @@ foreach i {
        if {$max_status_desc < [string length [lindex $i 3]]} {
                set max_status_desc [string length [lindex $i 3]]
        }
-       set all_cols([lindex $i 0]) [lindex $i 1]
+       if {[lindex $i 1] == {i}} {
+               set all_cols([lindex $i 0]) $ui_index
+       } else {
+               set all_cols([lindex $i 0]) $ui_other
+       }
        set all_icons([lindex $i 0]) file_[lindex $i 2]
        set all_descs([lindex $i 0]) [lindex $i 3]
 }
@@ -1461,7 +1462,6 @@ panedwindow .vpane.files -orient horizontal
 pack .vpane -anchor n -side top -fill both -expand 1
 
 # -- Index File List
-set ui_index .vpane.files.index.list
 frame .vpane.files.index -height 100 -width 400
 label .vpane.files.index.title -text {Modified Files} \
        -background green \
@@ -1479,7 +1479,6 @@ pack $ui_index -side left -fill both -expand 1
 .vpane.files add .vpane.files.index -sticky nsew
 
 # -- Other (Add) File List
-set ui_other .vpane.files.other.list
 frame .vpane.files.other -height 100 -width 100
 label .vpane.files.other.title -text {Untracked Files} \
        -background red \