diff options
author | Martin Emde <martin.emde@gmail.com> | 2023-10-10 17:27:34 -0700 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-10-11 22:18:46 +0000 |
commit | 9dcaa832592af0125ba6407a506b2b3953b2f81c (patch) | |
tree | d800a7e5a071196215783c1e1d40f586c2c8e6b6 /lib/rubygems/version.rb | |
parent | 8a8b23c0ccbb8450c99635c7be9ee871409ba17f (diff) |
[rubygems/rubygems] Avoid excess Arrays when partitioning Gem::Version.canonical_segments
https://github.com/rubygems/rubygems/commit/338c48f935
Diffstat (limited to 'lib/rubygems/version.rb')
-rw-r--r-- | lib/rubygems/version.rb | 40 |
1 files changed, 13 insertions, 27 deletions
diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb index 2abc423fdf..828a4ca1e0 100644 --- a/lib/rubygems/version.rb +++ b/lib/rubygems/version.rb @@ -388,31 +388,21 @@ class Gem::Version 0 end + # remove trailing zeros segments before first letter or at the end of the version def canonical_segments @canonical_segments ||= begin - numeric_segments, string_segments = _split_segments - canonical_segments = [] - - seen_non_zero = false - string_segments.reverse_each do |segment| - if seen_non_zero || (seen_non_zero = (segment != 0)) - canonical_segments << segment - end - end - seen_non_zero = false - numeric_segments.reverse_each do |segment| - if seen_non_zero || (seen_non_zero = (segment != 0)) - canonical_segments << segment - end - end - - canonical_segments.reverse! - canonical_segments.freeze + # remove trailing 0 segments, using dot or letter as anchor + # may leave a trailing dot which will be ignored by partition_segments + canonical_version = @version.sub(/(?<=[a-zA-Z.])[.0]+\z/, "") + # remove 0 segments before the first letter in a prerelease version + canonical_version.sub!(/(?<=\.|\A)[0.]+(?=[a-zA-Z])/, "") if prerelease? + partition_segments(canonical_version) end end def freeze prerelease? + _segments canonical_segments super end @@ -423,16 +413,12 @@ class Gem::Version # segments is lazy so it can pick up version values that come from # old marshaled versions, which don't go through marshal_load. # since this version object is cached in @@all, its @segments should be frozen - - @segments ||= @version.scan(/[0-9]+|[a-z]+/i).map! do |s| - /^\d+$/.match?(s) ? s.to_i : -s - end.freeze + @segments ||= partition_segments(@version) end - def _split_segments - string_start = _segments.index {|s| s.is_a?(String) } - string_segments = segments - numeric_segments = string_segments.slice!(0, string_start || string_segments.size) - [numeric_segments, string_segments] + def partition_segments(ver) + ver.scan(/\d+|[a-z]+/i).map! do |s| + /\A\d/.match?(s) ? s.to_i : -s + end.freeze end end |