Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved handling of Semver pre-release versions #350

Merged
merged 2 commits into from
Aug 11, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

##### Enhancements

* None.
* Improved comparison between Semver pre-release versions.
[Ben Asher](https://github.com/benasher44)
[#350](https://github.com/CocoaPods/Core/pull/350)

##### Bug Fixes

Expand Down
25 changes: 18 additions & 7 deletions lib/cocoapods-core/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -194,22 +194,33 @@ def compare_segments(other)
return unless other.is_a?(Pod::Version)
return 0 if @version == other.version

compare = proc do |segments, other_segments|
compare = proc do |segments, other_segments, is_pre_release|
limit = [segments.size, other_segments.size].max

(0..limit).each do |i|
lhs = segments[i] || 0
rhs = other_segments[i] || 0
lhs = segments[i]
rhs = other_segments[i]

next if lhs == rhs
# If it's pre-release and the first segment, then
# this is a special case because a segment missing
# means that one is not a pre-release version
if is_pre_release && i == 0
return 1 if lhs.nil?
return -1 if rhs.nil?
else
return -1 if lhs.nil?
return 1 if rhs.nil?
end

return lhs <=> rhs if lhs <=> rhs
return -1 if lhs.is_a?(String) && rhs.is_a?(Numeric)
return 1 if lhs.is_a?(Numeric) && rhs.is_a?(String)
return 1 if lhs.is_a?(String) && rhs.is_a?(Numeric)
return -1 if lhs.is_a?(Numeric) && rhs.is_a?(String)
end
end

compare[numeric_segments, other.numeric_segments]
compare[prerelease_segments, other.prerelease_segments]
compare[numeric_segments, other.numeric_segments, false]
compare[prerelease_segments, other.prerelease_segments, true]
0
end

Expand Down
21 changes: 21 additions & 0 deletions spec/version_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ module Pod
Version.new('1.alpha.2').patch.should == 0
end

it 'correctly makes basic version comparisons' do
Version.new('1.0.0').should.be < Version.new('2.0.0')
Version.new('1.0.0').should.be < Version.new('1.0.1')
Version.new('1.0.0').should.be < Version.new('1.1.0')
Version.new('1.1.0').should.be < Version.new('1.1.1')
end

it 'ignores missing numeric identifiers while comparing' do
Version.new('1.9.0-alpha').should.be < Version.new('1.9-beta')
Version.new('2.0.0-beta').should.be < Version.new('2.0-rc')
Expand All @@ -107,6 +114,20 @@ module Pod
Version.new('1.0-alpha').should.be < Version.new('1.0.0-alpha')
Version.new('1.1.1.1-alpha').should.be < Version.new('1.1.1.1.0-alpha')
end

it 'Follows semver when comparing between pre-release versions' do
# Example from section 11 on semver.org
Version.new('1.0.0-alpha').should.be < Version.new('1.0.0-alpha.1')
Version.new('1.0.0-alpha.1').should.be < Version.new('1.0.0-alpha.beta')
Version.new('1.0.0-alpha.beta').should.be < Version.new('1.0.0-beta')
Version.new('1.0.0-beta').should.be < Version.new('1.0.0-beta.2')
Version.new('1.0.0-beta.2').should.be < Version.new('1.0.0-beta.11')
Version.new('1.0.0-beta.11').should.be < Version.new('1.0.0-rc.1')
Version.new('1.0.0-rc.1').should.be < Version.new('1.0.0')

# Example from CocoaPods/CocoaPods#5718
Version.new('1.0-beta.8').should.be < Version.new('1.0-beta.8a')
end
end

#-------------------------------------------------------------------------#
Expand Down