| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-07-13 11:17:08 -05:00
										 |  |  |   return unless f.bottle && filename.match(Pathname::BOTTLE_EXTNAME_RX) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-07 21:30:03 -05:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |     @checksums = {} | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 14:52:18 -05:00
										 |  |  |   def fetch_checksum_for(tag) | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |     tag = find_matching_tag(tag) | 
					
						
							|  |  |  |     return self[tag], tag if tag | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-15 21:55:14 -05:00
										 |  |  |   def keys | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |     @checksums.keys | 
					
						
							| 
									
										
										
										
											2014-07-15 21:55:14 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def [](key) | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |     @checksums[key] | 
					
						
							| 
									
										
										
										
											2014-07-15 21:55:14 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def []=(key, value) | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |     @checksums[key] = value | 
					
						
							| 
									
										
										
										
											2014-07-15 21:55:14 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-10-21 21:25:42 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |   def key?(key) | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |     @checksums.key?(key) | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |   def find_matching_tag(tag) | 
					
						
							|  |  |  |     if key?(tag) | 
					
						
							|  |  |  |       tag | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       find_altivec_tag(tag) || find_or_later_tag(tag) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   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)$/ | 
					
						
							| 
									
										
										
										
											2014-07-16 18:54:19 -05:00
										 |  |  |       altivec_tag = "#{$1}_altivec".to_sym | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |       altivec_tag if key?(altivec_tag) | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |     begin | 
					
						
							|  |  |  |       tag_version = MacOS::Version.from_symbol(tag) | 
					
						
							|  |  |  |     rescue ArgumentError | 
					
						
							|  |  |  |       return | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |     keys.find do |key| | 
					
						
							|  |  |  |       if key.to_s.end_with?("_or_later") | 
					
						
							|  |  |  |         later_tag = key.to_s[/(\w+)_or_later$/, 1].to_sym | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |         MacOS::Version.from_symbol(later_tag) <= tag_version | 
					
						
							| 
									
										
										
										
											2014-07-16 21:11:48 -05:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-10-21 21:03:14 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |