From fb22de1f9d70994e2746829d4dc0b05e7c06783c Mon Sep 17 00:00:00 2001 From: Maxime Chaisse-Leal Date: Thu, 21 Jul 2016 16:06:50 -0700 Subject: [PATCH] readline support for pry-debugger (see https://github.com/ddollar/foreman/pull/536) --- lib/foreman/engine.rb | 12 ++++++++++-- lib/foreman/engine/cli.rb | 15 ++++++++------- spec/foreman/cli_spec.rb | 17 +++++++++++++++++ spec/resources/Procfile.IRB | 2 ++ spec/resources/bin/irb | 5 +++++ spec/resources/bin/irbinput | 16 ++++++++++++++++ 6 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 spec/resources/Procfile.IRB create mode 100644 spec/resources/bin/irb create mode 100644 spec/resources/bin/irbinput diff --git a/lib/foreman/engine.rb b/lib/foreman/engine.rb index 68125e85..9e9336df 100644 --- a/lib/foreman/engine.rb +++ b/lib/foreman/engine.rb @@ -389,8 +389,16 @@ def handle_io(readers) if reader.eof? @readers.delete_if { |key, value| value == reader } else - data = reader.gets - output_with_mutex name_for(@readers.invert[reader]), data + $stdout.print marker(name_for(@readers.invert[reader])) + + loop do + ch = reader.getc + + $stdout.print ch + $stdout.flush + + break if ch == "\n" + end end end end diff --git a/lib/foreman/engine/cli.rb b/lib/foreman/engine/cli.rb index e52d03ba..c60502b2 100644 --- a/lib/foreman/engine/cli.rb +++ b/lib/foreman/engine/cli.rb @@ -55,18 +55,19 @@ def startup def output(name, data) data.to_s.lines.map(&:chomp).each do |message| - output = "" - output += $stdout.color(@colors[name.split(".").first].to_sym) - output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | " - output += $stdout.color(:reset) - output += message - $stdout.puts output - $stdout.flush + $stdout.puts(marker(name) + message) end rescue Errno::EPIPE terminate_gracefully end + def marker(name) + output = "" + output += $stdout.color(@colors[name.split(".").first].to_sym) + output += "#{Time.now.strftime("%H:%M:%S")} #{pad_process_name(name)} | " + output += $stdout.color(:reset) + end + def shutdown end diff --git a/spec/foreman/cli_spec.rb b/spec/foreman/cli_spec.rb index 43481257..8e659acb 100644 --- a/spec/foreman/cli_spec.rb +++ b/spec/foreman/cli_spec.rb @@ -28,6 +28,23 @@ end describe "with a valid Procfile" do + describe "Readline applications" do + it "outputs prompt" do + without_fakefs do + output = foreman("start irb -f #{resource_path("Procfile.IRB")}") + expect(output).to match(/irb\(main\):001:0>/) + end + end + + it "outputs prompt and responds to input" do + without_fakefs do + output = foreman("start irbinput -f #{resource_path("Procfile.IRB")}") + expect(output).to match(/# leet foreman/) + expect(output).to match(/=> 74331/) + end + end + end + it "can run a single command" do without_fakefs do output = foreman("start env -f #{resource_path("Procfile")}") diff --git a/spec/resources/Procfile.IRB b/spec/resources/Procfile.IRB new file mode 100644 index 00000000..ef35e549 --- /dev/null +++ b/spec/resources/Procfile.IRB @@ -0,0 +1,2 @@ +irb: bin/irb +irbinput: bin/irbinput diff --git a/spec/resources/bin/irb b/spec/resources/bin/irb new file mode 100644 index 00000000..9ba6e955 --- /dev/null +++ b/spec/resources/bin/irb @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require 'irb' +Thread.new { IRB.start } +sleep 1 +abort diff --git a/spec/resources/bin/irbinput b/spec/resources/bin/irbinput new file mode 100644 index 00000000..0f2716b1 --- /dev/null +++ b/spec/resources/bin/irbinput @@ -0,0 +1,16 @@ +#!/usr/bin/env ruby +require 'pty' +require 'irb' + +PTY.spawn('irb') do |reader, writer| + Thread.new do + sleep 1 + writer.puts '0xf013 + 0x3248 # leet foreman' + end + + loop do + sleep 2 + print reader.sysread(256) + abort + end +end