git-gui: Correct ls-tree buffering problem in browser
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>
This commit is contained in:
		| @ -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 | ||||
| @ -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 | ||||
|  | ||||
| @ -185,16 +187,18 @@ 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 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] | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Shawn O. Pearce
					Shawn O. Pearce