[rubygems/rubygems] Fix manifest in gem package using incorrect platform sometimes

If a gem package is built from a specification whose platform has been
modified, it will include metadata using the old platform.

This change should fix the problem by making sure `original_platform` is
always properly set.

https://github.com/rubygems/rubygems/commit/ecd5cd4547
This commit is contained in:
David Rodríguez 2024-10-30 22:27:37 +01:00 committed by git
parent 8c184885b0
commit 350baed6a9
2 changed files with 35 additions and 13 deletions

View File

@ -464,10 +464,7 @@ class Gem::Specification < Gem::BasicSpecification
# spec.platform = Gem::Platform.local
def platform=(platform)
if @original_platform.nil? ||
@original_platform == Gem::Platform::RUBY
@original_platform = platform
end
@original_platform = platform
case platform
when Gem::Platform::CURRENT then
@ -1308,7 +1305,7 @@ class Gem::Specification < Gem::BasicSpecification
spec.instance_variable_set :@summary, array[5]
spec.instance_variable_set :@required_ruby_version, array[6]
spec.instance_variable_set :@required_rubygems_version, array[7]
spec.instance_variable_set :@original_platform, array[8]
spec.platform = array[8]
spec.instance_variable_set :@dependencies, array[9]
# offset due to rubyforge_project removal
spec.instance_variable_set :@email, array[11]
@ -1316,8 +1313,6 @@ class Gem::Specification < Gem::BasicSpecification
spec.instance_variable_set :@description, array[13]
spec.instance_variable_set :@homepage, array[14]
spec.instance_variable_set :@has_rdoc, array[15]
spec.instance_variable_set :@new_platform, array[16]
spec.instance_variable_set :@platform, array[16].to_s
spec.instance_variable_set :@licenses, [array[17]]
spec.instance_variable_set :@metadata, array[18]
spec.instance_variable_set :@loaded, false
@ -1813,15 +1808,16 @@ class Gem::Specification < Gem::BasicSpecification
def encode_with(coder) # :nodoc:
coder.add "name", @name
coder.add "version", @version
platform = case @original_platform
platform = case @new_platform
when nil, "" then
"ruby"
when String then
@original_platform
@new_platform
else
@original_platform.to_s
@new_platform.to_s
end
coder.add "platform", platform
coder.add "original_platform", @original_platform.to_s if platform != @original_platform.to_s
attributes = @@attributes.map(&:to_s) - %w[name version platform]
attributes.each do |name|
@ -2626,13 +2622,12 @@ class Gem::Specification < Gem::BasicSpecification
when "date"
# Force Date to go through the extra coerce logic in date=
self.date = val
when "platform"
self.platform = val
else
instance_variable_set "@#{ivar}", val
end
end
@original_platform = @platform # for backwards compatibility
self.platform = Gem::Platform.new @platform
end
##

View File

@ -438,6 +438,33 @@ class TestGemPackage < Gem::Package::TarTestCase
assert_equal %w[lib/code.rb], reader.contents
end
def test_build_modified_platform
spec = quick_gem "a", "1" do |s|
s.files = %w[lib/code.rb]
s.platform = Gem::Platform.new "x86_64-linux"
end
spec.platform = Gem::Platform.new "java"
FileUtils.mkdir "lib"
File.open "lib/code.rb", "w" do |io|
io.write "# lib/code.rb"
end
package = Gem::Package.new spec.file_name
package.spec = spec
package.build
assert_path_exist spec.file_name
reader = Gem::Package.new spec.file_name
assert reader.verify
assert_equal spec, reader.spec
end
def test_raw_spec
data_tgz = util_tar_gz {}