[ruby/irb] Fix history file saving with concurrent irb sessions when history file doesn't exist

If history file didn't exist when irb was started, @loaded_history_mtime
would be nil.  However, if the history file didn't exist before, but it
exists when saving history, that means the history file was modified,
and we should handle it the same way as we handle the other case where
the history file was modified.

Fixes #388

https://github.com/ruby/irb/commit/8d277aafcb
This commit is contained in:
Jeremy Evans 2022-09-14 10:15:32 +09:00 коммит произвёл git
Родитель b876230e5c
Коммит 9299db49f5
2 изменённых файлов: 24 добавлений и 2 удалений

Просмотреть файл

@ -107,9 +107,9 @@ module IRB
raise
end
if File.exist?(history_file) && @loaded_history_mtime &&
if File.exist?(history_file) &&
File.mtime(history_file) != @loaded_history_mtime
history = history[@loaded_history_lines..-1]
history = history[@loaded_history_lines..-1] if @loaded_history_lines
append_history = true
end

Просмотреть файл

@ -158,6 +158,28 @@ module TestIRB
end
end
def test_history_concurrent_use_not_present
backup_home = ENV["HOME"]
backup_xdg_config_home = ENV.delete("XDG_CONFIG_HOME")
IRB.conf[:SAVE_HISTORY] = 1
Dir.mktmpdir("test_irb_history_#{$$}") do |tmpdir|
ENV["HOME"] = tmpdir
io = TestInputMethod.new
io.class::HISTORY.clear
io.load_history
io.class::HISTORY.concat(%w"line1 line2")
history_file = IRB.rc_file("_history")
assert !File.file?(history_file)
File.write(history_file, "line0\n")
io.save_history
assert_equal(%w"line0 line1 line2", File.read(history_file).split)
end
ensure
ENV["HOME"] = backup_home
ENV["XDG_CONFIG_HOME"] = backup_xdg_config_home
end
private
def assert_history(expected_history, initial_irb_history, input)