From 74e6b12f5831a8c93a5d3c90118a73e908d0680a Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Sun, 12 Nov 2006 06:35:14 -0500 Subject: [PATCH] git-gui: Supply progress feedback when running update-index. The git-update-index process can take a while to process a large number of files; for example my laptop would probably need almost an hour to chug through 20,000 modified files. In these incredibly large cases the user should be given at least some feedback to let them know the application is still working on their behalf, even if it won't them do anything else (as the index is locked). Signed-off-by: Shawn O. Pearce --- git-gui | 143 +++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 79 insertions(+), 64 deletions(-) diff --git a/git-gui b/git-gui index 931a959..456f53f 100755 --- a/git-gui +++ b/git-gui @@ -178,9 +178,7 @@ if {$appname == {git-citool}} { set single_commit 0 set status_active 0 set diff_active 0 -set update_active 0 set commit_active 0 -set update_index_fd {} set disable_on_lock [list] set index_lock_type none @@ -1100,55 +1098,73 @@ proc display_all_files {} { $ui_other conf -state disabled } -proc with_update_index {body} { - global update_index_fd +proc update_index {pathList} { + global update_index_cp ui_status_value - if {$update_index_fd == {}} { - if {![lock_index update]} return - set update_index_fd [open \ - "| git update-index --add --remove -z --stdin" \ - w] - fconfigure $update_index_fd -translation binary - uplevel 1 $body - close $update_index_fd - set update_index_fd {} - unlock_index - } else { - uplevel 1 $body - } -} + if {![lock_index update]} return -proc update_index {path} { - global update_index_fd + set update_index_cp 0 + set totalCnt [llength $pathList] + set batch [expr {int($totalCnt * .01) + 1}] + if {$batch > 25} {set batch 25} + + set ui_status_value "Including files ... 0/$totalCnt 0%" + set ui_status_value [format \ + "Including files ... %i/%i files (%.2f%%)" \ + $update_index_cp \ + $totalCnt \ + 0.0] + set fd [open "| git update-index --add --remove -z --stdin" w] + fconfigure $fd -blocking 0 -translation binary + fileevent $fd writable [list \ + write_update_index \ + $fd \ + $pathList \ + $totalCnt \ + $batch \ + ] +} + +proc write_update_index {fd pathList totalCnt batch} { + global update_index_cp ui_status_value + global file_states ui_fname_value - if {$update_index_fd == {}} { - error {not in with_update_index} - } else { - puts -nonewline $update_index_fd "$path\0" + if {$update_index_cp >= $totalCnt} { + close $fd + unlock_index + set ui_status_value {Ready.} + return } -} -proc toggle_mode {path} { - global file_states ui_fname_value - - set s $file_states($path) - set m [lindex $s 0] + for {set i $batch} \ + {$update_index_cp < $totalCnt && $i > 0} \ + {incr i -1} { + set path [lindex $pathList $update_index_cp] + incr update_index_cp + + switch -- [lindex $file_states($path) 0] { + AM - + _O {set new A*} + _M - + MM {set new M*} + AD - + _D {set new D*} + default {continue} + } - switch -- $m { - AM - - _O {set new A*} - _M - - MM {set new M*} - AD - - _D {set new D*} - default {return} + puts -nonewline $fd $path + puts -nonewline $fd "\0" + display_file $path $new + if {$ui_fname_value == $path} { + show_diff $path + } } - with_update_index {update_index $path} - display_file $path $new - if {$ui_fname_value == $path} { - show_diff $path - } + set ui_status_value [format \ + "Including files ... %i/%i files (%.2f%%)" \ + $update_index_cp \ + $totalCnt \ + [expr {100.0 * $update_index_cp / $totalCnt}]] } ###################################################################### @@ -1627,27 +1643,25 @@ proc do_rescan {} { } proc do_include_all {} { - global update_active ui_status_value - - if {$update_active || ![lock_index begin-update]} return - - set update_active 1 - set ui_status_value {Including all modified files...} - after 1 { - with_update_index { - foreach path [array names file_states] { - set s $file_states($path) - set m [lindex $s 0] - switch -- $m { - AM - - MM - - _M - - _D {toggle_mode $path} - } - } + global file_states + + if {![lock_index begin-update]} return + + set pathList [list] + foreach path [array names file_states] { + set s $file_states($path) + set m [lindex $s 0] + switch -- $m { + AM - + MM - + _M - + _D {lappend pathList $path} } - set update_active 0 - set ui_status_value {Ready.} + } + if {$pathList == {}} { + unlock_index + } else { + update_index $pathList } } @@ -1844,7 +1858,7 @@ proc unclick {w x y} { if {$path == {}} return if {$col == 0} { - toggle_mode $path + update_index [list $path] } } @@ -2318,4 +2332,5 @@ load_all_remotes populate_remote_menu .mbar.fetch From fetch_from populate_remote_menu .mbar.push To push_to populate_pull_menu .mbar.pull +tkwait visibility . update_status -- 2.11.4.GIT