summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2024-06-03 16:11:33 -0700
committerTakashi Kokubun <takashikkbn@gmail.com>2024-06-03 16:11:54 -0700
commit6e84ac2359c8fc8cb686ef4644b9cae26cd5ab9e (patch)
tree386cd038e83e2daab14f54a209b702b01177437c
parenta8f5284045e3aba1b45691142e5c01bf1d24d519 (diff)
Revert "[ruby/reline] Reline::ANSI is general io. Reline::GeneralIO is not."
This reverts commit ba01d15cf5db96933905d669c68f5cc0cd6910b8. It seems to be failing test-bundler-parallel. Reverting it to normalize the CI. We should revert this revert once we figure it out.
-rw-r--r--lib/reline.rb16
-rw-r--r--lib/reline/io.rb6
-rw-r--r--lib/reline/io/ansi.rb10
-rw-r--r--test/reline/yamatanooroti/test_rendering.rb12
4 files changed, 26 insertions, 18 deletions
diff --git a/lib/reline.rb b/lib/reline.rb
index 6bae469894..33a1cfc625 100644
--- a/lib/reline.rb
+++ b/lib/reline.rb
@@ -254,6 +254,7 @@ module Reline
raise ArgumentError.new('#readmultiline needs block to confirm multiline termination')
end
+ Reline.update_iogate
io_gate.with_raw_input do
inner_readline(prompt, add_hist, true, &confirm_multiline_termination)
end
@@ -276,6 +277,7 @@ module Reline
def readline(prompt = '', add_hist = false)
@mutex.synchronize do
+ Reline.update_iogate
io_gate.with_raw_input do
inner_readline(prompt, add_hist, false)
end
@@ -459,7 +461,7 @@ module Reline
end
private def may_req_ambiguous_char_width
- @ambiguous_width = 2 if io_gate.dumb? || !STDIN.tty? || !STDOUT.tty?
+ @ambiguous_width = 2 if io_gate.dumb? or !STDOUT.tty?
return if defined? @ambiguous_width
io_gate.move_cursor_column(0)
begin
@@ -553,6 +555,18 @@ module Reline
def self.line_editor
core.line_editor
end
+
+ def self.update_iogate
+ return if core.config.test_mode
+
+ # Need to change IOGate when `$stdout.tty?` change from false to true by `$stdout.reopen`
+ # Example: rails/spring boot the application in non-tty, then run console in tty.
+ if ENV['TERM'] != 'dumb' && core.io_gate.dumb? && $stdout.tty?
+ require 'reline/io/ansi'
+ remove_const(:IOGate)
+ const_set(:IOGate, Reline::ANSI.new)
+ end
+ end
end
diff --git a/lib/reline/io.rb b/lib/reline/io.rb
index c1dd1a56c8..7fca0c338a 100644
--- a/lib/reline/io.rb
+++ b/lib/reline/io.rb
@@ -19,7 +19,11 @@ module Reline
io
end
else
- Reline::ANSI.new
+ if $stdout.tty?
+ Reline::ANSI.new
+ else
+ Reline::Dumb.new
+ end
end
end
end
diff --git a/lib/reline/io/ansi.rb b/lib/reline/io/ansi.rb
index aa8ff256e2..cf3c9965dd 100644
--- a/lib/reline/io/ansi.rb
+++ b/lib/reline/io/ansi.rb
@@ -174,10 +174,12 @@ class Reline::ANSI < Reline::IO
Reline.core.line_editor.handle_signal
end
c = @input.getbyte
- (c == 0x16 && @input.tty? && @input.raw(min: 0, time: 0, &:getbyte)) || c
+ (c == 0x16 && @input.raw(min: 0, time: 0, &:getbyte)) || c
rescue Errno::EIO
# Maybe the I/O has been closed.
nil
+ rescue Errno::ENOTTY
+ nil
end
START_BRACKETED_PASTE = String.new("\e[200~", encoding: Encoding::ASCII_8BIT)
@@ -237,12 +239,12 @@ class Reline::ANSI < Reline::IO
def set_screen_size(rows, columns)
@input.winsize = [rows, columns]
self
- rescue Errno::ENOTTY, Errno::ENODEV
+ rescue Errno::ENOTTY
self
end
def cursor_pos
- if @input.tty? && @output.tty?
+ begin
res = +''
m = nil
@input.raw do |stdin|
@@ -261,7 +263,7 @@ class Reline::ANSI < Reline::IO
end
column = m[:column].to_i - 1
row = m[:row].to_i - 1
- else
+ rescue Errno::ENOTTY
begin
buf = @output.pread(@output.pos, 0)
row = buf.count("\n")
diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb
index f119d686cd..1cf46b4cd1 100644
--- a/test/reline/yamatanooroti/test_rendering.rb
+++ b/test/reline/yamatanooroti/test_rendering.rb
@@ -969,18 +969,6 @@ begin
EOC
end
- def test_nontty
- omit if Reline.core.io_gate.win?
- cmd = %Q{ruby -e 'puts(%Q{ello\C-ah\C-e})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })' | ruby -e 'print STDIN.read'}
- start_terminal(40, 50, ['bash', '-c', cmd])
- sleep 1
- close rescue nil
- assert_screen(<<~'EOC')
- > hello
- "hello"
- EOC
- end
-
def test_eof_with_newline
omit if Reline.core.io_gate.win?
cmd = %Q{ruby -e 'print(%Q{abc def \\e\\r})' | ruby -I#{@pwd}/lib -rreline -e 'p Reline.readline(%{> })'}