| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | require 'tab' | 
					
						
							| 
									
										
										
										
											2013-10-18 12:56:51 -05:00
										 |  |  | require 'os/mac' | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | require 'extend/ARGV' | 
					
						
							| 
									
										
										
										
											2013-08-03 20:02:10 -07:00
										 |  |  | require 'bottle_version' | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-10 14:56:02 -05:00
										 |  |  | def bottle_filename options={} | 
					
						
							| 
									
										
										
										
											2013-12-08 16:39:59 -06:00
										 |  |  |   options = { :tag => bottle_tag }.merge(options) | 
					
						
							| 
									
										
										
										
											2014-03-10 14:56:02 -05:00
										 |  |  |   "#{options[:name]}-#{options[:version]}#{bottle_native_suffix(options)}" | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-25 11:31:57 -07:00
										 |  |  | def built_as_bottle? f | 
					
						
							| 
									
										
										
										
											2012-07-22 16:07:20 +01:00
										 |  |  |   return false unless f.installed? | 
					
						
							| 
									
										
										
										
											2012-08-25 11:31:57 -07:00
										 |  |  |   tab = Tab.for_keg(f.installed_prefix) | 
					
						
							| 
									
										
										
										
											2013-06-27 10:09:18 +01:00
										 |  |  |   tab.built_as_bottle | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-30 15:10:51 -05:00
										 |  |  | def bottle_file_outdated? f, file | 
					
						
							|  |  |  |   filename = file.basename.to_s | 
					
						
							| 
									
										
										
										
											2012-08-25 13:39:53 -07:00
										 |  |  |   return nil unless f and f.bottle and f.bottle.url \ | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:50 +00:00
										 |  |  |     and filename.match(bottle_regex) | 
					
						
							| 
									
										
										
										
											2012-04-30 15:10:51 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-06 14:11:44 -05:00
										 |  |  |   bottle_ext = filename[bottle_native_regex, 1] | 
					
						
							|  |  |  |   bottle_url_ext = f.bottle.url[bottle_native_regex, 1] | 
					
						
							| 
									
										
										
										
											2012-04-30 15:10:51 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   bottle_ext && bottle_url_ext && bottle_ext != bottle_url_ext | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-08 16:39:59 -06:00
										 |  |  | def bottle_native_suffix options={} | 
					
						
							|  |  |  |   options = { :tag => bottle_tag }.merge(options) | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  |   ".#{options[:tag]}#{bottle_suffix(options[:revision])}" | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-09 19:06:54 -08:00
										 |  |  | def bottle_suffix revision=nil | 
					
						
							|  |  |  |   revision = revision.to_i > 0 ? ".#{revision}" : "" | 
					
						
							|  |  |  |   ".bottle#{revision}.tar.gz" | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def bottle_native_regex | 
					
						
							| 
									
										
										
										
											2013-06-06 16:02:27 -05:00
										 |  |  |   /(\.#{bottle_tag}\.bottle\.(\d+\.)?tar\.gz)$/o | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def bottle_regex | 
					
						
							| 
									
										
										
										
											2012-07-05 20:29:31 -05:00
										 |  |  |   Pathname::BOTTLE_EXTNAME_RX | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-10 14:56:02 -05:00
										 |  |  | def bottle_url(root_url, filename_options={}) | 
					
						
							|  |  |  |   "#{root_url}/#{bottle_filename(filename_options)}" | 
					
						
							| 
									
										
										
										
											2012-03-18 20:37:10 +13:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2013-06-06 16:02:27 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | def bottle_tag | 
					
						
							| 
									
										
										
										
											2013-10-23 00:09:35 +01:00
										 |  |  |   if MacOS.version >= :lion | 
					
						
							| 
									
										
										
										
											2013-06-06 16:02:27 -05:00
										 |  |  |     MacOS.cat | 
					
						
							| 
									
										
										
										
											2013-10-23 00:09:35 +01:00
										 |  |  |   elsif MacOS.version == :snow_leopard | 
					
						
							| 
									
										
										
										
											2013-06-13 12:04:58 -05:00
										 |  |  |     Hardware::CPU.is_64_bit? ? :snow_leopard : :snow_leopard_32 | 
					
						
							| 
									
										
										
										
											2013-06-06 16:02:27 -05:00
										 |  |  |   else | 
					
						
							| 
									
										
										
										
											2013-10-21 13:46:09 -07:00
										 |  |  |     # Return, e.g., :tiger_g3, :leopard_g5_64, :leopard_64 (which is Intel) | 
					
						
							|  |  |  |     if Hardware::CPU.type == :ppc | 
					
						
							|  |  |  |       tag = "#{MacOS.cat}_#{Hardware::CPU.family}".to_sym | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       tag = MacOS.cat | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     MacOS.prefer_64_bit? ? "#{tag}_64".to_sym : tag | 
					
						
							| 
									
										
										
										
											2013-06-06 16:02:27 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2013-07-04 11:21:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | def bottle_filename_formula_name filename | 
					
						
							|  |  |  |   path = Pathname.new filename | 
					
						
							| 
									
										
										
										
											2013-08-03 20:02:10 -07:00
										 |  |  |   version = BottleVersion.parse(path).to_s | 
					
						
							| 
									
										
										
										
											2013-07-04 11:21:50 +01:00
										 |  |  |   basename = path.basename.to_s | 
					
						
							|  |  |  |   basename.rpartition("-#{version}").first | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class BottleCollector | 
					
						
							|  |  |  |   def initialize | 
					
						
							|  |  |  |     @bottles = {} | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-01 16:03:08 -05:00
										 |  |  |   def add(checksum, tag) | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |     @bottles[tag] = checksum | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def fetch_bottle_for(tag) | 
					
						
							|  |  |  |     return [@bottles[tag], tag] if @bottles[tag] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  |     find_altivec_tag(tag) || find_or_later_tag(tag) | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  |   def keys; @bottles.keys; end | 
					
						
							|  |  |  |   def [](arg); @bottles[arg]; end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |   # This allows generic Altivec PPC bottles to be supported in some | 
					
						
							|  |  |  |   # formulae, while also allowing specific bottles in others; e.g., | 
					
						
							|  |  |  |   # sometimes a formula has just :tiger_altivec, other times it has | 
					
						
							|  |  |  |   # :tiger_g4, :tiger_g5, etc. | 
					
						
							|  |  |  |   def find_altivec_tag(tag) | 
					
						
							|  |  |  |     if tag.to_s =~ /(\w+)_(g4|g4e|g5)$/ | 
					
						
							|  |  |  |       altitag = "#{$1}_altivec".to_sym | 
					
						
							|  |  |  |       return [@bottles[altitag], altitag] if @bottles[altitag] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Allows a bottle tag to specify a specific OS or later, | 
					
						
							|  |  |  |   # so the same bottle can target multiple OSs. | 
					
						
							|  |  |  |   # Not used in core, used in taps. | 
					
						
							|  |  |  |   def find_or_later_tag(tag) | 
					
						
							|  |  |  |     results = @bottles.find_all {|k,v| k.to_s =~ /_or_later$/} | 
					
						
							|  |  |  |     results.each do |key, hsh| | 
					
						
							|  |  |  |       later_tag = key.to_s[/(\w+)_or_later$/, 1].to_sym | 
					
						
							|  |  |  |       bottle_version = MacOS::Version.from_symbol(later_tag) | 
					
						
							|  |  |  |       return [hsh, key] if bottle_version <= MacOS::Version.from_symbol(tag) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     nil | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |