brew/Library/Homebrew/version.rb

208 lines
4.9 KiB
Ruby
Raw Normal View History

class VersionElement
include Comparable
def initialize elem
elem = elem.to_s.downcase
@elem = case elem
when /\d+/ then elem.to_i
when 'a', 'alpha' then 'alpha'
when 'b', 'beta' then 'beta'
else elem
end
end
2013-04-15 15:00:57 -05:00
ZERO = VersionElement.new(0)
def <=>(other)
return unless other.is_a? VersionElement
return -1 if string? and other.numeric?
return 1 if numeric? and other.string?
return elem <=> other.elem
end
def to_s
@elem.to_s
end
protected
attr_reader :elem
def string?
elem.is_a? String
end
def numeric?
elem.is_a? Numeric
end
end
2012-07-09 22:51:10 -05:00
class Version
include Comparable
2012-07-10 16:10:16 -05:00
def initialize val, detected=false
@version = val.to_s
2012-07-10 16:10:16 -05:00
@detected_from_url = detected
end
def detected_from_url?
@detected_from_url
2012-07-09 22:51:10 -05:00
end
def head?
@version == 'HEAD'
end
def devel?
alpha? or beta? or rc?
end
def alpha?
to_a.any? { |e| e.to_s == 'alpha' }
end
def beta?
to_a.any? { |e| e.to_s == 'beta' }
end
def rc?
to_a.any? { |e| e.to_s == 'rc' }
2012-07-09 22:51:10 -05:00
end
def <=>(other)
# Return nil if objects aren't comparable
return unless other.is_a? Version
# Versions are equal if both are HEAD
return 0 if head? and other.head?
# HEAD is greater than any numerical version
return 1 if head? and not other.head?
return -1 if not head? and other.head?
stuple, otuple = to_a, other.to_a
2013-04-15 15:00:57 -05:00
slen, olen = stuple.length, otuple.length
2013-04-15 15:00:57 -05:00
max = [slen, olen].max
2013-04-15 15:00:57 -05:00
stuple.fill(VersionElement::ZERO, slen, max - slen)
otuple.fill(VersionElement::ZERO, olen, max - olen)
stuple <=> otuple
2012-07-09 22:51:10 -05:00
end
def to_s
2013-05-19 20:51:25 -05:00
@version.dup
2012-07-09 22:51:10 -05:00
end
alias_method :to_str, :to_s
protected
def to_a
2013-05-06 16:52:26 -05:00
@array ||= @version.scan(/\d+|[a-zA-Z]+/).map! { |e| VersionElement.new(e) }
end
2013-02-06 22:25:02 -06:00
def self.parse spec
version = _parse(spec)
Version.new(version, true) unless version.nil?
end
def self._parse spec
spec = Pathname.new(spec) unless spec.is_a? Pathname
spec_s = spec.to_s
stem = if spec.directory?
spec.basename.to_s
elsif %r[((?:sourceforge.net|sf.net)/.*)/download$].match(spec_s)
Pathname.new(spec.dirname).stem
else
spec.stem
end
2013-04-27 15:21:05 -05:00
# GitHub tarballs
# e.g. https://github.com/foo/bar/tarball/v1.2.3
# e.g. https://github.com/sam-github/libnet/tarball/libnet-1.1.4
# e.g. https://github.com/isaacs/npm/tarball/v0.2.5-1
# e.g. https://github.com/petdance/ack/tarball/1.93_02
2013-04-27 15:21:05 -05:00
m = %r[github.com/.+/(?:zip|tar)ball/(?:v|\w+-)?((?:\d+[-._])+\d*)$].match(spec_s)
return m.captures.first unless m.nil?
# e.g. https://github.com/erlang/otp/tarball/OTP_R15B01 (erlang style)
m = /[-_]([Rr]\d+[AaBb]\d*(?:-\d+)?)/.match(spec_s)
return m.captures.first unless m.nil?
# e.g. boost_1_39_0
2013-04-27 15:21:06 -05:00
m = /((?:\d+_)+\d+)$/.match(stem)
return m.captures.first.gsub('_', '.') unless m.nil?
# e.g. foobar-4.5.1-1
# e.g. ruby-1.9.1-p243
2013-04-27 15:21:06 -05:00
m = /-((?:\d+\.)*\d\.\d+-(?:p|rc|RC)?\d+)(?:[-._](?:bin|dist|stable|src|sources))?$/.match(stem)
return m.captures.first unless m.nil?
# e.g. lame-398-1
2013-04-27 15:21:06 -05:00
m = /-((?:\d)+-\d)/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar-4.5.1
2013-04-27 15:21:06 -05:00
m = /-((?:\d+\.)*\d+)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar-4.5.1b
2013-04-27 15:21:06 -05:00
m = /-((?:\d+\.)*\d+(?:[abc]|rc|RC)\d*)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar-4.5.0-beta1, or foobar-4.50-beta
2013-04-27 15:21:06 -05:00
m = /-((?:\d+\.)*\d+-beta\d*)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar4.5.1
2013-04-27 15:21:06 -05:00
m = /((?:\d+\.)*\d+)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. foobar-4.5.0-bin
2013-04-27 15:21:06 -05:00
m = /-((?:\d+\.)+\d+[abc]?)[-._](?:bin|dist|stable|src|sources?)$/.match(stem)
return m.captures.first unless m.nil?
# e.g. dash_0.5.5.1.orig.tar.gz (Debian style)
2013-04-27 15:21:06 -05:00
m = /_((?:\d+\.)+\d+[abc]?)[.]orig$/.match(stem)
return m.captures.first unless m.nil?
# e.g. http://www.openssl.org/source/openssl-0.9.8s.tar.gz
m = /-([^-]+)/.match(stem)
return m.captures.first unless m.nil?
# e.g. astyle_1.23_macosx.tar.gz
m = /_([^_]+)/.match(stem)
return m.captures.first unless m.nil?
# e.g. http://mirrors.jenkins-ci.org/war/1.486/jenkins.war
m = /\/(\d\.\d+)\//.match(spec_s)
return m.captures.first unless m.nil?
2013-01-27 22:34:53 +00:00
# e.g. http://www.ijg.org/files/jpegsrc.v8d.tar.gz
m = /\.v(\d+[a-z]?)/.match(stem)
return m.captures.first unless m.nil?
2012-07-09 22:51:10 -05:00
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