From 3d11b7d8e25ca39b347e61e12100c7745b6ea085 Mon Sep 17 00:00:00 2001 From: Shinya Maeda Date: Wed, 10 May 2017 02:40:34 +0900 Subject: Fix reverse_line from chunk based --- lib/gitlab/ci/trace/stream.rb | 19 +++++++++++++++++-- spec/lib/gitlab/ci/trace/stream_spec.rb | 22 ++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/gitlab/ci/trace/stream.rb b/lib/gitlab/ci/trace/stream.rb index 72a0d669de0..546f6788a78 100644 --- a/lib/gitlab/ci/trace/stream.rb +++ b/lib/gitlab/ci/trace/stream.rb @@ -119,16 +119,31 @@ module Gitlab def reverse_line pos = BUFFER_SIZE max = stream.size + debris = '' while pos < max stream.seek(-pos, IO::SEEK_END) - yield(stream.read(BUFFER_SIZE)) + stream.read(BUFFER_SIZE).tap do |buf| + buf = buf + debris + lines = buf.split("\n") + lines.reverse.each do |line| + yield(line) + end + debris = lines.count > 0 ? lines[0] : '' + end pos += BUFFER_SIZE end # Reached the head, read only left stream.seek(0) - yield(stream.read(BUFFER_SIZE - (pos - max))) + last = (max > BUFFER_SIZE) ? (max % BUFFER_SIZE) : max + stream.read(last).tap do |buf| + buf = buf + debris + lines = buf.split("\n") + lines.reverse.each do |line| + yield(line) + end + end end end end diff --git a/spec/lib/gitlab/ci/trace/stream_spec.rb b/spec/lib/gitlab/ci/trace/stream_spec.rb index a607f000431..d90ccf4f799 100644 --- a/spec/lib/gitlab/ci/trace/stream_spec.rb +++ b/spec/lib/gitlab/ci/trace/stream_spec.rb @@ -254,6 +254,28 @@ describe Gitlab::Ci::Trace::Stream do end end + context 'when BUFFER_SIZE is smaller than stream.size' do + let(:data) { 'Coverage 1033 / 1051 LOC (98.29%) covered\n' } + let(:regex) { '\(\d+.\d+\%\) covered' } + + before do + stub_const('Gitlab::Ci::Trace::Stream::BUFFER_SIZE', 5) + end + + it { is_expected.to eq("98.29") } + end + + context 'when BUFFER_SIZE is equal to stream.size' do + let(:data) { 'Coverage 1033 / 1051 LOC (98.29%) covered\n' } + let(:regex) { '\(\d+.\d+\%\) covered' } + + before do + stub_const('Gitlab::Ci::Trace::Stream::BUFFER_SIZE', data.length) + end + + it { is_expected.to eq("98.29") } + end + context 'using a regex capture' do let(:data) { 'TOTAL 9926 3489 65%' } let(:regex) { 'TOTAL\s+\d+\s+\d+\s+(\d{1,3}\%)' } -- cgit v1.2.1