summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2015-06-03 01:48:02 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2015-06-03 01:48:02 +0900
commitb00bcf506e0554b918e7aa75842277bc9a65dda8 (patch)
tree1cd3af38f7c0612638d9da1df16d7f52ebeada89
parentfdbfe36c0b882a4e948fafd1949956341607b1e5 (diff)
Fix #248 - Premature termination of Reader on long input
-rw-r--r--src/reader.go26
-rw-r--r--test/test_go.rb11
2 files changed, 34 insertions, 3 deletions
diff --git a/src/reader.go b/src/reader.go
index d4764119..7496b775 100644
--- a/src/reader.go
+++ b/src/reader.go
@@ -30,9 +30,29 @@ func (r *Reader) ReadSource() {
}
func (r *Reader) feed(src io.Reader) {
- if scanner := bufio.NewScanner(src); scanner != nil {
- for scanner.Scan() {
- r.pusher(scanner.Text())
+ reader := bufio.NewReader(src)
+ eof := false
+Loop:
+ for !eof {
+ buf := []byte{}
+ iter := 0 // TODO: max size?
+ for {
+ // "ReadLine either returns a non-nil line or it returns an error, never both"
+ line, isPrefix, err := reader.ReadLine()
+ eof = err == io.EOF
+ if eof {
+ break
+ } else if err != nil {
+ break Loop
+ }
+ iter++
+ buf = append(buf, line...)
+ if !isPrefix {
+ break
+ }
+ }
+ if iter > 0 {
+ r.pusher(string(buf))
r.eventBox.Set(EvtReadNew, nil)
}
}
diff --git a/test/test_go.rb b/test/test_go.rb
index 4c4a77ce..35caea77 100644
--- a/test/test_go.rb
+++ b/test/test_go.rb
@@ -525,6 +525,17 @@ class TestGoFZF < TestBase
tmux.send_keys 'uuu', 'TTT', 'tt', 'uu', 'ttt', 'C-j'
assert_equal %w[4 5 6 9], readonce.split($/)
end
+
+ def test_long_line
+ tempname = TEMPNAME + Time.now.to_f.to_s
+ data = '.' * 256 * 1024
+ File.open(tempname, 'w') do |f|
+ f << data
+ end
+ assert_equal data, `cat #{tempname} | #{FZF} -f .`.chomp
+ ensure
+ File.unlink tempname
+ end
private
def writelines path, lines
File.unlink path while File.exists? path