summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2025-10-31 14:49:24 -0700
committergit <svn-admin@ruby-lang.org>2025-11-04 00:22:33 +0000
commit2c2eaa3103e5cf1cbfc2b16d9db975a9b8a0399a (patch)
treee6fc0bc1de5a32940647836df33c6b021c8b6c41
parentbac6a25ad3b6ed02ece11a2790cec3a2e6f8c8c9 (diff)
[ruby/rubygems] Fix constants in TAR to be frozen
I would like to use the tar implementation inside a Ractor, but two of the constants are not frozen. This patch freezes the constants so we can use it in a Ractor. https://github.com/ruby/rubygems/commit/0ff4790f4c
-rw-r--r--lib/rubygems/package/tar_header.rb8
-rw-r--r--test/rubygems/test_gem_package_tar_header.rb19
2 files changed, 23 insertions, 4 deletions
diff --git a/lib/rubygems/package/tar_header.rb b/lib/rubygems/package/tar_header.rb
index 0ebcbd789d..dd20d65080 100644
--- a/lib/rubygems/package/tar_header.rb
+++ b/lib/rubygems/package/tar_header.rb
@@ -56,7 +56,7 @@ class Gem::Package::TarHeader
##
# Pack format for a tar header
- PACK_FORMAT = "a100" + # name
+ PACK_FORMAT = ("a100" + # name
"a8" + # mode
"a8" + # uid
"a8" + # gid
@@ -71,12 +71,12 @@ class Gem::Package::TarHeader
"a32" + # gname
"a8" + # devmajor
"a8" + # devminor
- "a155" # prefix
+ "a155").freeze # prefix
##
# Unpack format for a tar header
- UNPACK_FORMAT = "A100" + # name
+ UNPACK_FORMAT = ("A100" + # name
"A8" + # mode
"A8" + # uid
"A8" + # gid
@@ -91,7 +91,7 @@ class Gem::Package::TarHeader
"A32" + # gname
"A8" + # devmajor
"A8" + # devminor
- "A155" # prefix
+ "A155").freeze # prefix
attr_reader(*FIELDS)
diff --git a/test/rubygems/test_gem_package_tar_header.rb b/test/rubygems/test_gem_package_tar_header.rb
index a3f95bb770..34f92967e9 100644
--- a/test/rubygems/test_gem_package_tar_header.rb
+++ b/test/rubygems/test_gem_package_tar_header.rb
@@ -26,6 +26,25 @@ class TestGemPackageTarHeader < Gem::Package::TarTestCase
@tar_header = Gem::Package::TarHeader.new header
end
+ def test_decode_in_ractor
+ new_header = Ractor.new(@tar_header.to_s) do |str|
+ Gem::Package::TarHeader.from StringIO.new str
+ end.value
+
+ assert_headers_equal @tar_header, new_header
+ end if defined?(Ractor) && Ractor.instance_methods.include?(:value)
+
+ def test_encode_in_ractor
+ header_bytes = @tar_header.to_s
+
+ new_header = Ractor.new(header_bytes) do |str|
+ header = Gem::Package::TarHeader.from StringIO.new str
+ header.to_s
+ end.value
+
+ assert_headers_equal header_bytes, new_header
+ end if defined?(Ractor) && Ractor.instance_methods.include?(:value)
+
def test_self_from
io = TempIO.new @tar_header.to_s