From c26b126502d4025230aa80e7d26736e1398c5022 Mon Sep 17 00:00:00 2001
From: Lin Jen-Shin <godfat@godfat.org>
Date: Mon, 17 Apr 2017 15:53:09 +0800
Subject: [PATCH] Make sure @stream.each_line would tag
 Encoding.default_external

---
 lib/gitlab/ci/trace/stream.rb           |  2 ++
 spec/lib/gitlab/ci/trace/stream_spec.rb | 18 ++++++++++++++----
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/lib/gitlab/ci/trace/stream.rb b/lib/gitlab/ci/trace/stream.rb
index 33141d0d88d..8d9fb6ff0f1 100644
--- a/lib/gitlab/ci/trace/stream.rb
+++ b/lib/gitlab/ci/trace/stream.rb
@@ -15,6 +15,8 @@ module Gitlab
         def initialize
           @stream = yield
           @stream.binmode
+          # Ci::Ansi2html::Converter would read from @stream directly
+          @stream.set_encoding(Encoding.default_external)
         end
 
         def valid?
diff --git a/spec/lib/gitlab/ci/trace/stream_spec.rb b/spec/lib/gitlab/ci/trace/stream_spec.rb
index 4bbca6d2ea2..6f5c9994f54 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(:stream) do
-        described_class.new do
-          File.open(expand_fixture_path('trace/ansi-sequence-and-unicode'))
-        end
+      let(:io) do
+        File.open(expand_fixture_path('trace/ansi-sequence-and-unicode'))
       end
 
+      let(:stream) { described_class.new { io } }
+
       it 'forwards to the next linefeed, case 1' do
         stream.limit(7)
 
@@ -57,6 +57,16 @@ describe Gitlab::Ci::Trace::Stream do
         expect(result).to eq("\e[01;32m許功蓋\e[0m\n")
         expect(result.encoding).to eq(Encoding.default_external)
       end
+
+      # See https://gitlab.com/gitlab-org/gitlab-ce/issues/30796
+      it 'reads in binary, output as Encoding.default_external' do
+        stream.limit(29)
+
+        result = io.read # Ci::Ansi2html::Converter would read with each_line
+
+        expect(result).to eq("\e[01;32m許功蓋\e[0m\n")
+        expect(result.encoding).to eq(Encoding.default_external)
+      end
     end
   end
 
-- 
GitLab