| 
									
										
										
										
											2024-08-12 10:30:59 +01:00
										 |  |  | # typed: true # rubocop:todo Sorbet/StrictSigil | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 06:04:12 +02:00
										 |  |  | # Formula information drawn from an external `brew info --json` call. | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  | class FormulaInfo | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # The whole info structure parsed from the JSON. | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  |   attr_accessor :info | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def initialize(info) | 
					
						
							|  |  |  |     @info = info | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Looks up formula on disk and reads its info. | 
					
						
							|  |  |  |   # Returns nil if formula is absent or if there was an error reading it. | 
					
						
							|  |  |  |   def self.lookup(name) | 
					
						
							| 
									
										
										
										
											2019-10-18 22:14:33 +08:00
										 |  |  |     json = Utils.popen_read( | 
					
						
							| 
									
										
										
										
											2021-02-25 16:29:05 +00:00
										 |  |  |       *HOMEBREW_RUBY_EXEC_ARGS, | 
					
						
							| 
									
										
										
										
											2019-10-18 22:14:33 +08:00
										 |  |  |       HOMEBREW_LIBRARY_PATH/"brew.rb", | 
					
						
							|  |  |  |       "info", | 
					
						
							|  |  |  |       "--json=v1", | 
					
						
							| 
									
										
										
										
											2021-02-25 16:29:05 +00:00
										 |  |  |       name, | 
					
						
							| 
									
										
										
										
											2019-10-18 22:14:33 +08:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return unless $CHILD_STATUS.success? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     force_utf8!(json) | 
					
						
							|  |  |  |     FormulaInfo.new(JSON.parse(json)[0]) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def bottle_tags | 
					
						
							|  |  |  |     return [] unless info["bottle"]["stable"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     info["bottle"]["stable"]["files"].keys | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def bottle_info(my_bottle_tag = Utils::Bottles.tag) | 
					
						
							|  |  |  |     tag_s = my_bottle_tag.to_s | 
					
						
							|  |  |  |     return unless info["bottle"]["stable"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     btl_info = info["bottle"]["stable"]["files"][tag_s] | 
					
						
							|  |  |  |     return unless btl_info | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { "url" => btl_info["url"], "sha256" => btl_info["sha256"] } | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def bottle_info_any | 
					
						
							|  |  |  |     bottle_info(any_bottle_tag) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def any_bottle_tag | 
					
						
							|  |  |  |     tag = Utils::Bottles.tag.to_s | 
					
						
							|  |  |  |     # Prefer native bottles as a convenience for download caching | 
					
						
							|  |  |  |     bottle_tags.include?(tag) ? tag : bottle_tags.first | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def version(spec_type) | 
					
						
							|  |  |  |     version_str = info["versions"][spec_type.to_s] | 
					
						
							| 
									
										
										
										
											2023-07-06 16:47:09 +01:00
										 |  |  |     version_str && Version.new(version_str) | 
					
						
							| 
									
										
										
										
											2019-04-27 00:17:48 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def pkg_version(spec_type = :stable) | 
					
						
							|  |  |  |     PkgVersion.new(version(spec_type), revision) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def revision | 
					
						
							|  |  |  |     info["revision"] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def self.force_utf8!(str) | 
					
						
							|  |  |  |     str.force_encoding("UTF-8") if str.respond_to?(:force_encoding) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |