提交 74e6b12f 编写于 作者: S Shawn O. Pearce

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: NShawn O. Pearce <spearce@spearce.org>
上级 92148d80
......@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册