summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Dalessio <mike.dalessio@gmail.com>2024-01-30 08:05:51 -0500
committergit <svn-admin@ruby-lang.org>2024-02-02 21:38:04 +0000
commit66a6f2b15a8827f830db7bf8cf8c8ebba79fa237 (patch)
tree0f9dcb74a43437012b18fc8e174b9fd3c1fd3bd7
parentd2f004cf6a99564a59ed159c4963d199488665cd (diff)
[rubygems/rubygems] feat: Gem::Requirement#initialize_copy deep-copies @requirements
to avoid accidentally mutating the original's state when doing: ```ruby req2 = req.dup req2.concat([">= 3.3.22"]) ``` see https://github.com/rake-compiler/rake-compiler/pull/236 for a real-world use case that would be made simpler with this behavior. https://github.com/rubygems/rubygems/commit/8e0c03144e
-rw-r--r--lib/rubygems/requirement.rb5
-rw-r--r--test/rubygems/test_gem_requirement.rb8
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb
index 4ebafb065f..02543cb14a 100644
--- a/lib/rubygems/requirement.rb
+++ b/lib/rubygems/requirement.rb
@@ -284,6 +284,11 @@ class Gem::Requirement
def _tilde_requirements
@_tilde_requirements ||= _sorted_requirements.select {|r| r.first == "~>" }
end
+
+ def initialize_copy(other) # :nodoc:
+ @requirements = other.requirements.dup
+ super
+ end
end
class Gem::Version
diff --git a/test/rubygems/test_gem_requirement.rb b/test/rubygems/test_gem_requirement.rb
index 57d143180f..de0d11ec00 100644
--- a/test/rubygems/test_gem_requirement.rb
+++ b/test/rubygems/test_gem_requirement.rb
@@ -12,6 +12,14 @@ class TestGemRequirement < Gem::TestCase
assert_equal [[">=", v(1)], ["<", v(2)]], r.requirements
end
+ def test_initialize_copy
+ r = req("= 1.2")
+ r2 = r.dup
+
+ assert_equal r.requirements, r2.requirements
+ refute_same r.requirements, r2.requirements
+ end
+
def test_equals2
r = req "= 1.2"
assert_equal r, r.dup