Skip to content

Commit

Permalink
git-gui: Correct ls-tree buffering problem in browser
Browse files Browse the repository at this point in the history
Our file browser was showing bad output as it did not properly buffer
a partial record when read from `ls-tree -z`.  This did not show up on
my Mac OS X system as most trees are small, the pipe buffers generally
big and `ls-tree -z` was generally fast enough that all data was ready
before Tcl started to read.  However on my Cygwin system one of my
production repositories had a large enough tree and packfile that it
took a couple of pipe buffers for `ls-tree -z` to complete its dump.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Shawn O. Pearce committed Jul 10, 2007
1 parent 88dce86 commit 56e29f5
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions lib/browser.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ field browser_status {Starting...}
field browser_stack {}
field browser_busy 1

field ls_buf {}; # Buffered record output from ls-tree

constructor new {commit} {
global cursor_ptr M1B
make_toplevel top w
Expand Down Expand Up @@ -160,7 +162,7 @@ method _click {was_double_click pos} {
}

method _ls {tree_id {name {}}} {
set browser_buffer {}
set ls_buf {}
set browser_files {}
set browser_busy 1

Expand All @@ -185,17 +187,19 @@ method _ls {tree_id {name {}}} {
}

method _read {fd} {
append browser_buffer [read $fd]
set pck [split $browser_buffer "\0"]
set browser_buffer [lindex $pck end]
append ls_buf [read $fd]
set pck [split $ls_buf "\0"]
set ls_buf [lindex $pck end]

set n [llength $browser_files]
$w conf -state normal
foreach p [lrange $pck 0 end-1] {
set info [split $p "\t"]
set path [lindex $info 1]
set info [split [lindex $info 0] { }]
set type [lindex $info 1]
set tab [string first "\t" $p]
if {$tab == -1} continue

set info [split [string range $p 0 [expr {$tab - 1}]] { }]
set path [string range $p [expr {$tab + 1}] end]
set type [lindex $info 1]
set object [lindex $info 2]

switch -- $type {
Expand Down Expand Up @@ -225,7 +229,7 @@ method _read {fd} {
close $fd
set browser_status Ready.
set browser_busy 0
unset browser_buffer
set ls_buf {}
if {$n > 0} {
$w tag add in_sel 1.0 2.0
focus -force $w
Expand Down

0 comments on commit 56e29f5

Please sign in to comment.