| 
									
										
										
										
											2023-02-11 22:16:57 -08:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | require "extend/cachable" | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  | require "api/download" | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  | module Homebrew | 
					
						
							|  |  |  |   module API | 
					
						
							|  |  |  |     # Helper functions for using the formula JSON API. | 
					
						
							|  |  |  |     # | 
					
						
							|  |  |  |     # @api private | 
					
						
							|  |  |  |     module Formula | 
					
						
							| 
									
										
										
										
											2021-08-09 16:48:13 -04:00
										 |  |  |       class << self | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         include Cachable | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         private :cache | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-09 16:48:13 -04:00
										 |  |  |         sig { params(name: String).returns(Hash) } | 
					
						
							|  |  |  |         def fetch(name) | 
					
						
							| 
									
										
										
										
											2022-12-30 02:24:12 -05:00
										 |  |  |           Homebrew::API.fetch "formula/#{name}.json" | 
					
						
							| 
									
										
										
										
											2021-08-09 16:48:13 -04:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-18 00:22:13 +01:00
										 |  |  |         sig { params(formula: ::Formula).returns(::Formula) } | 
					
						
							|  |  |  |         def source_download(formula) | 
					
						
							|  |  |  |           path = formula.ruby_source_path || "Formula/#{formula.name}.rb" | 
					
						
							|  |  |  |           git_head = formula.tap_git_head || "HEAD" | 
					
						
							|  |  |  |           tap = formula.tap&.full_name || "Homebrew/homebrew-core" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           download = Homebrew::API::Download.new( | 
					
						
							|  |  |  |             "https://raw.githubusercontent.com/#{tap}/#{git_head}/#{path}", | 
					
						
							|  |  |  |             formula.ruby_source_checksum, | 
					
						
							|  |  |  |             cache: HOMEBREW_CACHE_API_SOURCE/"#{tap}/#{git_head}/Formula", | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |           download.fetch | 
					
						
							|  |  |  |           Formulary.factory(download.symlink_location, | 
					
						
							|  |  |  |                             formula.active_spec_sym, | 
					
						
							|  |  |  |                             alias_path: formula.alias_path, | 
					
						
							|  |  |  |                             flags:      formula.class.build_flags) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         sig { returns(T::Boolean) } | 
					
						
							|  |  |  |         def download_and_cache_data! | 
					
						
							| 
									
										
										
										
											2023-07-05 17:18:12 +01:00
										 |  |  |           json_formulae, updated = Homebrew::API.fetch_json_api_file "formula.jws.json" | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           cache["aliases"] = {} | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |           cache["renames"] = {} | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           cache["formulae"] = json_formulae.to_h do |json_formula| | 
					
						
							|  |  |  |             json_formula["aliases"].each do |alias_name| | 
					
						
							|  |  |  |               cache["aliases"][alias_name] = json_formula["name"] | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  |             end | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |             (json_formula["oldnames"] || [json_formula["oldname"]].compact).each do |oldname| | 
					
						
							|  |  |  |               cache["renames"][oldname] = json_formula["name"] | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             [json_formula["name"], json_formula.except("name")] | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           updated | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |         private :download_and_cache_data! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 13:41:54 +00:00
										 |  |  |         sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         def all_formulae | 
					
						
							|  |  |  |           unless cache.key?("formulae") | 
					
						
							|  |  |  |             json_updated = download_and_cache_data! | 
					
						
							|  |  |  |             write_names_and_aliases(regenerate: json_updated) | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |           cache["formulae"] | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 13:41:54 +00:00
										 |  |  |         sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  |         def all_aliases | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           unless cache.key?("aliases") | 
					
						
							|  |  |  |             json_updated = download_and_cache_data! | 
					
						
							|  |  |  |             write_names_and_aliases(regenerate: json_updated) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cache["aliases"] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |         sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |         def all_renames | 
					
						
							|  |  |  |           unless cache.key?("renames") | 
					
						
							|  |  |  |             json_updated = download_and_cache_data! | 
					
						
							|  |  |  |             write_names_and_aliases(regenerate: json_updated) | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cache["renames"] | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         sig { params(regenerate: T::Boolean).void } | 
					
						
							|  |  |  |         def write_names_and_aliases(regenerate: false) | 
					
						
							|  |  |  |           download_and_cache_data! unless cache.key?("formulae") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return unless Homebrew::API.write_names_file(all_formulae.keys, "formula", regenerate: regenerate) | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           (HOMEBREW_CACHE_API/"formula_aliases.txt").open("w") do |file| | 
					
						
							|  |  |  |             all_aliases.each do |alias_name, real_name| | 
					
						
							|  |  |  |               file.puts "#{alias_name}|#{real_name}" | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |