| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  | require "tab" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Utils | 
					
						
							|  |  |  |   class Bottles | 
					
						
							|  |  |  |     class << self | 
					
						
							|  |  |  |       def tag | 
					
						
							| 
									
										
										
										
											2018-03-07 16:14:55 +00:00
										 |  |  |         @tag ||= "#{ENV["HOMEBREW_PROCESSOR"]}_#{ENV["HOMEBREW_SYSTEM"]}".downcase.to_sym | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def built_as?(f) | 
					
						
							| 
									
										
										
										
											2019-12-03 11:42:09 +00:00
										 |  |  |         return false unless f.latest_version_installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |         tab = Tab.for_keg(f.installed_prefix) | 
					
						
							|  |  |  |         tab.built_as_bottle | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def file_outdated?(f, file) | 
					
						
							|  |  |  |         filename = file.basename.to_s | 
					
						
							|  |  |  |         return unless f.bottle && filename.match(Pathname::BOTTLE_EXTNAME_RX) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bottle_ext = filename[native_regex, 1] | 
					
						
							|  |  |  |         bottle_url_ext = f.bottle.url[native_regex, 1] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bottle_ext && bottle_url_ext && bottle_ext != bottle_url_ext | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def native_regex | 
					
						
							| 
									
										
										
										
											2016-05-08 20:35:52 +02:00
										 |  |  |         /(\.#{Regexp.escape(tag.to_s)}\.bottle\.(\d+\.)?tar\.gz)$/o | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def receipt_path(bottle_file) | 
					
						
							| 
									
										
										
										
											2017-09-25 11:10:36 -07:00
										 |  |  |         path = Utils.popen_read("tar", "-tzf", bottle_file).lines.map(&:chomp).find do |line| | 
					
						
							| 
									
										
										
										
											2016-07-29 15:54:56 -06:00
										 |  |  |           line =~ %r{.+/.+/INSTALL_RECEIPT.json} | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2017-09-25 11:10:36 -07:00
										 |  |  |         raise "This bottle does not contain the file INSTALL_RECEIPT.json: #{bottle_file}" unless path | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-25 11:10:36 -07:00
										 |  |  |         path | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def resolve_formula_names(bottle_file) | 
					
						
							|  |  |  |         receipt_file_path = receipt_path bottle_file | 
					
						
							|  |  |  |         receipt_file = Utils.popen_read("tar", "-xOzf", bottle_file, receipt_file_path) | 
					
						
							|  |  |  |         name = receipt_file_path.split("/").first | 
					
						
							|  |  |  |         tap = Tab.from_file_content(receipt_file, "#{bottle_file}/#{receipt_file_path}").tap | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |         full_name = if tap.nil? || tap.core_tap? | 
					
						
							|  |  |  |           name | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2020-03-13 21:15:06 +00:00
										 |  |  |           "#{tap}/#{name}" | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [name, full_name] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def resolve_version(bottle_file) | 
					
						
							| 
									
										
										
										
											2018-09-17 19:44:12 +02:00
										 |  |  |         PkgVersion.parse receipt_path(bottle_file).split("/").second | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2017-09-25 22:46:51 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       def formula_contents(bottle_file, | 
					
						
							| 
									
										
										
										
											2019-04-30 08:44:35 +01:00
										 |  |  |                            name: resolve_formula_names(bottle_file)[0]) | 
					
						
							| 
									
										
										
										
											2017-09-25 22:46:51 -07:00
										 |  |  |         bottle_version = resolve_version bottle_file | 
					
						
							|  |  |  |         formula_path = "#{name}/#{bottle_version}/.brew/#{name}.rb" | 
					
						
							|  |  |  |         contents = Utils.popen_read "tar", "-xOzf", bottle_file, formula_path | 
					
						
							|  |  |  |         raise BottleFormulaUnavailableError.new(bottle_file, formula_path) unless $CHILD_STATUS.success? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-25 22:46:51 -07:00
										 |  |  |         contents | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Bintray | 
					
						
							|  |  |  |       def self.package(formula_name) | 
					
						
							| 
									
										
										
										
											2016-08-28 23:55:43 +01:00
										 |  |  |         package_name = formula_name.to_s.dup | 
					
						
							|  |  |  |         package_name.tr!("+", "x") | 
					
						
							|  |  |  |         package_name.sub!(/(.)@(\d)/, "\\1:\\2") # Handle foo@1.2 style formulae. | 
					
						
							|  |  |  |         package_name | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def self.repository(tap = nil) | 
					
						
							|  |  |  |         if tap.nil? || tap.core_tap? | 
					
						
							|  |  |  |           "bottles" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           "bottles-#{tap.repo}" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     class Collector | 
					
						
							| 
									
										
										
										
											2020-02-19 11:54:42 +00:00
										 |  |  |       extend Forwardable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def_delegators :@checksums, :keys, :[], :[]=, :key?, :each_key | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-25 17:57:51 +01:00
										 |  |  |       def initialize | 
					
						
							|  |  |  |         @checksums = {} | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def fetch_checksum_for(tag) | 
					
						
							|  |  |  |         tag = find_matching_tag(tag) | 
					
						
							|  |  |  |         return self[tag], tag if tag | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def find_matching_tag(tag) | 
					
						
							|  |  |  |         tag if key?(tag) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/bottles" |