diff --git a/lib/irb/command/load.rb b/lib/irb/command/load.rb index 36c6dbbad..983eeba61 100644 --- a/lib/irb/command/load.rb +++ b/lib/irb/command/load.rb @@ -45,7 +45,7 @@ def execute(arg) def execute_internal(file_name = nil) raise_cmd_argument_error unless file_name - rex = Regexp.new("\\A#{Regexp.escape(file_name)}(?:\\.o|\\.rb)?\\z") + rex = Regexp.new("(?:\\A|/)#{Regexp.escape(file_name)}(?:\\.o|\\.rb)?\\z") return false if $".find{|f| f =~ rex} case file_name diff --git a/test/irb/test_command.rb b/test/irb/test_command.rb index 22b7c857c..73905e66c 100644 --- a/test/irb/test_command.rb +++ b/test/irb/test_command.rb @@ -473,6 +473,27 @@ def test_irb_require_file_matches_exact_name assert_match(/foo_loaded/, out) assert_match(/foo2_loaded/, out) end + + def test_irb_require_skips_file_already_loaded_by_require + File.write("#{@tmpdir}/irb_require_probe.rb", "$irb_require_probe_count += 1\n") + File.write("#{@tmpdir}/probe.rb", "'probe_loaded'\n") + File.write("#{@tmpdir}/irb_require.rb", "'prefix_loaded'\n") + + out, err = execute_lines( + "$LOAD_PATH.unshift '#{@tmpdir}'\n", + "$irb_require_probe_count = 0\n", + "require 'irb_require_probe'\n", + "irb_require 'irb_require_probe'\n", + "$irb_require_probe_count\n", + "irb_require 'probe'\n", + "irb_require 'irb_require'\n", + ) + + assert_empty(err) + assert_match(/=> 1\n/, out) + assert_match(/probe_loaded/, out) + assert_match(/prefix_loaded/, out) + end end class WorkspaceCommandTestCase < CommandTestCase