mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[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: d1998d8767/gem_prelude.rb (L1-L5)
https://github.com/rubygems/rubygems/commit/0a97e12fe1
This commit is contained in:
parent
9fa5c4cd07
commit
aafc615b4a
Notes:
git
2021-08-31 19:07:10 +09:00
2 changed files with 41 additions and 0 deletions
|
@ -1331,6 +1331,9 @@ begin
|
||||||
|
|
||||||
require 'rubygems/defaults/operating_system'
|
require 'rubygems/defaults/operating_system'
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
|
# Ignored
|
||||||
|
rescue Exception => e
|
||||||
|
raise e.class, "#{e.message}\nThis is not expected so please report this issue to your OS support and ask for help."
|
||||||
end
|
end
|
||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
38
test/rubygems/test_rubygems.rb
Normal file
38
test/rubygems/test_rubygems.rb
Normal file
|
@ -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
|
Loading…
Add table
Reference in a new issue