diff --git a/lib/irb/history.rb b/lib/irb/history.rb index 84d69e19c..06088adb0 100644 --- a/lib/irb/history.rb +++ b/lib/irb/history.rb @@ -60,7 +60,7 @@ def save_history 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") } + hist = history.map{ |l| l.scrub.split("\n").join("\\\n") } unless append_history begin hist = hist.last(num) if hist.size > num and num > 0 diff --git a/test/irb/test_history.rb b/test/irb/test_history.rb index 868c05369..b211e87be 100644 --- a/test/irb/test_history.rb +++ b/test/irb/test_history.rb @@ -148,6 +148,23 @@ def test_history_concurrent_use_not_present ENV["IRBRC"] = backup_irbrc end + def test_history_different_encodings + backup_default_external = Encoding.default_external + IRB.conf[:SAVE_HISTORY] = 2 + Encoding.default_external = Encoding::US_ASCII + locale = IRB::Locale.new("C") + assert_history(<<~EXPECTED_HISTORY.encode(Encoding::US_ASCII), <<~INITIAL_HISTORY.encode(Encoding::UTF_8), <<~INPUT, locale: locale) + ???? + exit + EXPECTED_HISTORY + 😀 + INITIAL_HISTORY + exit + INPUT + ensure + Encoding.default_external = backup_default_external + end + private def history_concurrent_use_for_input_method(input_method) @@ -179,11 +196,11 @@ def history_concurrent_use_for_input_method(input_method) end end - def assert_history(expected_history, initial_irb_history, input, input_method = TestInputMethodWithRelineHistory) + def assert_history(expected_history, initial_irb_history, input, input_method = TestInputMethodWithRelineHistory, locale: IRB::Locale.new) backup_verbose, $VERBOSE = $VERBOSE, nil backup_home = ENV["HOME"] backup_xdg_config_home = ENV.delete("XDG_CONFIG_HOME") - IRB.conf[:LC_MESSAGES] = IRB::Locale.new + IRB.conf[:LC_MESSAGES] = locale actual_history = nil Dir.mktmpdir("test_irb_history_") do |tmpdir| ENV["HOME"] = tmpdir