aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorJack Nagel2012-07-09 23:00:40 -0500
committerJack Nagel2012-08-18 11:12:07 -0500
commit966f555e655e652537785d4141c4c3cd88cbc576 (patch)
tree55f72f5792ea8547a38d1f7ec62b4f60d04144ed /Library
parent0da83e61587b973a70d85983348fb071da1e5ab8 (diff)
downloadhomebrew-966f555e655e652537785d4141c4c3cd88cbc576.tar.bz2
Initial version comparison implementation
Signed-off-by: Jack Nagel <jacknagel@gmail.com>
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/test/test_versions.rb18
-rw-r--r--Library/Homebrew/version.rb20
2 files changed, 36 insertions, 2 deletions
diff --git a/Library/Homebrew/test/test_versions.rb b/Library/Homebrew/test/test_versions.rb
index 24569ebc5..4792ac85d 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 f03510a68..c10863476 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