From 956c1d653aee7b82d68c264fe5418723808ff662 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Mon, 9 Jul 2012 23:00:40 -0500 Subject: [PATCH] Initial version comparison implementation Signed-off-by: Jack Nagel --- Library/Homebrew/test/test_versions.rb | 18 +++++++++++++++++- Library/Homebrew/version.rb | 20 +++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Library/Homebrew/test/test_versions.rb b/Library/Homebrew/test/test_versions.rb index 24569ebc59..4792ac85d0 100644 --- a/Library/Homebrew/test/test_versions.rb +++ b/Library/Homebrew/test/test_versions.rb @@ -11,6 +11,10 @@ module VersionAssertions def assert_version_nil url assert_nil Version.parse(url) end + + def assert_comparison a, comparison, b + eval "assert Version.new(a) #{comparison} Version.new(b)" + end end class TestBadVersion < TestBall @@ -21,7 +25,19 @@ class TestBadVersion < TestBall end end -class VersionTests < Test::Unit::TestCase +class VersionComparisonTests < Test::Unit::TestCase + include VersionAssertions + + def test_version_comparisons + assert_comparison '0.1', '==', '0.1.0' + assert_comparison '0.1', '!=', '0.2' + assert_comparison '1.2.3', '>', '1.2.2' + assert_comparison '1.2.3-p34', '>', '1.2.3-p33' + assert_comparison '1.2.4', '<', '1.2.4.1' + end +end + +class VersionParsingTests < Test::Unit::TestCase include VersionAssertions def test_pathname_version diff --git a/Library/Homebrew/version.rb b/Library/Homebrew/version.rb index f03510a688..c108634761 100644 --- a/Library/Homebrew/version.rb +++ b/Library/Homebrew/version.rb @@ -6,12 +6,30 @@ class Version @version = val.to_s.strip end + def head? + @version == 'HEAD' + end + def nums @version.scan(/\d+/).map { |d| d.to_i } end def <=>(other) - @version <=> other.version + return nil unless other.is_a? Version + return 0 if self.head? and other.head? + return 1 if self.head? and not other.head? + return -1 if not self.head? and other.head? + return 1 if other.nil? + + snums = self.nums + onums = other.nums + + count = [snums.length, onums.length].max + + snums.fill(0, snums.length, count - snums.length) + onums.fill(0, onums.length, count - onums.length) + + snums <=> onums end def to_s