From 2c0c159a177905d38d4ce9ba9d0c918e5613a787 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Tue, 9 Aug 2016 08:07:42 -0700 Subject: [PATCH 1/2] Improved handling of Semver pre-release versions --- lib/cocoapods-core/version.rb | 25 ++++++++++++++++++------- spec/version_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/cocoapods-core/version.rb b/lib/cocoapods-core/version.rb index 9f6e96eb5..eadb48ecc 100644 --- a/lib/cocoapods-core/version.rb +++ b/lib/cocoapods-core/version.rb @@ -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 diff --git a/spec/version_spec.rb b/spec/version_spec.rb index 69ee093ee..c70d2d0d0 100644 --- a/spec/version_spec.rb +++ b/spec/version_spec.rb @@ -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') @@ -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 #-------------------------------------------------------------------------# From 9ce5578d807ca8293977ef6a1ac21f2834c423b5 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Tue, 9 Aug 2016 08:25:10 -0700 Subject: [PATCH 2/2] CHANGELOG entry --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f44199c0..165b44f91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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