Skip to content

Commit 8723c8b

Browse files
Edouard-chinmatzbot
authored andcommitted
[ruby/rubygems] Fix Bundler crashing when installing very old gems:
- ### Problem There is a regression where bundler can longer install gems that were packaged a long time ago, like the [memoize gem](https://rubygems.org/gems/memoize). Bundler will crash with such error: ``` Installing memoize 1.3.1 --- ERROR REPORT TEMPLATE ------------------------------------------------------- NoMethodError: undefined method 'as_list' for nil /Users/edouard/src/opensource/rubygems/lib/rubygems/dependency.rb:146:in 'Gem::Dependency#requirements_list' ``` ### Context These very old gems were packaged at the time were a `Gem::Dependency` had no ivars `requirement`. This is what the dumped gemspec looks like: ``` dependencies: - !ruby/object:Gem::Dependency name: test-unit type: :development version_requirement: version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: 2.0.2 version: ``` As opposed to a gem that was packaged more recently: ``` - !ruby/object:Gem::Dependency name: minitest-global_expectations requirement: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - ">=" - !ruby/object:Gem::Version version: '0' ``` The change we made in ruby/rubygems@cbe57bb#diff-5ccc8aa468df013cc970580e88642417da12284da6529a4885b9abf447ae95edL529 broke old gem installation. ### Solution If `requirement` isn't set in the hash, look for `version_requirements` instead. ruby/rubygems@cfd8b20692
1 parent 4c6c02d commit 8723c8b

2 files changed

Lines changed: 21 additions & 1 deletion

File tree

lib/rubygems/yaml_serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ def build_dependency(node)
573573
d = Gem::Dependency.allocate
574574
d.instance_variable_set(:@name, hash["name"])
575575

576-
d.instance_variable_set(:@requirement, hash["requirement"])
576+
d.instance_variable_set(:@requirement, hash["requirement"] || hash["version_requirements"])
577577

578578
type = hash["type"]
579579
type = type ? type.to_s.sub(/^:/, "").to_sym : :runtime

test/rubygems/test_gem_safe_yaml.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -921,6 +921,26 @@ def test_load_version_requirement_old_tag
921921
assert_equal [[">=", Gem::Version.new("1.0")]], req.requirements
922922
end
923923

924+
def test_load_dependency_version_version_requirement_old_tag
925+
yaml = <<~YAML
926+
- !ruby/object:Gem::Dependency
927+
name: test-unit
928+
type: :development
929+
version_requirement:
930+
version_requirements: !ruby/object:Gem::Requirement
931+
requirements:
932+
- - ">="
933+
- !ruby/object:Gem::Version
934+
version: 2.0.2
935+
version:
936+
YAML
937+
938+
deps = yaml_load(yaml, permitted_classes: Gem::SafeYAML::PERMITTED_CLASSES)
939+
assert_not_nil(deps.first)
940+
941+
assert_equal [[">=", Gem::Version.new("2.0.2")]], deps.first.requirement.requirements
942+
end
943+
924944
def test_load_platform_from_value_field
925945
yaml = "!ruby/object:Gem::Platform\nvalue: x86-linux\n"
926946
plat = yaml_load(yaml, permitted_classes: Gem::SafeYAML::PERMITTED_CLASSES)

0 commit comments

Comments
 (0)