mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 13:34:17 +02:00

(https://github.com/ruby/irb/pull/575)
* Support native integration with ruby/debug
* Prevent using multi-irb and activating debugger at the same time
Multi-irb makes a few assumptions:
- IRB will manage all threads that host sub-irb sessions
- All IRB sessions will be run on the threads created by IRB itself
However, when using the debugger these assumptions are broken:
- `debug` will freeze ALL threads when it suspends the session (e.g. when
hitting a breakpoint, or performing step-debugging).
- Since the irb-debug integration runs IRB as the debugger's interface,
it will be run on the debugger's thread, which is not managed by IRB.
So we should prevent the 2 features from being used at the same time.
To do that, we check if the other feature is already activated when
executing the commands that would activate the other feature.
d8fb3246be
74 lines
2.3 KiB
Ruby
74 lines
2.3 KiB
Ruby
module IRB
|
|
module HistorySavingAbility # :nodoc:
|
|
def support_history_saving?
|
|
true
|
|
end
|
|
|
|
def reset_history_counter
|
|
@loaded_history_lines = self.class::HISTORY.size if defined? @loaded_history_lines
|
|
end
|
|
|
|
def load_history
|
|
history = self.class::HISTORY
|
|
if history_file = IRB.conf[:HISTORY_FILE]
|
|
history_file = File.expand_path(history_file)
|
|
end
|
|
history_file = IRB.rc_file("_history") unless history_file
|
|
if File.exist?(history_file)
|
|
File.open(history_file, "r:#{IRB.conf[:LC_MESSAGES].encoding}") do |f|
|
|
f.each { |l|
|
|
l = l.chomp
|
|
if self.class == RelineInputMethod and history.last&.end_with?("\\")
|
|
history.last.delete_suffix!("\\")
|
|
history.last << "\n" << l
|
|
else
|
|
history << l
|
|
end
|
|
}
|
|
end
|
|
@loaded_history_lines = history.size
|
|
@loaded_history_mtime = File.mtime(history_file)
|
|
end
|
|
end
|
|
|
|
def save_history
|
|
history = self.class::HISTORY
|
|
if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) != 0
|
|
if history_file = IRB.conf[:HISTORY_FILE]
|
|
history_file = File.expand_path(history_file)
|
|
end
|
|
history_file = IRB.rc_file("_history") unless history_file
|
|
|
|
# Change the permission of a file that already exists[BUG #7694]
|
|
begin
|
|
if File.stat(history_file).mode & 066 != 0
|
|
File.chmod(0600, history_file)
|
|
end
|
|
rescue Errno::ENOENT
|
|
rescue Errno::EPERM
|
|
return
|
|
rescue
|
|
raise
|
|
end
|
|
|
|
if File.exist?(history_file) &&
|
|
File.mtime(history_file) != @loaded_history_mtime
|
|
history = history[@loaded_history_lines..-1] if @loaded_history_lines
|
|
append_history = true
|
|
end
|
|
|
|
File.open(history_file, (append_history ? 'a' : 'w'), 0o600, encoding: IRB.conf[:LC_MESSAGES]&.encoding) do |f|
|
|
hist = history.map{ |l| l.split("\n").join("\\\n") }
|
|
unless append_history
|
|
begin
|
|
hist = hist.last(num) if hist.size > num and num > 0
|
|
rescue RangeError # bignum too big to convert into `long'
|
|
# Do nothing because the bignum should be treated as inifinity
|
|
end
|
|
end
|
|
f.puts(hist)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|