| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2024-02-25 15:14:22 -08:00
										 |  |  |       extend Cachable | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       private_class_method :cache | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { params(name: String).returns(Hash) } | 
					
						
							|  |  |  |       def self.fetch(name) | 
					
						
							|  |  |  |         Homebrew::API.fetch "formula/#{name}.json" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { params(formula: ::Formula).returns(::Formula) } | 
					
						
							|  |  |  |       def self.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-04-18 00:22:13 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { returns(T::Boolean) } | 
					
						
							|  |  |  |       def self.download_and_cache_data! | 
					
						
							| 
									
										
										
										
											2024-02-10 22:24:36 -08:00
										 |  |  |         if Homebrew::API.internal_json_v3? | 
					
						
							|  |  |  |           json_formulae, updated = Homebrew::API.fetch_json_api_file "internal/v3/homebrew-core.jws.json" | 
					
						
							|  |  |  |           overwrite_cache! T.cast(json_formulae, T::Hash[String, T.untyped]) | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           json_formulae, updated = Homebrew::API.fetch_json_api_file "formula.jws.json" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cache["aliases"] = {} | 
					
						
							|  |  |  |           cache["renames"] = {} | 
					
						
							|  |  |  |           cache["formulae"] = json_formulae.to_h do |json_formula| | 
					
						
							|  |  |  |             json_formula["aliases"].each do |alias_name| | 
					
						
							|  |  |  |               cache["aliases"][alias_name] = json_formula["name"] | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |             (json_formula["oldnames"] || [json_formula["oldname"]].compact).each do |oldname| | 
					
						
							|  |  |  |               cache["renames"][oldname] = json_formula["name"] | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             [json_formula["name"], json_formula.except("name")] | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |         updated | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       private_class_method :download_and_cache_data! | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { returns(T::Hash[String, Hash]) } | 
					
						
							|  |  |  |       def self.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 | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |         cache["formulae"] | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { returns(T::Hash[String, String]) } | 
					
						
							|  |  |  |       def self.all_aliases | 
					
						
							|  |  |  |         unless cache.key?("aliases") | 
					
						
							|  |  |  |           json_updated = download_and_cache_data! | 
					
						
							|  |  |  |           write_names_and_aliases(regenerate: json_updated) | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |         cache["aliases"] | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { returns(T::Hash[String, String]) } | 
					
						
							|  |  |  |       def self.all_renames | 
					
						
							|  |  |  |         unless cache.key?("renames") | 
					
						
							|  |  |  |           json_updated = download_and_cache_data! | 
					
						
							|  |  |  |           write_names_and_aliases(regenerate: json_updated) | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |         cache["renames"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-10 22:24:36 -08:00
										 |  |  |       sig { returns(Hash) } | 
					
						
							|  |  |  |       def self.tap_migrations | 
					
						
							|  |  |  |         # Not sure that we need to reload here. | 
					
						
							|  |  |  |         unless cache.key?("tap_migrations") | 
					
						
							|  |  |  |           json_updated = download_and_cache_data! | 
					
						
							|  |  |  |           write_names_and_aliases(regenerate: json_updated) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cache["tap_migrations"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(String) } | 
					
						
							|  |  |  |       def self.tap_git_head | 
					
						
							|  |  |  |         # Note sure we need to reload here. | 
					
						
							|  |  |  |         unless cache.key?("tap_git_head") | 
					
						
							|  |  |  |           json_updated = download_and_cache_data! | 
					
						
							|  |  |  |           write_names_and_aliases(regenerate: json_updated) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         cache["tap_git_head"] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08:00
										 |  |  |       sig { params(regenerate: T::Boolean).void } | 
					
						
							|  |  |  |       def self.write_names_and_aliases(regenerate: false) | 
					
						
							|  |  |  |         download_and_cache_data! unless cache.key?("formulae") | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |         return unless Homebrew::API.write_names_file(all_formulae.keys, "formula", regenerate:) | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-26 21:21:38 -08: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}" | 
					
						
							| 
									
										
										
										
											2023-02-16 21:49:03 +00:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2022-09-14 23:54:14 -04:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2021-08-06 02:30:44 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |