Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[rubygems/rubygems] Enhance error handling when loading the rubygems/…
…defaults/operating_system file When loading `rubygems/defaults/operating_system` - we want to keep it silent if the raised exception is a LoadError - we want to print a message in other cases and ask users to report the issue to their OS support. Ruby 3 comes with special error handling for loading `rubygems` and it will show a warning when LoadError exception raised for requiring 'rubygem'. Because of that, we decided to leave the LoadError scenario as it is. Reference: https://github.com/ruby/ruby/blob/d1998d8767affe58be0bd09ec536dae9198a7fbd/gem_prelude.rb#L1-L5 rubygems/rubygems@0a97e12fe1
- Loading branch information
1 parent
9fa5c4c
commit aafc615
Showing
2 changed files
with
41 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
require_relative 'helper' | ||
|
||
class GemTest < Gem::TestCase | ||
def test_rubygems_normal_behaviour | ||
_ = Gem::Util.popen(*ruby_with_rubygems_in_load_path, '-e', "'require \"rubygems\"'", {:err => [:child, :out]}).strip | ||
assert $?.success? | ||
end | ||
|
||
def test_operating_system_other_exceptions | ||
path = util_install_operating_system_rb <<-RUBY | ||
intentional synt'ax error | ||
RUBY | ||
|
||
output = Gem::Util.popen(*ruby_with_rubygems_and_fake_operating_system_in_load_path(path), '-e', "'require \"rubygems\"'", {:err => [:child, :out]}).strip | ||
assert !$?.success? | ||
assert_includes output, "This is not expected so please report this issue to your OS support and ask for help" | ||
end | ||
|
||
private | ||
|
||
def util_install_operating_system_rb(content) | ||
dir_lib = Dir.mktmpdir("test_operating_system_lib", @tempdir) | ||
dir_lib_arg = File.join dir_lib | ||
|
||
dir_lib_rubygems_defaults_arg = File.join dir_lib_arg, "lib", "rubygems", "defaults" | ||
FileUtils.mkdir_p dir_lib_rubygems_defaults_arg | ||
|
||
operating_system_rb = File.join dir_lib_rubygems_defaults_arg, "operating_system.rb" | ||
|
||
File.open(operating_system_rb, 'w') {|f| f.write content } | ||
|
||
File.join dir_lib_arg, "lib" | ||
end | ||
|
||
def ruby_with_rubygems_and_fake_operating_system_in_load_path(operating_system_path) | ||
[Gem.ruby, "-I", operating_system_path, "-I" , $LOAD_PATH.find{|p| p == File.dirname($LOADED_FEATURES.find{|f| f.end_with?("/rubygems.rb") }) }] | ||
end | ||
end |