summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/irb/init.rb18
-rw-r--r--test/irb/test_init.rb40
2 files changed, 48 insertions, 10 deletions
diff --git a/lib/irb/init.rb b/lib/irb/init.rb
index d9676fd9a5..66e7b61468 100644
--- a/lib/irb/init.rb
+++ b/lib/irb/init.rb
@@ -389,18 +389,16 @@ module IRB # :nodoc:
$LOAD_PATH.unshift(*load_path)
end
- # running config
+ # Run the config file
def IRB.run_config
if @CONF[:RC]
begin
- load rc_file
- rescue LoadError, Errno::ENOENT
- rescue # StandardError, ScriptError
- print "load error: #{rc_file}\n"
- print $!.class, ": ", $!, "\n"
- for err in $@[0, $@.size - 2]
- print "\t", err, "\n"
- end
+ file = rc_file
+ # Because rc_file always returns `HOME/.irbrc` even if no rc file is present, we can't warn users about missing rc files.
+ # Otherwise, it'd be very noisy.
+ load file if File.exist?(file)
+ rescue StandardError, ScriptError => e
+ warn "Error loading RC file '#{file}':\n#{e.full_message(highlight: false)}"
end
end
end
@@ -418,7 +416,7 @@ module IRB # :nodoc:
end
case rc_file = @CONF[:RC_NAME_GENERATOR].call(ext)
when String
- return rc_file
+ rc_file
else
fail IllegalRCNameGenerator
end
diff --git a/test/irb/test_init.rb b/test/irb/test_init.rb
index b6a8f5529b..7d11b5b507 100644
--- a/test/irb/test_init.rb
+++ b/test/irb/test_init.rb
@@ -218,4 +218,44 @@ module TestIRB
ARGV.replace(orig)
end
end
+
+ class InitIntegrationTest < IntegrationTestCase
+ def test_load_error_in_rc_file_is_warned
+ write_rc <<~'IRBRC'
+ require "file_that_does_not_exist"
+ IRBRC
+
+ write_ruby <<~'RUBY'
+ binding.irb
+ RUBY
+
+ output = run_ruby_file do
+ type "'foobar'"
+ type "exit"
+ end
+
+ # IRB session should still be started
+ assert_includes output, "foobar"
+ assert_includes output, 'cannot load such file -- file_that_does_not_exist (LoadError)'
+ end
+
+ def test_normal_errors_in_rc_file_is_warned
+ write_rc <<~'IRBRC'
+ raise "I'm an error"
+ IRBRC
+
+ write_ruby <<~'RUBY'
+ binding.irb
+ RUBY
+
+ output = run_ruby_file do
+ type "'foobar'"
+ type "exit"
+ end
+
+ # IRB session should still be started
+ assert_includes output, "foobar"
+ assert_includes output, 'I\'m an error (RuntimeError)'
+ end
+ end
end