From 9350b9064cb9c5048f9eab8041e953a5dab5b154 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Mon, 17 Apr 2017 17:52:15 +0800 Subject: [PATCH] Set the encoding in c'tor and explain why it's fine --- lib/gitlab/ci/trace/stream.rb | 16 ++++++++-------- spec/lib/gitlab/ci/trace/stream_spec.rb | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/gitlab/ci/trace/stream.rb b/lib/gitlab/ci/trace/stream.rb index 757a8e2dc6a..b929bdd55bc 100644 --- a/lib/gitlab/ci/trace/stream.rb +++ b/lib/gitlab/ci/trace/stream.rb @@ -14,7 +14,14 @@ module Gitlab def initialize @stream = yield - @stream.binmode if @stream + if @stream + @stream.binmode + # Ci::Ansi2html::Converter would read from @stream directly, + # using @stream.each_line to be specific. It's safe to set + # the encoding here because IO#seek(bytes) and IO#read(bytes) + # are not characters based, so encoding doesn't matter to them. + @stream.set_encoding(Encoding.default_external) + end end def valid? @@ -56,14 +63,12 @@ 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,11 +122,6 @@ 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 28d5c2183ce..03f040f4465 100644 --- a/spec/lib/gitlab/ci/trace/stream_spec.rb +++ b/spec/lib/gitlab/ci/trace/stream_spec.rb @@ -64,7 +64,7 @@ describe Gitlab::Ci::Trace::Stream do result = stream.html - expect(result.lines.first).to eq("ヾ(´༎ຶД༎ຶ`)ノ
許功蓋
") + expect(result).to eq("ヾ(´༎ຶД༎ຶ`)ノ
許功蓋
") expect(result.encoding).to eq(Encoding.default_external) end end -- GitLab