| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-08 16:39:59 -06:00
										 |  |  | def bottle_filename f, options={} | 
					
						
							|  |  |  |   options = { :tag => bottle_tag }.merge(options) | 
					
						
							| 
									
										
										
										
											2012-04-03 11:43:41 -05:00
										 |  |  |   name = f.name.downcase | 
					
						
							| 
									
										
										
										
											2014-03-05 20:12:51 -06:00
										 |  |  |   version = PkgVersion.new(f.stable.version, f.revision) | 
					
						
							| 
									
										
										
										
											2013-12-05 23:06:50 -08:00
										 |  |  |   options[:revision] ||= f.bottle.revision.to_i if f.bottle | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  |   "#{name}-#{version}#{bottle_native_suffix(options)}" | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-18 12:36:43 +01:00
										 |  |  | def install_bottle? f, options={:warn=>false} | 
					
						
							| 
									
										
										
										
											2013-09-25 18:51:30 -05:00
										 |  |  |   return true if f.local_bottle_path | 
					
						
							| 
									
										
										
										
											2013-02-09 19:06:54 -08:00
										 |  |  |   return false if ARGV.build_from_source? | 
					
						
							| 
									
										
										
										
											2013-09-01 12:59:01 +01:00
										 |  |  |   return true if ARGV.force_bottle? | 
					
						
							| 
									
										
										
										
											2013-02-09 19:06:54 -08:00
										 |  |  |   return false unless f.pour_bottle? | 
					
						
							| 
									
										
										
										
											2013-09-21 19:27:24 -05:00
										 |  |  |   return false unless f.default_build? | 
					
						
							| 
									
										
										
										
											2013-02-09 19:06:54 -08:00
										 |  |  |   return false unless bottle_current?(f) | 
					
						
							| 
									
										
										
										
											2013-11-30 16:35:58 -06:00
										 |  |  |   if f.bottle.cellar != :any && f.bottle.cellar != HOMEBREW_CELLAR.to_s | 
					
						
							| 
									
										
										
										
											2013-09-18 12:36:43 +01:00
										 |  |  |     if options[:warn] | 
					
						
							|  |  |  |       opoo "Building source; cellar of #{f}'s bottle is #{f.bottle.cellar}" | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-03-06 12:36:15 +00:00
										 |  |  |     return false | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-02-09 19:06:54 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   true | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def bottle_current? f | 
					
						
							| 
									
										
										
										
											2013-03-08 16:07:37 +00:00
										 |  |  |   f.bottle and f.bottle.url and not f.bottle.checksum.empty? | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  | def bottle_url f, tag=bottle_tag | 
					
						
							| 
									
										
										
										
											2014-03-05 10:24:33 -06:00
										 |  |  |   "#{f.bottle.root_url}/#{bottle_filename(f, :tag => tag)}" | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def add(checksum, tag, url=nil) | 
					
						
							|  |  |  |     @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 |