From 174bc2257065785efbbefca797a50f0847bb6062 Mon Sep 17 00:00:00 2001 From: Stan Lo Date: Fri, 14 Jul 2023 16:45:04 +0100 Subject: [PATCH] [ruby/irb] Fix history-saving feature (https://github.com/ruby/irb/pull/642) * Define RelineInputMethod::HISTORY The HistorySavingAbility module doesn't do anything if the input method class doesn't define HISTORY. - https://github.com/ruby/irb/blob/3ac96be660bf052902fb4e532c7a46cf294b71eb/lib/irb/history.rb#L10 - https://github.com/ruby/irb/blob/3ac96be660bf052902fb4e532c7a46cf294b71eb/lib/irb/history.rb#L34 This patch defines RelineInputMethod::HISTORY to avoid this. * Improve history-saving's ability check Instead of checking the existence of `input_method_class::HISTORY`, we should make every input method class declare if it supports history saving or not. Since the default value is `false`, it shouldn't break any custom input method that inherits from `IRB::InputMethod`. https://github.com/ruby/irb/commit/aec7a5b3f5 --- lib/irb/context.rb | 12 +++++------- lib/irb/history.rb | 2 -- lib/irb/input-method.rb | 13 +++++++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/irb/context.rb b/lib/irb/context.rb index d755622f32..bf5b4c5708 100644 --- a/lib/irb/context.rb +++ b/lib/irb/context.rb @@ -154,8 +154,12 @@ module IRB def save_history=(val) IRB.conf[:SAVE_HISTORY] = val + if val - (IRB.conf[:MAIN_CONTEXT] || self).init_save_history + context = (IRB.conf[:MAIN_CONTEXT] || self) + if context.io.support_history_saving? && !context.io.singleton_class.include?(HistorySavingAbility) + context.io.extend(HistorySavingAbility) + end end end @@ -576,11 +580,5 @@ module IRB command = command_aliases.fetch(command.to_sym, command) ExtendCommandBundle.load_command(command)&.respond_to?(:transform_args) end - - def init_save_history# :nodoc: - unless (class<<@io;self;end).include?(HistorySavingAbility) - @io.extend(HistorySavingAbility) - end - end end end diff --git a/lib/irb/history.rb b/lib/irb/history.rb index a1b0d5cba0..e18ff516b2 100644 --- a/lib/irb/history.rb +++ b/lib/irb/history.rb @@ -7,7 +7,6 @@ module IRB end def load_history - return unless self.class.const_defined?(:HISTORY) history = self.class::HISTORY if history_file = IRB.conf[:HISTORY_FILE] history_file = File.expand_path(history_file) @@ -31,7 +30,6 @@ module IRB end def save_history - return unless self.class.const_defined?(:HISTORY) history = self.class::HISTORY if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) != 0 if history_file = IRB.conf[:HISTORY_FILE] diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb index 3e7fac2ace..643e89f27e 100644 --- a/lib/irb/input-method.rb +++ b/lib/irb/input-method.rb @@ -47,6 +47,10 @@ module IRB false end + def support_history_saving? + false + end + # For debug message def inspect 'Abstract InputMethod' @@ -230,6 +234,10 @@ module IRB true end + def support_history_saving? + true + end + # Returns the current line number for #io. # # #line counts the number of times #gets is called. @@ -256,6 +264,7 @@ module IRB end class RelineInputMethod < InputMethod + HISTORY = Reline::HISTORY # Creates a new input method object using Reline def initialize IRB.__send__(:set_encoding, Reline.encoding_system_needs.name, override: false) @@ -458,6 +467,10 @@ module IRB str += " and #{inputrc_path}" if File.exist?(inputrc_path) str end + + def support_history_saving? + true + end end class ReidlineInputMethod < RelineInputMethod