diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2025-01-31 19:25:47 +0100 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-02-14 16:13:27 +0900 |
| commit | a64c697b22f5ebb01d0a87fc5b24ae7a78398247 (patch) | |
| tree | 763a25b53a6b7a78044a924d149d70ff210c357e /lib | |
| parent | 061d8133ce7f23894abdd62e06797a3a1e9988f9 (diff) | |
[rubygems/rubygems] Refactor SpecSet to not need reset
https://github.com/rubygems/rubygems/commit/55af558124
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/bundler/spec_set.rb | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb index 9586521b27..69dee36145 100644 --- a/lib/bundler/spec_set.rb +++ b/lib/bundler/spec_set.rb @@ -83,15 +83,11 @@ module Bundler end def []=(key, value) - @specs << value - - reset! + add_spec(value) end def delete(specs) - Array(specs).each {|spec| @specs.delete(spec) } - - reset! + Array(specs).each {|spec| remove_spec(spec) } end def sort! @@ -168,8 +164,10 @@ module Bundler def delete_by_name(name) @specs.reject! {|spec| spec.name == name } + @sorted&.reject! {|spec| spec.name == name } + return if @lookup.nil? - reset! + @lookup[name] = nil end def version_for(name) @@ -248,11 +246,6 @@ module Bundler @materializations.filter_map(&:materialized_spec) end - def reset! - @sorted = nil - @lookup = nil - end - def complete_platform(platform) new_specs = [] @@ -272,9 +265,7 @@ module Bundler end if valid_platform && new_specs.any? - @specs.concat(new_specs) - - reset! + new_specs.each {|spec| add_spec(spec) } end valid_platform @@ -311,8 +302,7 @@ module Bundler @lookup ||= begin lookup = {} @specs.each do |s| - lookup[s.name] ||= [] - lookup[s.name] << s + index_spec(lookup, s.name, s) end lookup end @@ -333,5 +323,36 @@ module Bundler specs_for_name.each {|s2| yield s2 } end end + + def add_spec(spec) + @specs << spec + + name = spec.name + + @sorted&.insert(@sorted.bsearch_index {|s| s.name >= name } || @sorted.size, spec) + return if @lookup.nil? + + index_spec(@lookup, name, spec) + end + + def remove_spec(spec) + @specs.delete(spec) + @sorted&.delete(spec) + return if @lookup.nil? + + indexed_specs = @lookup[spec.name] + return unless indexed_specs + + if indexed_specs.size > 1 + @lookup[spec.name].delete(spec) + else + @lookup[spec.name] = nil + end + end + + def index_spec(hash, key, value) + hash[key] ||= [] + hash[key] << value + end end end |
