aboutsummaryrefslogtreecommitdiffstats
path: root/Library
diff options
context:
space:
mode:
authorJack Nagel2012-07-10 21:45:17 -0500
committerJack Nagel2012-08-18 11:12:09 -0500
commitdb7a800130a0fdfb0fa325d73846a7af207286a2 (patch)
tree9ef71407041c9425783164caead13e465de64581 /Library
parente53bb4f18bf932fa14f0187ecdf115bc35c82145 (diff)
downloadhomebrew-db7a800130a0fdfb0fa325d73846a7af207286a2.tar.bz2
Add support for custom version schemes
A version scheme is a class that inherits from Version and reimplements Version#<=>. This will allow formulae to specify a custom comparison method that will be used instead of the default, for cases where the default is insufficient.
Diffstat (limited to 'Library')
-rw-r--r--Library/Homebrew/formula_support.rb13
-rw-r--r--Library/Homebrew/test/test_formula.rb7
-rw-r--r--Library/Homebrew/test/testball.rb14
-rw-r--r--Library/Homebrew/version.rb21
4 files changed, 50 insertions, 5 deletions
diff --git a/Library/Homebrew/formula_support.rb b/Library/Homebrew/formula_support.rb
index 5c957f422..ec47639e3 100644
--- a/Library/Homebrew/formula_support.rb
+++ b/Library/Homebrew/formula_support.rb
@@ -52,11 +52,14 @@ class SoftwareSpec
end
def version val=nil
- if val.nil?
- @version ||= Version.parse(@url)
- else
- @version = Version.new(val)
- end
+ @version ||= case val
+ when nil then Version.parse(@url)
+ when Hash
+ key, value = val.shift
+ scheme = VersionSchemeDetector.new(value).detect
+ scheme.new(key)
+ else Version.new(val)
+ end
end
def mirror val
diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb
index 4f9bb3930..5c6b78772 100644
--- a/Library/Homebrew/test/test_formula.rb
+++ b/Library/Homebrew/test/test_formula.rb
@@ -278,4 +278,11 @@ class FormulaTests < Test::Unit::TestCase
when :mountainlion then '8badf00d8badf00d8badf00d8badf00d8badf00d'
end, f.bottle.checksum.hexdigest
end
+
+ def test_custom_version_scheme
+ f = CustomVersionSchemeTestBall.new
+
+ assert_version_equal '1.0', f.version
+ assert_instance_of CustomVersionScheme, f.version
+ end
end
diff --git a/Library/Homebrew/test/testball.rb b/Library/Homebrew/test/testball.rb
index c7118d3ee..8e4c745d3 100644
--- a/Library/Homebrew/test/testball.rb
+++ b/Library/Homebrew/test/testball.rb
@@ -271,3 +271,17 @@ class RevisedBottleSpecTestBall < Formula
super "revisedbottlespectestball"
end
end
+
+class CustomVersionScheme < Version
+end
+
+class CustomVersionSchemeTestBall < Formula
+ homepage 'http://example.com'
+ url 'file:///foo.com/testball-0.1.tbz'
+ sha1 '482e737739d946b7c8cbaf127d9ee9c148b999f5'
+ version '1.0' => CustomVersionScheme
+
+ def initialize name=nil
+ super "customversionschemetestball"
+ end
+end
diff --git a/Library/Homebrew/version.rb b/Library/Homebrew/version.rb
index 878832f67..2591f74e3 100644
--- a/Library/Homebrew/version.rb
+++ b/Library/Homebrew/version.rb
@@ -126,3 +126,24 @@ class Version
return m.captures.first unless m.nil?
end
end
+
+class VersionSchemeDetector
+ def initialize scheme
+ @scheme = scheme
+ end
+
+ def detect
+ if @scheme.is_a? Class and @scheme.ancestors.include? Version
+ @scheme
+ elsif @scheme.is_a? Symbol then detect_from_symbol
+ else
+ raise "Unknown version scheme #{@scheme} was requested."
+ end
+ end
+
+ private
+
+ def detect_from_symbol
+ raise "Unknown version scheme #{@scheme} was requested."
+ end
+end