diff --git a/lib/irb/ext/save-history.rb b/lib/irb/ext/save-history.rb index 7acaebe36a..ad954c3558 100644 --- a/lib/irb/ext/save-history.rb +++ b/lib/irb/ext/save-history.rb @@ -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 diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb index 81b7fe8679..38a002d319 100644 --- a/test/irb/test_history.rb +++ b/test/irb/test_history.rb @@ -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)