[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.

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