Browse Source

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 <spearce@spearce.org>
maint
Shawn O. Pearce 18 years ago
parent
commit
74e6b12f58
  1. 143
      git-gui

143
git-gui

@ -178,9 +178,7 @@ if {$appname == {git-citool}} { @@ -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 {} { @@ -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 {} { @@ -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} { @@ -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 @@ -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

Loading…
Cancel
Save