diff --git a/Library/Homebrew/formula_support.rb b/Library/Homebrew/formula_support.rb index 5c957f422a..ec47639e38 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 4f9bb39309..5c6b787720 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 c7118d3ee7..8e4c745d32 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 878832f675..2591f74e36 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