diff --git a/lib/gitlab/ci/trace.rb b/lib/gitlab/ci/trace.rb index b980e29e9c3..5b835bb669a 100644 --- a/lib/gitlab/ci/trace.rb +++ b/lib/gitlab/ci/trace.rb @@ -50,8 +50,6 @@ module Gitlab end def read - return unless exist? - stream = Gitlab::Ci::Trace::Stream.new do if current_path File.open(current_path, "rb") diff --git a/lib/gitlab/ci/trace/stream.rb b/lib/gitlab/ci/trace/stream.rb index 8d9fb6ff0f1..757a8e2dc6a 100644 --- a/lib/gitlab/ci/trace/stream.rb +++ b/lib/gitlab/ci/trace/stream.rb @@ -14,9 +14,7 @@ module Gitlab def initialize @stream = yield - @stream.binmode - # Ci::Ansi2html::Converter would read from @stream directly - @stream.set_encoding(Encoding.default_external) + @stream.binmode if @stream end def valid? @@ -58,12 +56,14 @@ module Gitlab end def html_with_state(state = nil) + set_encoding_for_ansi2html ::Ci::Ansi2html.convert(stream, state) end def html(last_lines: nil) text = raw(last_lines: last_lines) stream = StringIO.new(text) + set_encoding_for_ansi2html(stream) ::Ci::Ansi2html.convert(stream).html end @@ -117,6 +117,11 @@ module Gitlab chunks.join.lines.last(last_lines).join end + + def set_encoding_for_ansi2html(stream = @stream) + # Ci::Ansi2html::Converter would read from @stream directly + stream.set_encoding(Encoding.default_external) + 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 6f5c9994f54..1602a4945ad 100644 --- a/spec/lib/gitlab/ci/trace/stream_spec.rb +++ b/spec/lib/gitlab/ci/trace/stream_spec.rb @@ -34,12 +34,12 @@ describe Gitlab::Ci::Trace::Stream do end context 'when the trace contains ANSI sequence and Unicode' do - let(:io) do - File.open(expand_fixture_path('trace/ansi-sequence-and-unicode')) + let(:stream) do + described_class.new do + File.open(expand_fixture_path('trace/ansi-sequence-and-unicode')) + end end - let(:stream) { described_class.new { io } } - it 'forwards to the next linefeed, case 1' do stream.limit(7) @@ -60,11 +60,11 @@ describe Gitlab::Ci::Trace::Stream do # See https://gitlab.com/gitlab-org/gitlab-ce/issues/30796 it 'reads in binary, output as Encoding.default_external' do - stream.limit(29) + stream.limit(52) - result = io.read # Ci::Ansi2html::Converter would read with each_line + result = stream.html - expect(result).to eq("\e[01;32m許功蓋\e[0m\n") + expect(result.lines.first).to eq("ヾ(´༎ຶД༎ຶ`)ノ
許功蓋
") expect(result.encoding).to eq(Encoding.default_external) end end