| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  | class Version | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   include Comparable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class Token | 
					
						
							|  |  |  |     include Comparable | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     attr_reader :value | 
					
						
							| 
									
										
										
										
											2013-04-15 15:00:57 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     def initialize(value) | 
					
						
							|  |  |  |       @value = value | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def inspect | 
					
						
							| 
									
										
										
										
											2014-07-01 15:07:06 -05:00
										 |  |  |       "#<#{self.class.name} #{value.inspect}>" | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-06-05 23:30:55 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def to_s | 
					
						
							|  |  |  |       value.to_s | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class NullToken < Token | 
					
						
							|  |  |  |     def initialize(value=nil) | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when NumericToken | 
					
						
							|  |  |  |         other.value == 0 ? 0 : -1
 | 
					
						
							|  |  |  |       when AlphaToken, BetaToken, RCToken | 
					
						
							|  |  |  |         1
 | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         -1
 | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def inspect | 
					
						
							| 
									
										
										
										
											2014-07-01 15:07:06 -05:00
										 |  |  |       "#<#{self.class.name}>" | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   NULL_TOKEN = NullToken.new | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   class StringToken < Token | 
					
						
							| 
									
										
										
										
											2014-01-11 19:59:26 -06:00
										 |  |  |     PATTERN = /[a-z]+[0-9]*/i | 
					
						
							| 
									
										
										
										
											2013-01-15 18:20:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     def initialize(value) | 
					
						
							|  |  |  |       @value = value.to_s | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-15 18:20:52 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when StringToken | 
					
						
							|  |  |  |         value <=> other.value | 
					
						
							|  |  |  |       when NumericToken, NullToken | 
					
						
							|  |  |  |         -Integer(other <=> self) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class NumericToken < Token | 
					
						
							|  |  |  |     PATTERN = /[0-9]+/i | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def initialize(value) | 
					
						
							|  |  |  |       @value = value.to_i | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when NumericToken | 
					
						
							|  |  |  |         value <=> other.value | 
					
						
							|  |  |  |       when StringToken | 
					
						
							|  |  |  |         1
 | 
					
						
							|  |  |  |       when NullToken | 
					
						
							|  |  |  |         -Integer(other <=> self) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class CompositeToken < StringToken | 
					
						
							|  |  |  |     def rev | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |       value[/([0-9]+)/, 1] || "0" | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-07-09 22:51:10 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class AlphaToken < CompositeToken | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |     PATTERN = /a(?:lpha)?[0-9]*/i | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when AlphaToken | 
					
						
							|  |  |  |         rev <=> other.rev | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-07-10 16:10:16 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class BetaToken < CompositeToken | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |     PATTERN = /b(?:eta)?[0-9]*/i | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when BetaToken | 
					
						
							|  |  |  |         rev <=> other.rev | 
					
						
							|  |  |  |       when AlphaToken | 
					
						
							|  |  |  |         1
 | 
					
						
							|  |  |  |       when RCToken, PatchToken | 
					
						
							|  |  |  |         -1
 | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-07-09 22:51:10 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class RCToken < CompositeToken | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |     PATTERN = /rc[0-9]*/i | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when RCToken | 
					
						
							|  |  |  |         rev <=> other.rev | 
					
						
							|  |  |  |       when AlphaToken, BetaToken | 
					
						
							|  |  |  |         1
 | 
					
						
							|  |  |  |       when PatchToken | 
					
						
							|  |  |  |         -1
 | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-07-09 23:00:40 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   class PatchToken < CompositeToken | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |     PATTERN = /p[0-9]*/i | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def <=>(other) | 
					
						
							|  |  |  |       case other | 
					
						
							|  |  |  |       when PatchToken | 
					
						
							|  |  |  |         rev <=> other.rev | 
					
						
							|  |  |  |       when AlphaToken, BetaToken, RCToken | 
					
						
							|  |  |  |         1
 | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-03 11:19:57 -05:00
										 |  |  |   SCAN_PATTERN = Regexp.union( | 
					
						
							|  |  |  |     AlphaToken::PATTERN, | 
					
						
							|  |  |  |     BetaToken::PATTERN, | 
					
						
							|  |  |  |     RCToken::PATTERN, | 
					
						
							|  |  |  |     PatchToken::PATTERN, | 
					
						
							|  |  |  |     NumericToken::PATTERN, | 
					
						
							|  |  |  |     StringToken::PATTERN | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-28 21:17:12 -05:00
										 |  |  |   def self.detect(url, specs={}) | 
					
						
							|  |  |  |     if specs.has_key?(:tag) | 
					
						
							|  |  |  |       new(specs[:tag][/((?:\d+\.)*\d+)/, 1], true) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       parse(url) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   def initialize(val, detected=false) | 
					
						
							| 
									
										
										
										
											2013-10-25 17:29:36 -05:00
										 |  |  |     if val.respond_to?(:to_str) | 
					
						
							|  |  |  |       @version = val.to_str | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       raise TypeError, "Version value must be a string" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     @detected_from_url = detected | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   def detected_from_url? | 
					
						
							|  |  |  |     @detected_from_url | 
					
						
							| 
									
										
										
										
											2012-08-18 13:34:31 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   def head? | 
					
						
							|  |  |  |     @version == 'HEAD' | 
					
						
							| 
									
										
										
										
											2012-07-09 22:51:10 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def <=>(other) | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     return unless Version === other | 
					
						
							|  |  |  |     return 0 if head? && other.head? | 
					
						
							|  |  |  |     return 1 if head? && !other.head? | 
					
						
							|  |  |  |     return -1 if !head? && other.head? | 
					
						
							| 
									
										
										
										
											2012-07-09 23:00:40 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |     max = [tokens.length, other.tokens.length].max | 
					
						
							|  |  |  |     pad_to(max) <=> other.pad_to(max) | 
					
						
							| 
									
										
										
										
											2012-07-09 22:51:10 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-12-09 19:43:07 -06:00
										 |  |  |   alias_method :eql?, :== | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def hash | 
					
						
							|  |  |  |     @version.hash | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-07-09 22:51:10 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 11:59:33 -06:00
										 |  |  |   protected | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |   def begins_with_numeric? | 
					
						
							|  |  |  |     NumericToken === tokens.first | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   def pad_to(length) | 
					
						
							| 
									
										
										
										
											2013-07-24 19:44:27 -05:00
										 |  |  |     if begins_with_numeric? | 
					
						
							|  |  |  |       nums, rest = tokens.partition { |t| NumericToken === t } | 
					
						
							|  |  |  |       nums.fill(NULL_TOKEN, nums.length, length - tokens.length) | 
					
						
							|  |  |  |       nums.concat(rest) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       tokens.dup.fill(NULL_TOKEN, tokens.length, length - tokens.length) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def tokens | 
					
						
							|  |  |  |     @tokens ||= tokenize | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def tokenize | 
					
						
							| 
									
										
										
										
											2014-04-03 11:19:57 -05:00
										 |  |  |     @version.scan(SCAN_PATTERN).map! do |token| | 
					
						
							| 
									
										
										
										
											2013-06-05 21:52:48 -05:00
										 |  |  |       case token | 
					
						
							|  |  |  |       when /\A#{AlphaToken::PATTERN}\z/o   then AlphaToken | 
					
						
							|  |  |  |       when /\A#{BetaToken::PATTERN}\z/o    then BetaToken | 
					
						
							|  |  |  |       when /\A#{RCToken::PATTERN}\z/o      then RCToken | 
					
						
							|  |  |  |       when /\A#{PatchToken::PATTERN}\z/o   then PatchToken | 
					
						
							|  |  |  |       when /\A#{NumericToken::PATTERN}\z/o then NumericToken | 
					
						
							|  |  |  |       when /\A#{StringToken::PATTERN}\z/o  then StringToken | 
					
						
							|  |  |  |       end.new(token) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-07 11:59:33 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-06 22:25:02 -06:00
										 |  |  |   def self.parse spec | 
					
						
							|  |  |  |     version = _parse(spec) | 
					
						
							|  |  |  |     Version.new(version, true) unless version.nil? | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def self._parse spec | 
					
						
							|  |  |  |     spec = Pathname.new(spec) unless spec.is_a? Pathname | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-16 14:32:28 -05:00
										 |  |  |     spec_s = spec.to_s | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     stem = if spec.directory? | 
					
						
							|  |  |  |       spec.basename.to_s | 
					
						
							| 
									
										
										
										
											2013-04-16 14:32:28 -05:00
										 |  |  |     elsif %r[((?:sourceforge.net|sf.net)/.*)/download$].match(spec_s) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |       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 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     # 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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     return m.captures.first unless m.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-25 10:20:48 -07:00
										 |  |  |     # e.g. https://github.com/erlang/otp/tarball/OTP_R15B01 (erlang style) | 
					
						
							| 
									
										
										
										
											2013-06-03 20:52:21 +01:00
										 |  |  |     m = /[-_]([Rr]\d+[AaBb]\d*(?:-\d+)?)/.match(spec_s) | 
					
						
							| 
									
										
										
										
											2012-08-25 10:20:48 -07:00
										 |  |  |     return m.captures.first unless m.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     # e.g. boost_1_39_0 | 
					
						
							| 
									
										
										
										
											2013-04-27 15:21:06 -05:00
										 |  |  |     m = /((?:\d+_)+\d+)$/.match(stem) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     return m.captures.first unless m.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-25 10:20:48 -07:00
										 |  |  |     # e.g. http://www.openssl.org/source/openssl-0.9.8s.tar.gz | 
					
						
							| 
									
										
										
										
											2013-06-11 17:34:08 -05:00
										 |  |  |     m = /-v?([^-]+)/.match(stem) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:24:27 -05:00
										 |  |  |     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? | 
					
						
							| 
									
										
										
										
											2012-10-16 10:31:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # e.g. http://mirrors.jenkins-ci.org/war/1.486/jenkins.war | 
					
						
							| 
									
										
										
										
											2013-11-14 22:58:24 +00:00
										 |  |  |     m = /\/(\d\.\d+(\.\d)?)\//.match(spec_s) | 
					
						
							| 
									
										
										
										
											2012-10-16 10:31:03 +01:00
										 |  |  |     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 |