[rubygems/rubygems] Skip nil-value keys to make metadata reproducible

Nil-value keys in a mapping end with a space or not depending on
libyaml versions, and result metadata are different per platforms.
This commit makes to skip such keys to make metadata reproducible
accross platforms.

https://github.com/rubygems/rubygems/commit/74b4db8d30
This commit is contained in:
Nobuyoshi Nakada 2023-11-01 23:45:48 +09:00 committed by git
parent d578684989
commit c8fb4f308b
3 changed files with 26 additions and 1 deletions

View File

@ -14,6 +14,10 @@ module Gem
@emitter.scalar str, nil, nil, false, true, quote
end
def visit_Hash(o)
super(o.dup.delete_if {|_, v| v.nil? })
end
# Noop this out so there are no anchors
def register(target, obj)
end

View File

@ -1890,7 +1890,8 @@ class Gem::Specification < Gem::BasicSpecification
attributes = @@attributes.map(&:to_s) - %w[name version platform]
attributes.each do |name|
coder.add name, instance_variable_get("@#{name}")
value = instance_variable_get("@#{name}")
coder.add name, value unless value.nil?
end
end

View File

@ -2517,6 +2517,26 @@ end
assert_match(/^platform: ruby$/, @a1.to_yaml)
end
def test_to_yaml_no_autorequire
yaml_str = @a1.to_yaml
refute_match(/^autorequire:/, yaml_str)
end
def test_to_yaml_no_signing_key
@a1.signing_key = nil
yaml_str = @a1.to_yaml
refute_match(/^signing_key:/, yaml_str)
end
def test_to_yaml_no_post_install_message
@a1.post_install_message = nil
yaml_str = @a1.to_yaml
refute_match(/^post_install_message:/, yaml_str)
end
def test_validate
util_setup_validate