summaryrefslogtreecommitdiff
path: root/lib/reline.rb
diff options
context:
space:
mode:
authortomoya ishida <[email protected]>2024-04-05 01:38:41 +0900
committerHiroshi SHIBATA <[email protected]>2024-04-05 09:34:28 +0900
commit4e48d2724edafdebfe7fba4db01a50cd2a726d20 ()
treee5218642e844ad49bf154d0740148b68414e4652 /lib/reline.rb
parent4cbe4e49c7e2a90d7d34337343187ab9af2f58d1 (diff)
[ruby/reline] Thread safe readline
(https://.com/ruby/reline/pull/669) Block until other Reline.readline or Reline.readmultiline finish https://.com/ruby/reline/commit/ebab2875f1
-rw-r--r--lib/reline.rb63
1 files changed, 34 insertions, 29 deletions
@@ -75,6 +75,7 @@ module Reline
def initialize
self.output = STDOUT
@dialog_proc_list = {}
yield self
@completion_quote_character = nil
@@ -254,44 +255,48 @@ module Reline
Reline::DEFAULT_DIALOG_CONTEXT = Array.new
def readmultiline(prompt = '', add_hist = false, &confirm_multiline_termination)
- unless confirm_multiline_termination
- 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
- whole_buffer = line_editor.whole_buffer.dup
- whole_buffer.taint if RUBY_VERSION < '2.7'
- if add_hist and whole_buffer and whole_buffer.chomp("\n").size > 0
- Reline::HISTORY << whole_buffer
- end
- if line_editor.eof?
- line_editor.reset_line
- # Return nil if the input is aborted by C-d.
- nil
- else
- whole_buffer
end
end
def readline(prompt = '', add_hist = false)
- Reline.update_iogate
- io_gate.with_raw_input do
- inner_readline(prompt, add_hist, false)
- end
- line = line_editor.line.dup
- line.taint if RUBY_VERSION < '2.7'
- if add_hist and line and line.chomp("\n").size > 0
- Reline::HISTORY << line.chomp("\n")
- end
- line_editor.reset_line if line_editor.line.nil?
- line
end
private def inner_readline(prompt, add_hist, multiline, &confirm_multiline_termination)