diff --git a/app/models/terminal_executor.rb b/app/models/terminal_executor.rb index 6d043625ba..d5dcf7130a 100644 --- a/app/models/terminal_executor.rb +++ b/app/models/terminal_executor.rb @@ -15,6 +15,7 @@ # class TerminalExecutor SECRET_PREFIX = "secret://" + CURSOR = /\e\[\d*[ABCDK]/ attr_reader :pid, :pgid, :output, :timeout @@ -104,13 +105,19 @@ def timeout_execution(time, &block) def stream(from:, to:) from.each(256) do |chunk| chunk.scrub! - chunk = chunk.gsub(/\r\e\[\d+[ABCD]\r\n/, "\r") # ignore cursor movement http://ascii-table.com/ansi-escape-sequences.php + ignore_cursor_movement!(chunk) to.write chunk end rescue Errno::EIO nil # output was closed ... only happens on linux end + # http://ascii-table.com/ansi-escape-sequences.php + def ignore_cursor_movement!(chunk) + chunk.gsub!(/\r#{CURSOR}\r\n/, "\r") + chunk.gsub!(CURSOR, "") + end + def script(commands) commands.map! do |c| if @verbose diff --git a/test/models/terminal_executor_test.rb b/test/models/terminal_executor_test.rb index 65d6beefbe..90a43e7e45 100644 --- a/test/models/terminal_executor_test.rb +++ b/test/models/terminal_executor_test.rb @@ -129,8 +129,8 @@ end it "does not log cursor movement ... special output coming from docker builds" do - assert subject.execute("ruby -e 'puts \"Hello\\r\e[1B\\nWorld\\n\"'") - output.string.must_equal "Hello\rWorld\r\n" + assert subject.execute("ruby -e 'puts \"Hello\\r\e[1B\\nWorld\\n\e[1K\"'") + output.string.must_equal "Hello\rWorld\r\n\r\n" end describe "with script-executor" do