From 9e0e706e8263911335f031b07e72797fc54cd57f Mon Sep 17 00:00:00 2001 From: eileencodes Date: Mon, 17 Nov 2025 16:38:46 -0500 Subject: [PATCH] Remove `verify_gz` This PR removes the `#verify_gz` method because it is redunant and unnecessary. Previously the `data.tar.gz` would get read twice for every file - once in `verify_gz` and once in `extract_files`. The `extract_files` method verifies the `data.tar.gz` when it reads it, and raises an error if unzipping it fails. The `verify_gz` code can be seen in some profiles as a hotspot - although not major - as it accounts for between 9% and 17% of time, but only when the installation thread doesn't have native extensions or plugins. --- lib/rubygems/package.rb | 21 ++------------------- test/rubygems/test_gem_package.rb | 4 ++-- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb index 6b21ff1b9533..e6e078dce406 100644 --- a/lib/rubygems/package.rb +++ b/lib/rubygems/package.rb @@ -532,7 +532,7 @@ def normalize_path(pathname) # :nodoc: ## # Loads a Gem::Specification from the TarEntry +entry+ - def load_spec(entry) # :nodoc: + def load_spec_from_metadata(entry) # :nodoc: limit = 10 * 1024 * 1024 case entry.full_name when "metadata" then @@ -678,12 +678,7 @@ def verify_entry(entry) digest entry end - case file_name - when "metadata", "metadata.gz" then - load_spec entry - when "data.tar.gz" then - verify_gz entry - end + load_spec_from_metadata entry rescue StandardError warn "Exception while verifying #{@gem.path}" raise @@ -711,18 +706,6 @@ def verify_files(gem) end end - ## - # Verifies that +entry+ is a valid gzipped file. - - def verify_gz(entry) # :nodoc: - Zlib::GzipReader.wrap entry do |gzio| - # TODO: read into a buffer once zlib supports it - gzio.read 16_384 until gzio.eof? # gzip checksum verification - end - rescue Zlib::GzipFile::Error => e - raise Gem::Package::FormatError.new(e.message, entry.full_name) - end - if RUBY_ENGINE == "truffleruby" def copy_stream(src, dst, size) # :nodoc: dst.write src.read(size) diff --git a/test/rubygems/test_gem_package.rb b/test/rubygems/test_gem_package.rb index 2ad63acd03bb..0c214a232b76 100644 --- a/test/rubygems/test_gem_package.rb +++ b/test/rubygems/test_gem_package.rb @@ -858,7 +858,7 @@ def test_install_location_suffix "#{@destination} is not allowed", e.message) end - def test_load_spec + def test_load_spec_from_metadata entry = StringIO.new Gem::Util.gzip @spec.to_yaml def entry.full_name "metadata.gz" @@ -866,7 +866,7 @@ def entry.full_name package = Gem::Package.new "nonexistent.gem" - spec = package.load_spec entry + spec = package.load_spec_from_metadata entry assert_equal @spec, spec end