diff --git a/fixtures/multiline/Procfile b/fixtures/multiline/Procfile new file mode 100644 index 0000000..3684bb6 --- /dev/null +++ b/fixtures/multiline/Procfile @@ -0,0 +1,2 @@ +stdout1: ruby ./stdout.rb +stdout2: ruby ./stdout.rb diff --git a/fixtures/multiline/stdout.rb b/fixtures/multiline/stdout.rb new file mode 100644 index 0000000..50f4e21 --- /dev/null +++ b/fixtures/multiline/stdout.rb @@ -0,0 +1,13 @@ +#!/usr/bin/env ruby + +$stdout.sync = true + +puts "a" +sleep 1 +puts "a\nb" +sleep 1 +puts "a\nb\nc" +sleep 1 +puts "a\nb\nc\nd" +sleep 1 +puts "finish!" diff --git a/outlet.go b/outlet.go index a5a566e..64d33c0 100644 --- a/outlet.go +++ b/outlet.go @@ -40,20 +40,25 @@ func (of *OutletFactory) LineReader(wg *sync.WaitGroup, name string, index int, for { buf := make([]byte, 1024) - v, _ := reader.Read(buf) - - if v == 0 { + + if n, err := reader.Read(buf); err != nil { return + } else { + buf = buf[:n] } - idx := bytes.IndexByte(buf, '\n') - if idx >= 0 { - buffer.Write(buf[0:idx]) + for { + i := bytes.IndexByte(buf, '\n') + if i < 0 { + break + } + buffer.Write(buf[0:i]) of.WriteLine(name, buffer.String(), color, ct.None, isError) buffer.Reset() - } else { - buffer.Write(buf) + buf = buf[i+1:] } + + buffer.Write(buf) } }