| 
									
										
										
										
											2024-08-12 10:30:59 +01:00
										 |  |  | # typed: true # rubocop:todo Sorbet/StrictSigil | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-16 21:19:37 +02:00
										 |  |  | require "api" | 
					
						
							| 
									
										
										
										
											2020-02-21 09:59:07 -05:00
										 |  |  | require "commands" | 
					
						
							| 
									
										
										
										
											2021-01-12 16:27:25 -05:00
										 |  |  | require "settings" | 
					
						
							| 
									
										
										
										
											2016-01-04 16:22:26 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  | # A {Tap} is used to extend the formulae provided by Homebrew core. | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  | # Usually, it's synced with a remote Git repository. And it's likely | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  | # a GitHub repository with the name of `user/homebrew-repository`. In such | 
					
						
							|  |  |  | # cases, `user/repository` will be used as the {#name} of this {Tap}, where | 
					
						
							|  |  |  | # {#user} represents the GitHub username and {#repository} represents the | 
					
						
							|  |  |  | # repository name without the leading `homebrew-`. | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  | class Tap | 
					
						
							| 
									
										
										
										
											2017-10-07 00:31:28 +02:00
										 |  |  |   extend Cachable | 
					
						
							| 
									
										
										
										
											2015-09-27 16:52:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |   HOMEBREW_TAP_CASK_RENAMES_FILE = "cask_renames.json" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_CASK_RENAMES_FILE | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |   HOMEBREW_TAP_FORMULA_RENAMES_FILE = "formula_renames.json" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_FORMULA_RENAMES_FILE | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |   HOMEBREW_TAP_MIGRATIONS_FILE = "tap_migrations.json" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_MIGRATIONS_FILE | 
					
						
							| 
									
										
										
										
											2024-03-01 09:15:43 +00:00
										 |  |  |   HOMEBREW_TAP_AUTOBUMP_FILE = ".github/autobump.txt" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_AUTOBUMP_FILE | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |   HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS_FILE = "pypi_formula_mappings.json" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS_FILE | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |   HOMEBREW_TAP_SYNCED_VERSIONS_FORMULAE_FILE = "synced_versions_formulae.json" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_SYNCED_VERSIONS_FORMULAE_FILE | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |   HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR = "audit_exceptions" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |   HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR = "style_exceptions" | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-05 17:18:12 +01:00
										 |  |  |   TAP_MIGRATIONS_STALE_SECONDS = 86400 # 1 day | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   private_constant :TAP_MIGRATIONS_STALE_SECONDS | 
					
						
							| 
									
										
										
										
											2023-07-05 17:18:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |   HOMEBREW_TAP_JSON_FILES = %W[
 | 
					
						
							|  |  |  |     #{HOMEBREW_TAP_FORMULA_RENAMES_FILE} | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |     #{HOMEBREW_TAP_CASK_RENAMES_FILE} | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |     #{HOMEBREW_TAP_MIGRATIONS_FILE} | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |     #{HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS_FILE} | 
					
						
							|  |  |  |     #{HOMEBREW_TAP_SYNCED_VERSIONS_FORMULAE_FILE} | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |     #{HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR}/*.json | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |     #{HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR}/*.json | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |   ].freeze | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-08 16:38:32 +01:00
										 |  |  |   class InvalidNameError < ArgumentError; end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Fetch a {Tap} by name. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |   sig { params(user: String, repository: String).returns(Tap) } | 
					
						
							|  |  |  |   def self.fetch(user, repository = T.unsafe(nil)) | 
					
						
							|  |  |  |     user, repository = user.split("/", 2) if repository.nil? | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     if [user, repository].any? { |part| part.nil? || part.include?("/") } | 
					
						
							|  |  |  |       raise InvalidNameError, "Invalid tap name: '#{[*user, *repository].join("/")}'" | 
					
						
							| 
									
										
										
										
											2015-12-06 21:36:26 +08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |     user = T.must(user) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     repository = T.must(repository) | 
					
						
							| 
									
										
										
										
											2015-12-06 21:36:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-18 23:32:06 -07:00
										 |  |  |     # We special case homebrew and linuxbrew so that users don't have to shift in a terminal. | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |     user = user.capitalize if ["homebrew", "linuxbrew"].include?(user) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     repository = repository.sub(HOMEBREW_OFFICIAL_REPO_PREFIXES_REGEX, "") | 
					
						
							| 
									
										
										
										
											2015-12-06 21:36:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     return CoreTap.instance if ["Homebrew", "Linuxbrew"].include?(user) && ["core", "homebrew"].include?(repository) | 
					
						
							|  |  |  |     return CoreCaskTap.instance if user == "Homebrew" && repository == "cask" | 
					
						
							| 
									
										
										
										
											2015-12-06 21:36:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     cache_key = "#{user}/#{repository}".downcase | 
					
						
							|  |  |  |     cache.fetch(cache_key) { |key| cache[key] = new(user, repository) } | 
					
						
							| 
									
										
										
										
											2015-09-27 16:52:14 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-23 01:58:30 +02:00
										 |  |  |   # Get a {Tap} from its path or a path inside of it. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2017-03-18 16:56:59 +02:00
										 |  |  |   def self.from_path(path) | 
					
						
							| 
									
										
										
										
											2018-03-29 22:05:02 +02:00
										 |  |  |     match = File.expand_path(path).match(HOMEBREW_TAP_PATH_REGEX) | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |     return unless match | 
					
						
							|  |  |  |     return unless (user = match[:user]) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     return unless (repository = match[:repository]) | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     fetch(user, repository) | 
					
						
							| 
									
										
										
										
											2017-03-18 16:56:59 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |   sig { params(name: String).returns(T.nilable([Tap, String])) } | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |   def self.with_formula_name(name) | 
					
						
							|  |  |  |     return unless (match = name.match(HOMEBREW_TAP_FORMULA_REGEX)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     user = T.must(match[:user]) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     repository = T.must(match[:repository]) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     name = T.must(match[:name]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Relative paths are not taps. | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     return if [user, repository].intersect?([".", ".."]) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     tap = fetch(user, repository) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     [tap, name.downcase] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |   sig { params(token: String).returns(T.nilable([Tap, String])) } | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |   def self.with_cask_token(token) | 
					
						
							|  |  |  |     return unless (match = token.match(HOMEBREW_TAP_CASK_REGEX)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     user = T.must(match[:user]) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     repository = T.must(match[:repository]) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     token = T.must(match[:token]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Relative paths are not taps. | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     return if [user, repository].intersect?([".", ".."]) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     tap = fetch(user, repository) | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     [tap, token.downcase] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-03 14:42:16 +01:00
										 |  |  |   sig { returns(T::Set[Tap]) } | 
					
						
							|  |  |  |   def self.allowed_taps | 
					
						
							| 
									
										
										
										
											2024-05-06 15:26:29 +01:00
										 |  |  |     cache_key = :"allowed_taps_#{Homebrew::EnvConfig.allowed_taps.to_s.tr(" ", "_")}" | 
					
						
							| 
									
										
										
										
											2024-05-06 15:05:06 +01:00
										 |  |  |     cache[cache_key] ||= begin | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:22 +01:00
										 |  |  |       allowed_tap_list = Homebrew::EnvConfig.allowed_taps.to_s.split | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Set.new(allowed_tap_list.filter_map do |tap| | 
					
						
							|  |  |  |         Tap.fetch(tap) | 
					
						
							|  |  |  |       rescue Tap::InvalidNameError | 
					
						
							|  |  |  |         opoo "Invalid tap name in `HOMEBREW_ALLOWED_TAPS`: #{tap}" | 
					
						
							|  |  |  |         nil | 
					
						
							| 
									
										
										
										
											2024-05-06 15:05:06 +01:00
										 |  |  |       end).freeze | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:22 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-05-03 14:42:16 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Set[Tap]) } | 
					
						
							|  |  |  |   def self.forbidden_taps | 
					
						
							| 
									
										
										
										
											2024-05-06 15:26:29 +01:00
										 |  |  |     cache_key = :"forbidden_taps_#{Homebrew::EnvConfig.forbidden_taps.to_s.tr(" ", "_")}" | 
					
						
							| 
									
										
										
										
											2024-05-06 15:05:06 +01:00
										 |  |  |     cache[cache_key] ||= begin | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:22 +01:00
										 |  |  |       forbidden_tap_list = Homebrew::EnvConfig.forbidden_taps.to_s.split | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       Set.new(forbidden_tap_list.filter_map do |tap| | 
					
						
							|  |  |  |         Tap.fetch(tap) | 
					
						
							|  |  |  |       rescue Tap::InvalidNameError | 
					
						
							|  |  |  |         opoo "Invalid tap name in `HOMEBREW_FORBIDDEN_TAPS`: #{tap}" | 
					
						
							|  |  |  |         nil | 
					
						
							| 
									
										
										
										
											2024-05-06 15:05:06 +01:00
										 |  |  |       end).freeze | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:22 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-05-03 14:42:16 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   extend Enumerable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-04 09:58:58 +01:00
										 |  |  |   # The user name of this {Tap}. Usually, it's the GitHub username of | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # this {Tap}'s remote repository. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   attr_reader :user | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # The repository name of this {Tap} without the leading `homebrew-`. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   attr_reader :repository | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # @deprecated | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def repo | 
					
						
							|  |  |  |     # delete this whole function when removing odisabled | 
					
						
							|  |  |  |     odeprecated "Tap#repo", "Tap#repository" | 
					
						
							|  |  |  |     repository | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # The name of this {Tap}. It combines {#user} and {#repository} with a slash. | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  |   # {#name} is always in lowercase. | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # e.g. `user/repository` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   attr_reader :name | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-04-26 14:04:55 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   def to_s = name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-12 17:30:02 -04:00
										 |  |  |   # The full name of this {Tap}, including the `homebrew-` prefix. | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # It combines {#user} and 'homebrew-'-prefixed {#repository} with a slash. | 
					
						
							|  |  |  |   # e.g. `user/homebrew-repository` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2017-06-12 17:30:02 -04:00
										 |  |  |   attr_reader :full_name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  |   # The local path to this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # e.g. `/usr/local/Library/Taps/user/homebrew-repository` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2023-04-15 19:06:40 -07:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   attr_reader :path | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-15 19:06:40 -07:00
										 |  |  |   # The git repository of this {Tap}. | 
					
						
							|  |  |  |   sig { returns(GitRepository) } | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   attr_reader :git_repository | 
					
						
							| 
									
										
										
										
											2023-04-15 15:06:58 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |   # Always use `Tap.fetch` instead of `Tap.new`. | 
					
						
							|  |  |  |   private_class_method :new | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   def initialize(user, repository) | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  |     require "git_repository" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-02 14:35:42 +08:00
										 |  |  |     @user = user | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     @repository = repository | 
					
						
							|  |  |  |     @name = "#{@user}/#{@repository}".downcase | 
					
						
							|  |  |  |     @full_name = "#{@user}/homebrew-#{@repository}" | 
					
						
							| 
									
										
										
										
											2024-08-10 13:35:20 -07:00
										 |  |  |     @path = HOMEBREW_TAP_DIRECTORY/@full_name.downcase | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     @git_repository = GitRepository.new(@path) | 
					
						
							| 
									
										
										
										
											2015-06-13 01:57:00 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # Clear internal cache. | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |   def clear_cache | 
					
						
							|  |  |  |     @remote = nil | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     @repository_var_suffix = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  |     remove_instance_variable(:@private) if instance_variable_defined?(:@private) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |     @formula_dir = nil | 
					
						
							|  |  |  |     @formula_files = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:33 +01:00
										 |  |  |     @formula_files_by_name = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  |     @formula_names = nil | 
					
						
							|  |  |  |     @prefix_to_versioned_formulae_names = nil | 
					
						
							|  |  |  |     @formula_renames = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:14 +01:00
										 |  |  |     @formula_reverse_renames = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @cask_dir = nil | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     @cask_files = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:05 +01:00
										 |  |  |     @cask_files_by_name = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  |     @cask_tokens = nil | 
					
						
							|  |  |  |     @cask_renames = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:04:40 +01:00
										 |  |  |     @cask_reverse_renames = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-23 14:55:42 +08:00
										 |  |  |     @alias_dir = nil | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |     @alias_files = nil | 
					
						
							|  |  |  |     @aliases = nil | 
					
						
							|  |  |  |     @alias_table = nil | 
					
						
							|  |  |  |     @alias_reverse_table = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @command_dir = nil | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |     @command_files = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-25 14:14:33 +08:00
										 |  |  |     @tap_migrations = nil | 
					
						
							| 
									
										
										
										
											2024-03-06 21:00:43 -08:00
										 |  |  |     @reverse_tap_migrations_renames = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |     @audit_exceptions = nil | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |     @style_exceptions = nil | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |     @pypi_formula_mappings = nil | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |     @synced_versions_formulae = nil | 
					
						
							| 
									
										
										
										
											2024-02-23 15:11:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |     @config = nil | 
					
						
							| 
									
										
										
										
											2021-06-19 00:14:33 +01:00
										 |  |  |     @spell_checker = nil | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { void } | 
					
						
							|  |  |  |   def ensure_installed! | 
					
						
							|  |  |  |     return if installed? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     install | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-13 01:53:55 +08:00
										 |  |  |   # The remote path to this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # e.g. `https://github.com/user/homebrew-repository` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-06-13 01:57:00 +08:00
										 |  |  |   def remote | 
					
						
							| 
									
										
										
										
											2023-02-16 12:25:28 +00:00
										 |  |  |     return default_remote unless installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     @remote ||= git_repository.origin_url | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-21 12:35:45 -04:00
										 |  |  |   # The remote repository name of this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   # e.g. `user/homebrew-repository` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-02-23 15:01:16 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |   def remote_repository | 
					
						
							| 
									
										
										
										
											2024-02-23 15:01:16 +01:00
										 |  |  |     return unless (remote = self.remote) | 
					
						
							| 
									
										
										
										
											2024-10-15 10:20:58 +02:00
										 |  |  |     return unless (match = remote.match(HOMEBREW_TAP_REPOSITORY_REGEX)) | 
					
						
							| 
									
										
										
										
											2021-03-22 08:54:38 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-15 10:20:58 +02:00
										 |  |  |     @remote_repository ||= T.must(match[:remote_repository]) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # @deprecated | 
					
						
							|  |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							|  |  |  |   def remote_repo | 
					
						
							|  |  |  |     # delete this whole function when removing odisabled | 
					
						
							|  |  |  |     odeprecated "Tap#remote_repo", "Tap#remote_repository" | 
					
						
							|  |  |  |     remote_repository | 
					
						
							| 
									
										
										
										
											2021-03-21 12:35:45 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 15:25:29 +08:00
										 |  |  |   # The default remote path to this {Tap}. | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2016-04-19 15:25:29 +08:00
										 |  |  |   def default_remote | 
					
						
							| 
									
										
										
										
											2017-06-12 17:30:02 -04:00
										 |  |  |     "https://github.com/#{full_name}" | 
					
						
							| 
									
										
										
										
											2016-04-19 15:25:29 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-15 21:24:34 +01:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |   def repository_var_suffix | 
					
						
							|  |  |  |     @repository_var_suffix ||= path.to_s | 
					
						
							| 
									
										
										
										
											2024-08-10 13:35:20 -07:00
										 |  |  |                                    .delete_prefix(HOMEBREW_TAP_DIRECTORY.to_s) | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |                                    .tr("^A-Za-z0-9", "_") | 
					
						
							|  |  |  |                                    .upcase | 
					
						
							| 
									
										
										
										
											2018-05-25 16:21:37 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   # @deprecated | 
					
						
							|  |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def repo_var_suffix | 
					
						
							|  |  |  |     # delete this whole function when removing odisabled | 
					
						
							|  |  |  |     odeprecated "Tap#repo_var_suffix", "Tap#repository_var_suffix" | 
					
						
							|  |  |  |     repository_var_suffix | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2018-05-25 16:21:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Check whether this {Tap} is a Git repository. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-07-30 16:51:00 +08:00
										 |  |  |   def git? | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     git_repository.git_repository? | 
					
						
							| 
									
										
										
										
											2015-07-30 16:51:00 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 14:46:15 -04:00
										 |  |  |   # Git branch for this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2017-09-27 16:32:13 -04:00
										 |  |  |   def git_branch | 
					
						
							|  |  |  |     raise TapUnavailableError, name unless installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     git_repository.branch_name | 
					
						
							| 
									
										
										
										
											2017-09-27 16:32:13 -04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 14:46:15 -04:00
										 |  |  |   # Git HEAD for this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2016-03-05 20:03:43 +08:00
										 |  |  |   def git_head | 
					
						
							|  |  |  |     raise TapUnavailableError, name unless installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     @git_head ||= git_repository.head_ref | 
					
						
							| 
									
										
										
										
											2016-03-05 20:03:43 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # Time since last git commit for this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2016-03-05 20:03:43 +08:00
										 |  |  |   def git_last_commit | 
					
						
							|  |  |  |     raise TapUnavailableError, name unless installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     git_repository.last_committed | 
					
						
							| 
									
										
										
										
											2016-03-05 20:03:43 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-28 13:23:22 +01:00
										 |  |  |   # The issues URL of this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |   # e.g. `https://github.com/user/homebrew-repository/issues` | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2015-12-28 13:23:22 +01:00
										 |  |  |   def issues_url | 
					
						
							| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  |     return if !official? && custom_remote? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-12 17:30:02 -04:00
										 |  |  |     "#{default_remote}/issues" | 
					
						
							| 
									
										
										
										
											2015-12-28 13:23:22 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Check whether this {Tap} is an official Homebrew tap. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def official? | 
					
						
							| 
									
										
										
										
											2015-12-06 20:57:28 +08:00
										 |  |  |     user == "Homebrew" | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   # Check whether the remote of this {Tap} is a private repository. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def private? | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |     return @private if defined?(@private) | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |     @private = if (value = config[:private]).nil? | 
					
						
							|  |  |  |       config[:private] = begin | 
					
						
							|  |  |  |         if custom_remote? | 
					
						
							|  |  |  |           true | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           # Don't store config if we don't know for sure. | 
					
						
							|  |  |  |           return false if (value = GitHub.private_repo?(full_name)).nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           value | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       rescue GitHub::API::HTTPNotFoundError | 
					
						
							|  |  |  |         true | 
					
						
							|  |  |  |       rescue GitHub::API::Error | 
					
						
							|  |  |  |         false | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       value | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # {TapConfig} of this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-02-23 15:09:58 +01:00
										 |  |  |   sig { returns(TapConfig) } | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   def config | 
					
						
							|  |  |  |     @config ||= begin | 
					
						
							|  |  |  |       raise TapUnavailableError, name unless installed? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |       TapConfig.new(self) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Check whether this {Tap} is installed. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def installed? | 
					
						
							| 
									
										
										
										
											2015-12-06 20:57:28 +08:00
										 |  |  |     path.directory? | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Check whether this {Tap} is a shallow clone. | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  |   def shallow? | 
					
						
							|  |  |  |     (path/".git/shallow").exist? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def core_tap? | 
					
						
							| 
									
										
										
										
											2015-12-07 14:12:57 +08:00
										 |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def core_cask_tap? | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # Install this {Tap}. | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |   # | 
					
						
							| 
									
										
										
										
											2020-02-05 20:22:21 +00:00
										 |  |  |   # @param clone_target [String] If passed, it will be used as the clone remote. | 
					
						
							|  |  |  |   # @param quiet [Boolean] If set, suppress all output. | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |   # @param custom_remote [Boolean] If set, change the tap's remote if already installed. | 
					
						
							| 
									
										
										
										
											2022-09-05 13:57:22 +01:00
										 |  |  |   # @param verify [Boolean] If set, verify all the formula, casks and aliases in the tap are valid. | 
					
						
							| 
									
										
										
										
											2023-07-05 19:15:48 +01:00
										 |  |  |   # @param force [Boolean] If set, force core and cask taps to install even under API mode. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-03-08 16:21:09 +00:00
										 |  |  |   def install(quiet: false, clone_target: nil, | 
					
						
							| 
									
										
										
										
											2023-07-05 19:15:48 +01:00
										 |  |  |               custom_remote: false, verify: false, force: false) | 
					
						
							| 
									
										
										
										
											2015-12-19 19:10:22 +08:00
										 |  |  |     require "descriptions" | 
					
						
							| 
									
										
										
										
											2020-08-18 00:23:23 +01:00
										 |  |  |     require "readall" | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     if official? && DEPRECATED_OFFICIAL_TAPS.include?(repository) | 
					
						
							| 
									
										
										
										
											2020-08-13 04:24:37 +02:00
										 |  |  |       odie "#{name} was deprecated. This tap is now empty and all its contents were either deleted or migrated." | 
					
						
							| 
									
										
										
										
											2020-09-28 20:54:16 +02:00
										 |  |  |     elsif user == "caskroom" || name == "phinze/cask" | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |       new_repository = (repository == "cask") ? "cask" : "cask-#{repository}" | 
					
						
							|  |  |  |       odie "#{name} was moved. Tap homebrew/#{new_repository} instead." | 
					
						
							| 
									
										
										
										
											2017-04-22 16:53:48 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     raise TapNoCustomRemoteError, name if custom_remote && clone_target.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-05 20:22:21 +00:00
										 |  |  |     requested_remote = clone_target || default_remote | 
					
						
							| 
									
										
										
										
											2020-02-02 16:36:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     if installed? && !custom_remote | 
					
						
							| 
									
										
										
										
											2020-02-05 20:22:21 +00:00
										 |  |  |       raise TapRemoteMismatchError.new(name, @remote, requested_remote) if clone_target && requested_remote != remote | 
					
						
							| 
									
										
										
										
											2024-03-08 16:21:09 +00:00
										 |  |  |       raise TapAlreadyTappedError, name unless shallow? | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-02-25 21:09:50 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-07 10:44:44 +01:00
										 |  |  |     if !allowed_by_env? || forbidden_by_env? | 
					
						
							|  |  |  |       owner = Homebrew::EnvConfig.forbidden_owner | 
					
						
							|  |  |  |       owner_contact = if (contact = Homebrew::EnvConfig.forbidden_owner_contact.presence) | 
					
						
							|  |  |  |         "\n#{contact}" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 10:05:50 -07:00
										 |  |  |       error_message = "The installation of the #{full_name} was requested but #{owner}\n" | 
					
						
							| 
									
										
										
										
											2024-05-07 10:44:44 +01:00
										 |  |  |       error_message << "has not allowed this tap in `HOMEBREW_ALLOWED_TAPS`" unless allowed_by_env? | 
					
						
							|  |  |  |       error_message << " and\n" if !allowed_by_env? && forbidden_by_env? | 
					
						
							|  |  |  |       error_message << "has forbidden this tap in `HOMEBREW_FORBIDDEN_TAPS`" if forbidden_by_env? | 
					
						
							|  |  |  |       error_message << ".#{owner_contact}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       odie error_message | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |     # ensure git is installed | 
					
						
							| 
									
										
										
										
											2020-08-23 06:32:26 +02:00
										 |  |  |     Utils::Git.ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if installed? | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |       if requested_remote != remote # we are sure that clone_target is not nil and custom_remote is true here | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |         fix_remote_configuration(requested_remote:, quiet:) | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 16:21:09 +00:00
										 |  |  |       config.delete(:forceautoupdate) | 
					
						
							| 
									
										
										
										
											2018-04-12 16:14:02 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-06 09:56:30 -04:00
										 |  |  |       $stderr.ohai "Unshallowing #{name}" if shallow? && !quiet | 
					
						
							|  |  |  |       args = %w[fetch] | 
					
						
							|  |  |  |       # Git throws an error when attempting to unshallow a full clone | 
					
						
							|  |  |  |       args << "--unshallow" if shallow? | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  |       args << "-q" if quiet | 
					
						
							| 
									
										
										
										
											2018-01-15 07:30:56 +00:00
										 |  |  |       path.cd { safe_system "git", *args } | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  |       return | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     elsif (core_tap? || core_cask_tap?) && !Homebrew::EnvConfig.no_install_from_api? && !force | 
					
						
							| 
									
										
										
										
											2023-12-07 22:58:54 +00:00
										 |  |  |       odie "Tapping #{name} is no longer typically necessary.\n" \ | 
					
						
							| 
									
										
										
										
											2024-05-07 20:07:27 -07:00
										 |  |  |            "Add #{Formatter.option("--force")} if you are sure you need it for contributing to Homebrew." | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     clear_cache | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |     Tap.clear_cache | 
					
						
							| 
									
										
										
										
											2016-04-04 03:18:55 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     $stderr.ohai "Tapping #{name}" unless quiet | 
					
						
							| 
									
										
										
										
											2016-06-20 13:03:27 +01:00
										 |  |  |     args =  %W[clone #{requested_remote} #{path}] | 
					
						
							| 
									
										
										
										
											2021-02-09 15:29:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Override possible user configs like: | 
					
						
							|  |  |  |     #   git config --global clone.defaultRemoteName notorigin | 
					
						
							|  |  |  |     args << "--origin=origin" | 
					
						
							| 
									
										
										
										
											2016-02-25 21:09:50 +08:00
										 |  |  |     args << "-q" if quiet | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-30 11:10:23 +02:00
										 |  |  |     # Override user-set default template. | 
					
						
							| 
									
										
										
										
											2021-05-14 10:47:52 -04:00
										 |  |  |     args << "--template=" | 
					
						
							| 
									
										
										
										
											2024-04-30 11:10:23 +02:00
										 |  |  |     # Prevent `fsmonitor` from watching this repository. | 
					
						
							| 
									
										
										
										
											2023-07-04 09:56:57 +00:00
										 |  |  |     args << "--config" << "core.fsmonitor=false" | 
					
						
							| 
									
										
										
										
											2021-05-14 10:47:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2018-01-15 07:30:56 +00:00
										 |  |  |       safe_system "git", *args | 
					
						
							| 
									
										
										
										
											2022-03-08 19:24:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-19 21:33:13 -07:00
										 |  |  |       if verify && !Homebrew::EnvConfig.developer? && !Readall.valid_tap?(self, aliases: true) | 
					
						
							| 
									
										
										
										
											2020-09-01 14:05:52 +01:00
										 |  |  |         raise "Cannot tap #{name}: invalid syntax in tap!" | 
					
						
							| 
									
										
										
										
											2016-07-09 13:51:19 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2018-09-02 23:30:07 +02:00
										 |  |  |     rescue Interrupt, RuntimeError | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |       ignore_interrupts do | 
					
						
							| 
									
										
										
										
											2016-07-09 13:51:19 +01:00
										 |  |  |         # wait for git to possibly cleanup the top directory when interrupt happens. | 
					
						
							|  |  |  |         sleep 0.1
 | 
					
						
							| 
									
										
										
										
											2023-04-15 18:13:38 -07:00
										 |  |  |         FileUtils.rm_rf path | 
					
						
							| 
									
										
										
										
											2015-12-06 20:57:28 +08:00
										 |  |  |         path.parent.rmdir_if_possible | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |       end | 
					
						
							|  |  |  |       raise | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 18:03:40 -04:00
										 |  |  |     Commands.rebuild_commands_completion_list | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     link_completions_and_manpages | 
					
						
							| 
									
										
										
										
											2015-12-08 17:26:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-02 15:03:10 -07:00
										 |  |  |     formatted_contents = contents.presence&.to_sentence&.prepend(" ") | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     $stderr.puts "Tapped#{formatted_contents} (#{path.abv})." unless quiet | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     require "description_cache_store" | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |     CacheStoreDatabase.use(:descriptions) do |db| | 
					
						
							|  |  |  |       DescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                            .update_from_formula_names!(formula_names) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-03-23 00:03:11 -04:00
										 |  |  |     CacheStoreDatabase.use(:cask_descriptions) do |db| | 
					
						
							|  |  |  |       CaskDescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                                .update_from_cask_tokens!(cask_tokens) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-19 17:55:03 -05:00
										 |  |  |     if official? | 
					
						
							| 
									
										
										
										
											2021-01-20 12:02:24 -05:00
										 |  |  |       untapped = self.class.untapped_official_taps | 
					
						
							| 
									
										
										
										
											2021-01-19 17:55:03 -05:00
										 |  |  |       untapped -= [name] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if untapped.empty? | 
					
						
							|  |  |  |         Homebrew::Settings.delete :untapped | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         Homebrew::Settings.write :untapped, untapped.join(";") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-05 20:22:21 +00:00
										 |  |  |     return if clone_target | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     return unless private? | 
					
						
							|  |  |  |     return if quiet | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-04-11 20:57:43 +08:00
										 |  |  |     path.cd do | 
					
						
							|  |  |  |       return if Utils.popen_read("git", "config", "--get", "credential.helper").present? | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     $stderr.puts <<~EOS | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |       It looks like you tapped a private repository. To avoid entering your | 
					
						
							|  |  |  |       credentials each time you update, you can use git HTTP credential | 
					
						
							|  |  |  |       caching or issue the following command: | 
					
						
							|  |  |  |         cd #{path} | 
					
						
							| 
									
										
										
										
											2017-06-12 17:30:02 -04:00
										 |  |  |         git remote set-url origin git@github.com:#{full_name}.git | 
					
						
							| 
									
										
										
										
											2016-09-23 22:02:23 +02:00
										 |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |   def link_completions_and_manpages | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  |     require "utils/link" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     command = "brew tap --repair" | 
					
						
							|  |  |  |     Utils::Link.link_manpages(path, command) | 
					
						
							| 
									
										
										
										
											2021-01-11 12:24:48 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  |     require "completions" | 
					
						
							| 
									
										
										
										
											2021-01-13 11:16:09 -05:00
										 |  |  |     Homebrew::Completions.show_completions_message_if_needed | 
					
						
							|  |  |  |     if official? || Homebrew::Completions.link_completions? | 
					
						
							| 
									
										
										
										
											2021-01-11 12:24:48 -05:00
										 |  |  |       Utils::Link.link_completions(path, command) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       Utils::Link.unlink_completions(path) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-12-08 17:26:53 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |   def fix_remote_configuration(requested_remote: nil, quiet: false) | 
					
						
							| 
									
										
										
										
											2021-10-12 20:21:58 +08:00
										 |  |  |     if requested_remote.present? | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |       path.cd do | 
					
						
							|  |  |  |         safe_system "git", "remote", "set-url", "origin", requested_remote | 
					
						
							|  |  |  |         safe_system "git", "config", "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |       $stderr.ohai "#{name}: changed remote from #{remote} to #{requested_remote}" unless quiet | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-07-23 00:11:41 -04:00
										 |  |  |     return unless remote | 
					
						
							| 
									
										
										
										
											2021-01-25 23:57:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     current_upstream_head = T.must(git_repository.origin_branch_name) | 
					
						
							|  |  |  |     return if requested_remote.blank? && git_repository.origin_has_branch?(current_upstream_head) | 
					
						
							| 
									
										
										
										
											2021-01-25 23:57:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     args = %w[fetch] | 
					
						
							| 
									
										
										
										
											2021-10-12 20:21:58 +08:00
										 |  |  |     args << "--quiet" if quiet | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     args << "origin" | 
					
						
							| 
									
										
										
										
											2023-11-05 00:44:50 +00:00
										 |  |  |     args << "+refs/heads/*:refs/remotes/origin/*" | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     safe_system "git", "-C", path, *args | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     git_repository.set_head_origin_auto | 
					
						
							| 
									
										
										
										
											2021-01-25 23:57:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     new_upstream_head = T.must(git_repository.origin_branch_name) | 
					
						
							| 
									
										
										
										
											2021-10-12 21:58:40 +08:00
										 |  |  |     return if new_upstream_head == current_upstream_head | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-05 00:44:50 +00:00
										 |  |  |     safe_system "git", "-C", path, "config", "remote.origin.fetch", "+refs/heads/*:refs/remotes/origin/*" | 
					
						
							| 
									
										
										
										
											2024-06-10 09:31:53 +01:00
										 |  |  |     git_repository.rename_branch old: current_upstream_head, new: new_upstream_head | 
					
						
							|  |  |  |     git_repository.set_upstream_branch local: new_upstream_head, origin: new_upstream_head | 
					
						
							| 
									
										
										
										
											2021-01-25 23:57:01 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-12 20:38:09 +08:00
										 |  |  |     return if quiet | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     $stderr.ohai "#{name}: changed default branch name from #{current_upstream_head} to #{new_upstream_head}!" | 
					
						
							| 
									
										
										
										
											2021-01-25 23:57:01 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # Uninstall this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2021-01-21 08:42:22 -05:00
										 |  |  |   def uninstall(manual: false) | 
					
						
							| 
									
										
										
										
											2015-12-19 19:10:22 +08:00
										 |  |  |     require "descriptions" | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |     raise TapUnavailableError, name unless installed? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     $stderr.puts "Untapping #{name}..." | 
					
						
							| 
									
										
										
										
											2018-06-19 17:59:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     abv = path.abv | 
					
						
							| 
									
										
										
										
											2024-11-02 15:03:10 -07:00
										 |  |  |     formatted_contents = contents.presence&.to_sentence&.prepend(" ") | 
					
						
							| 
									
										
										
										
											2018-06-19 17:59:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  |     require "description_cache_store" | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |     CacheStoreDatabase.use(:descriptions) do |db| | 
					
						
							|  |  |  |       DescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                            .delete_from_formula_names!(formula_names) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2022-03-23 00:03:11 -04:00
										 |  |  |     CacheStoreDatabase.use(:cask_descriptions) do |db| | 
					
						
							|  |  |  |       CaskDescriptionCacheStore.new(db) | 
					
						
							|  |  |  |                                .delete_from_cask_tokens!(cask_tokens) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-07-14 08:49:39 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     require "utils/link" | 
					
						
							| 
									
										
										
										
											2016-09-30 18:22:53 -05:00
										 |  |  |     Utils::Link.unlink_manpages(path) | 
					
						
							|  |  |  |     Utils::Link.unlink_completions(path) | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     FileUtils.rm_r(path) | 
					
						
							| 
									
										
										
										
											2015-12-08 17:26:53 +00:00
										 |  |  |     path.parent.rmdir_if_possible | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     $stderr.puts "Untapped#{formatted_contents} (#{abv})." | 
					
						
							| 
									
										
										
										
											2020-06-17 18:03:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Commands.rebuild_commands_completion_list | 
					
						
							| 
									
										
										
										
											2016-02-06 03:50:06 +08:00
										 |  |  |     clear_cache | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |     Tap.clear_cache | 
					
						
							| 
									
										
										
										
											2021-01-19 17:55:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-21 08:42:22 -05:00
										 |  |  |     return if !manual || !official? | 
					
						
							| 
									
										
										
										
											2021-01-19 17:55:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-20 12:02:24 -05:00
										 |  |  |     untapped = self.class.untapped_official_taps | 
					
						
							| 
									
										
										
										
											2021-01-19 17:55:03 -05:00
										 |  |  |     return if untapped.include? name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     untapped << name | 
					
						
							|  |  |  |     Homebrew::Settings.write :untapped, untapped.join(";") | 
					
						
							| 
									
										
										
										
											2015-11-07 16:25:34 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Check whether the {#remote} of {Tap} is customized. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:37 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def custom_remote? | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:37 +01:00
										 |  |  |     return true unless (remote = self.remote) | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:37 +01:00
										 |  |  |     !remote.casecmp(default_remote).zero? | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # Path to the directory of all {Formula} files for this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2015-12-06 20:59:31 +08:00
										 |  |  |   def formula_dir | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |     # Official formulae taps always use this directory, saves time to hardcode. | 
					
						
							|  |  |  |     @formula_dir ||= if official? | 
					
						
							|  |  |  |       path/"Formula" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       potential_formula_dirs.find(&:directory?) || (path/"Formula") | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-12-13 01:53:05 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							| 
									
										
										
										
											2016-12-13 01:53:05 +00:00
										 |  |  |   def potential_formula_dirs | 
					
						
							| 
									
										
										
										
											2023-04-15 18:13:38 -07:00
										 |  |  |     @potential_formula_dirs ||= [path/"Formula", path/"HomebrewFormula", path].freeze | 
					
						
							| 
									
										
										
										
											2015-12-06 20:59:31 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |   sig { params(name: String).returns(Pathname) } | 
					
						
							|  |  |  |   def new_formula_path(name) | 
					
						
							|  |  |  |     formula_dir/"#{name.downcase}.rb" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # Path to the directory of all {Cask} files for this {Tap}. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2016-08-04 14:37:37 +04:00
										 |  |  |   def cask_dir | 
					
						
							| 
									
										
										
										
											2017-03-12 19:18:41 +01:00
										 |  |  |     @cask_dir ||= path/"Casks" | 
					
						
							| 
									
										
										
										
											2016-08-04 14:37:37 +04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |   sig { params(token: String).returns(Pathname) } | 
					
						
							|  |  |  |   def new_cask_path(token) | 
					
						
							|  |  |  |     cask_dir/"#{token.downcase}.rb" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-10 16:08:47 +01:00
										 |  |  |   sig { params(token: String).returns(String) } | 
					
						
							|  |  |  |   def relative_cask_path(token) | 
					
						
							|  |  |  |     new_cask_path(token).to_s | 
					
						
							|  |  |  |                         .delete_prefix("#{path}/") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-20 20:35:24 +02:00
										 |  |  |   def contents | 
					
						
							|  |  |  |     contents = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (command_count = command_files.count).positive? | 
					
						
							| 
									
										
										
										
											2023-03-20 07:23:17 -04:00
										 |  |  |       contents << Utils.pluralize("command", command_count, include_count: true) | 
					
						
							| 
									
										
										
										
											2018-06-20 20:35:24 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (cask_count = cask_files.count).positive? | 
					
						
							| 
									
										
										
										
											2023-03-20 07:23:17 -04:00
										 |  |  |       contents << Utils.pluralize("cask", cask_count, include_count: true) | 
					
						
							| 
									
										
										
										
											2018-06-20 20:35:24 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (formula_count = formula_files.count).positive? | 
					
						
							| 
									
										
										
										
											2023-03-20 07:23:17 -04:00
										 |  |  |       contents << Utils.pluralize("formula", formula_count, plural: "e", include_count: true) | 
					
						
							| 
									
										
										
										
											2018-06-20 20:35:24 +02:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     contents | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # An array of all {Formula} files of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def formula_files | 
					
						
							| 
									
										
										
										
											2017-03-12 19:18:41 +01:00
										 |  |  |     @formula_files ||= if formula_dir.directory? | 
					
						
							| 
									
										
										
										
											2023-07-07 20:58:22 +01:00
										 |  |  |       if formula_dir == path | 
					
						
							|  |  |  |         # We only want the top level here so we don't treat commands & casks as formulae. | 
					
						
							|  |  |  |         # Sharding is only supported in Formula/ and HomebrewFormula/. | 
					
						
							| 
									
										
										
										
											2024-08-26 23:02:11 -07:00
										 |  |  |         Pathname.glob(formula_dir/"*.rb") | 
					
						
							| 
									
										
										
										
											2023-07-07 20:58:22 +01:00
										 |  |  |       else | 
					
						
							| 
									
										
										
										
											2024-08-26 23:02:11 -07:00
										 |  |  |         Pathname.glob(formula_dir/"**/*.rb") | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-25 05:19:14 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:33 +01:00
										 |  |  |   # A mapping of {Formula} names to {Formula} file paths. | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  |   sig { returns(T::Hash[String, Pathname]) } | 
					
						
							|  |  |  |   def formula_files_by_name | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:33 +01:00
										 |  |  |     @formula_files_by_name ||= formula_files.each_with_object({}) do |file, hash| | 
					
						
							| 
									
										
										
										
											2024-01-12 10:38:47 -08:00
										 |  |  |       # If there's more than one file with the same basename: use the longer one to prioritise more specific results. | 
					
						
							| 
									
										
										
										
											2023-08-10 16:08:47 +01:00
										 |  |  |       basename = file.basename(".rb").to_s | 
					
						
							|  |  |  |       existing_file = hash[basename] | 
					
						
							|  |  |  |       hash[basename] = file if existing_file.nil? || existing_file.to_s.length < file.to_s.length | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # An array of all {Cask} files of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							| 
									
										
										
										
											2016-08-25 05:19:14 +02:00
										 |  |  |   def cask_files | 
					
						
							| 
									
										
										
										
											2017-03-12 19:18:41 +01:00
										 |  |  |     @cask_files ||= if cask_dir.directory? | 
					
						
							| 
									
										
										
										
											2024-08-26 23:02:11 -07:00
										 |  |  |       Pathname.glob(cask_dir/"**/*.rb") | 
					
						
							| 
									
										
										
										
											2015-09-27 16:52:14 +08:00
										 |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:05 +01:00
										 |  |  |   # A mapping of {Cask} tokens to {Cask} file paths. | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { returns(T::Hash[String, Pathname]) } | 
					
						
							|  |  |  |   def cask_files_by_name | 
					
						
							| 
									
										
										
										
											2024-02-23 15:03:05 +01:00
										 |  |  |     @cask_files_by_name ||= cask_files.each_with_object({}) do |file, hash| | 
					
						
							| 
									
										
										
										
											2024-01-12 10:38:47 -08:00
										 |  |  |       # If there's more than one file with the same basename: use the longer one to prioritise more specific results. | 
					
						
							| 
									
										
										
										
											2023-08-10 16:08:47 +01:00
										 |  |  |       basename = file.basename(".rb").to_s | 
					
						
							|  |  |  |       existing_file = hash[basename] | 
					
						
							|  |  |  |       hash[basename] = file if existing_file.nil? || existing_file.to_s.length < file.to_s.length | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-28 19:09:56 -07:00
										 |  |  |   RUBY_FILE_NAME_REGEX = %r{[^/]+\.rb} | 
					
						
							|  |  |  |   private_constant :RUBY_FILE_NAME_REGEX | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ZERO_OR_MORE_SUBDIRECTORIES_REGEX = %r{(?:[^/]+/)*} | 
					
						
							|  |  |  |   private_constant :ZERO_OR_MORE_SUBDIRECTORIES_REGEX | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |   sig { returns(Regexp) } | 
					
						
							|  |  |  |   def formula_file_regex | 
					
						
							| 
									
										
										
										
											2024-08-27 00:32:05 -07:00
										 |  |  |     @formula_file_regex ||= case formula_dir | 
					
						
							|  |  |  |     when path/"Formula" | 
					
						
							| 
									
										
										
										
											2024-08-28 19:09:56 -07:00
										 |  |  |       %r{^Formula/#{ZERO_OR_MORE_SUBDIRECTORIES_REGEX.source}#{RUBY_FILE_NAME_REGEX.source}$}o | 
					
						
							| 
									
										
										
										
											2024-08-27 00:32:05 -07:00
										 |  |  |     when path/"HomebrewFormula" | 
					
						
							| 
									
										
										
										
											2024-08-28 19:09:56 -07:00
										 |  |  |       %r{^HomebrewFormula/#{ZERO_OR_MORE_SUBDIRECTORIES_REGEX.source}#{RUBY_FILE_NAME_REGEX.source}$}o | 
					
						
							| 
									
										
										
										
											2024-08-27 00:32:05 -07:00
										 |  |  |     when path | 
					
						
							| 
									
										
										
										
											2024-08-28 19:09:56 -07:00
										 |  |  |       /^#{RUBY_FILE_NAME_REGEX.source}$/o | 
					
						
							| 
									
										
										
										
											2024-08-27 00:32:05 -07:00
										 |  |  |     else | 
					
						
							|  |  |  |       raise ArgumentError, "Unexpected formula_dir: #{formula_dir}" | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-10-10 17:16:18 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |   private :formula_file_regex | 
					
						
							| 
									
										
										
										
											2018-10-10 17:16:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |   # accepts the relative path of a file from {Tap}'s path | 
					
						
							|  |  |  |   sig { params(file: String).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2016-02-15 22:31:47 +08:00
										 |  |  |   def formula_file?(file) | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |     file.match?(formula_file_regex) | 
					
						
							| 
									
										
										
										
											2016-02-15 22:31:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-28 19:09:56 -07:00
										 |  |  |   CASK_FILE_REGEX = %r{^Casks/#{ZERO_OR_MORE_SUBDIRECTORIES_REGEX.source}#{RUBY_FILE_NAME_REGEX.source}$} | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |   private_constant :CASK_FILE_REGEX | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-21 16:19:25 -07:00
										 |  |  |   # accepts the relative path of a file from {Tap}'s path | 
					
						
							|  |  |  |   sig { params(file: String).returns(T::Boolean) } | 
					
						
							|  |  |  |   def cask_file?(file) | 
					
						
							|  |  |  |     file.match?(CASK_FILE_REGEX) | 
					
						
							| 
									
										
										
										
											2016-08-04 14:37:37 +04:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # An array of all {Formula} names of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def formula_names | 
					
						
							| 
									
										
										
										
											2024-04-08 09:47:06 -07:00
										 |  |  |     @formula_names ||= formula_files.map { formula_file_to_name(_1) } | 
					
						
							| 
									
										
										
										
											2020-02-21 09:56:52 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-14 21:25:52 -07:00
										 |  |  |   # A hash of all {Formula} name prefixes to versioned {Formula} in this {Tap}. | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, T::Array[String]]) } | 
					
						
							|  |  |  |   def prefix_to_versioned_formulae_names | 
					
						
							|  |  |  |     @prefix_to_versioned_formulae_names ||= formula_names | 
					
						
							|  |  |  |                                             .select { |name| name.include?("@") } | 
					
						
							|  |  |  |                                             .group_by { |name| name.gsub(/(@[\d.]+)?$/, "") } | 
					
						
							|  |  |  |                                             .transform_values(&:sort) | 
					
						
							|  |  |  |                                             .freeze | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-21 09:56:52 -05:00
										 |  |  |   # An array of all {Cask} tokens of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							| 
									
										
										
										
											2020-02-21 09:56:52 -05:00
										 |  |  |   def cask_tokens | 
					
						
							| 
									
										
										
										
											2024-04-08 09:47:06 -07:00
										 |  |  |     @cask_tokens ||= cask_files.map { formula_file_to_name(_1) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Path to the directory of all alias files for this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2015-12-06 21:15:43 +08:00
										 |  |  |   def alias_dir | 
					
						
							| 
									
										
										
										
											2016-03-23 14:55:42 +08:00
										 |  |  |     @alias_dir ||= path/"Aliases" | 
					
						
							| 
									
										
										
										
											2015-12-06 21:15:43 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # An array of all alias files of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							| 
									
										
										
										
											2015-09-12 18:21:22 +08:00
										 |  |  |   def alias_files | 
					
						
							| 
									
										
										
										
											2015-12-06 21:15:43 +08:00
										 |  |  |     @alias_files ||= Pathname.glob("#{alias_dir}/*").select(&:file?) | 
					
						
							| 
									
										
										
										
											2015-09-12 18:21:22 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # An array of all aliases of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							| 
									
										
										
										
											2015-09-12 18:21:22 +08:00
										 |  |  |   def aliases | 
					
						
							| 
									
										
										
										
											2024-02-16 22:28:30 +01:00
										 |  |  |     @aliases ||= alias_table.keys | 
					
						
							| 
									
										
										
										
											2015-09-12 18:21:22 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:52 +01:00
										 |  |  |   # Mapping from aliases to formula names. | 
					
						
							| 
									
										
										
										
											2024-02-16 22:28:30 +01:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2015-10-07 17:54:20 +08:00
										 |  |  |   def alias_table | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:52 +01:00
										 |  |  |     @alias_table ||= alias_files.each_with_object({}) do |alias_file, alias_table| | 
					
						
							|  |  |  |       alias_table[alias_file_to_name(alias_file)] = formula_file_to_name(alias_file.resolved_path) | 
					
						
							| 
									
										
										
										
											2015-10-07 17:54:20 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:06:36 +01:00
										 |  |  |   # Mapping from formula names to aliases. | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, T::Array[String]]) } | 
					
						
							| 
									
										
										
										
											2015-10-07 17:54:20 +08:00
										 |  |  |   def alias_reverse_table | 
					
						
							| 
									
										
										
										
											2024-02-23 15:06:36 +01:00
										 |  |  |     @alias_reverse_table ||= alias_table.each_with_object({}) do |(alias_name, formula_name), alias_reverse_table| | 
					
						
							|  |  |  |       alias_reverse_table[formula_name] ||= [] | 
					
						
							|  |  |  |       alias_reverse_table[formula_name] << alias_name | 
					
						
							| 
									
										
										
										
											2015-10-07 17:54:20 +08:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2018-07-25 11:38:19 +02:00
										 |  |  |   def command_dir | 
					
						
							|  |  |  |     @command_dir ||= path/"cmd" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # An array of all commands files of this {Tap}. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def command_files | 
					
						
							| 
									
										
										
										
											2018-07-25 11:38:19 +02:00
										 |  |  |     @command_files ||= if command_dir.directory? | 
					
						
							| 
									
										
										
										
											2020-02-21 09:59:07 -05:00
										 |  |  |       Commands.find_commands(command_dir) | 
					
						
							| 
									
										
										
										
											2018-07-25 11:38:19 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def to_hash | 
					
						
							| 
									
										
										
										
											2015-08-13 14:56:14 +08:00
										 |  |  |     hash = { | 
					
						
							| 
									
										
										
										
											2018-11-02 17:18:07 +00:00
										 |  |  |       "name"          => name, | 
					
						
							|  |  |  |       "user"          => user, | 
					
						
							| 
									
										
										
										
											2024-09-28 02:02:09 +08:00
										 |  |  |       "repo"          => repository, | 
					
						
							| 
									
										
										
										
											2024-09-30 07:52:02 +01:00
										 |  |  |       "repository"    => repository, | 
					
						
							| 
									
										
										
										
											2018-11-02 17:18:07 +00:00
										 |  |  |       "path"          => path.to_s, | 
					
						
							|  |  |  |       "installed"     => installed?, | 
					
						
							|  |  |  |       "official"      => official?, | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |       "formula_names" => formula_names, | 
					
						
							| 
									
										
										
										
											2020-02-21 09:56:52 -05:00
										 |  |  |       "cask_tokens"   => cask_tokens, | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-13 14:56:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if installed? | 
					
						
							| 
									
										
										
										
											2023-11-25 13:38:37 +00:00
										 |  |  |       hash["formula_files"] = formula_files.map(&:to_s) | 
					
						
							|  |  |  |       hash["cask_files"] = cask_files.map(&:to_s) | 
					
						
							|  |  |  |       hash["command_files"] = command_files.map(&:to_s) | 
					
						
							| 
									
										
										
										
											2015-08-13 14:56:14 +08:00
										 |  |  |       hash["remote"] = remote | 
					
						
							|  |  |  |       hash["custom_remote"] = custom_remote? | 
					
						
							| 
									
										
										
										
											2016-07-10 02:27:59 +02:00
										 |  |  |       hash["private"] = private? | 
					
						
							| 
									
										
										
										
											2024-09-30 11:27:35 -04:00
										 |  |  |       hash["HEAD"] = git_head || "(none)" | 
					
						
							|  |  |  |       hash["last_commit"] = git_last_commit || "never" | 
					
						
							|  |  |  |       hash["branch"] = git_branch || "(none)" | 
					
						
							| 
									
										
										
										
											2015-08-13 14:56:14 +08:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     hash | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |   # Hash with tap cask renames. | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							|  |  |  |   def cask_renames | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     @cask_renames ||= if (rename_file = path/HOMEBREW_TAP_CASK_RENAMES_FILE).file? | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |       JSON.parse(rename_file.read) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:04:40 +01:00
										 |  |  |   # Mapping from new to old cask tokens. Reverse of {#cask_renames}. | 
					
						
							| 
									
										
										
										
											2024-02-13 06:03:10 +01:00
										 |  |  |   sig { returns(T::Hash[String, T::Array[String]]) } | 
					
						
							| 
									
										
										
										
											2024-02-23 15:04:40 +01:00
										 |  |  |   def cask_reverse_renames | 
					
						
							|  |  |  |     @cask_reverse_renames ||= cask_renames.each_with_object({}) do |(old_name, new_name), hash| | 
					
						
							| 
									
										
										
										
											2024-02-13 06:03:10 +01:00
										 |  |  |       hash[new_name] ||= [] | 
					
						
							|  |  |  |       hash[new_name] << old_name | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # Hash with tap formula renames. | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2015-08-09 14:39:46 +03:00
										 |  |  |   def formula_renames | 
					
						
							| 
									
										
										
										
											2020-11-09 08:39:56 -05:00
										 |  |  |     @formula_renames ||= if (rename_file = path/HOMEBREW_TAP_FORMULA_RENAMES_FILE).file? | 
					
						
							| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  |       JSON.parse(rename_file.read) | 
					
						
							| 
									
										
										
										
											2015-08-09 14:39:46 +03:00
										 |  |  |     else | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:05:14 +01:00
										 |  |  |   # Mapping from new to old formula names. Reverse of {#formula_renames}. | 
					
						
							| 
									
										
										
										
											2023-09-28 14:07:25 +01:00
										 |  |  |   sig { returns(T::Hash[String, T::Array[String]]) } | 
					
						
							| 
									
										
										
										
											2024-02-13 06:03:10 +01:00
										 |  |  |   def formula_reverse_renames | 
					
						
							|  |  |  |     @formula_reverse_renames ||= formula_renames.each_with_object({}) do |(old_name, new_name), hash| | 
					
						
							| 
									
										
										
										
											2023-09-28 14:07:25 +01:00
										 |  |  |       hash[new_name] ||= [] | 
					
						
							|  |  |  |       hash[new_name] << old_name | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |   # Hash with tap migrations. | 
					
						
							| 
									
										
										
										
											2024-02-13 06:03:10 +01:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2016-02-25 14:14:33 +08:00
										 |  |  |   def tap_migrations | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     @tap_migrations ||= if (migration_file = path/HOMEBREW_TAP_MIGRATIONS_FILE).file? | 
					
						
							| 
									
										
										
										
											2016-11-20 13:00:01 -05:00
										 |  |  |       JSON.parse(migration_file.read) | 
					
						
							| 
									
										
										
										
											2016-02-25 14:14:33 +08:00
										 |  |  |     else | 
					
						
							|  |  |  |       {} | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 21:00:43 -08:00
										 |  |  |   sig { returns(T::Hash[String, T::Array[String]]) } | 
					
						
							|  |  |  |   def reverse_tap_migrations_renames | 
					
						
							|  |  |  |     @reverse_tap_migrations_renames ||= tap_migrations.each_with_object({}) do |(old_name, new_name), hash| | 
					
						
							| 
									
										
										
										
											2024-03-08 23:36:50 -08:00
										 |  |  |       # Only include renames: | 
					
						
							|  |  |  |       # + `homebrew/cask/water-buffalo` | 
					
						
							|  |  |  |       # - `homebrew/cask` | 
					
						
							| 
									
										
										
										
											2024-03-06 21:00:43 -08:00
										 |  |  |       next if new_name.count("/") != 2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       hash[new_name] ||= [] | 
					
						
							|  |  |  |       hash[new_name] << old_name | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 23:36:50 -08:00
										 |  |  |   # The old names a formula or cask had before getting migrated to the current tap. | 
					
						
							|  |  |  |   sig { params(current_tap: Tap, name_or_token: String).returns(T::Array[String]) } | 
					
						
							|  |  |  |   def self.tap_migration_oldnames(current_tap, name_or_token) | 
					
						
							|  |  |  |     key = "#{current_tap}/#{name_or_token}" | 
					
						
							| 
									
										
										
										
											2024-03-06 21:00:43 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Tap.each_with_object([]) do |tap, array| | 
					
						
							|  |  |  |       next unless (renames = tap.reverse_tap_migrations_renames[key]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       array.concat(renames) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 22:24:43 -05:00
										 |  |  |   # Array with autobump names | 
					
						
							|  |  |  |   sig { returns(T::Array[String]) } | 
					
						
							|  |  |  |   def autobump | 
					
						
							|  |  |  |     @autobump ||= if (autobump_file = path/HOMEBREW_TAP_AUTOBUMP_FILE).file? | 
					
						
							|  |  |  |       autobump_file.readlines(chomp: true) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Whether this {Tap} allows running bump commands on the given {Formula} or {Cask}. | 
					
						
							|  |  |  |   sig { params(formula_or_cask_name: String).returns(T::Boolean) } | 
					
						
							|  |  |  |   def allow_bump?(formula_or_cask_name) | 
					
						
							|  |  |  |     ENV["HOMEBREW_TEST_BOT_AUTOBUMP"].present? || !official? || autobump.exclude?(formula_or_cask_name) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |   # Hash with audit exceptions | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |   def audit_exceptions | 
					
						
							| 
									
										
										
										
											2024-02-23 15:07:42 +01:00
										 |  |  |     @audit_exceptions ||= read_formula_list_directory("#{HOMEBREW_TAP_AUDIT_EXCEPTIONS_DIR}/*") | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2020-11-04 23:43:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |   # Hash with style exceptions | 
					
						
							|  |  |  |   sig { returns(Hash) } | 
					
						
							|  |  |  |   def style_exceptions | 
					
						
							| 
									
										
										
										
											2024-02-23 15:07:59 +01:00
										 |  |  |     @style_exceptions ||= read_formula_list_directory("#{HOMEBREW_TAP_STYLE_EXCEPTIONS_DIR}/*") | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |   # Hash with pypi formula mappings | 
					
						
							| 
									
										
										
										
											2024-02-23 15:08:11 +01:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |   def pypi_formula_mappings | 
					
						
							| 
									
										
										
										
											2024-02-23 15:08:11 +01:00
										 |  |  |     @pypi_formula_mappings ||= read_formula_list(path/HOMEBREW_TAP_PYPI_FORMULA_MAPPINGS_FILE) | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Array with synced versions formulae | 
					
						
							|  |  |  |   sig { returns(T::Array[T::Array[String]]) } | 
					
						
							|  |  |  |   def synced_versions_formulae | 
					
						
							|  |  |  |     @synced_versions_formulae ||= if (synced_file = path/HOMEBREW_TAP_SYNCED_VERSIONS_FORMULAE_FILE).file? | 
					
						
							|  |  |  |       JSON.parse(synced_file.read) | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2023-02-15 03:24:15 +00:00
										 |  |  |   def should_report_analytics? | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     installed? && !private? | 
					
						
							| 
									
										
										
										
											2023-02-15 03:24:15 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { params(other: T.nilable(T.any(String, Tap))).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2015-12-06 22:21:27 +08:00
										 |  |  |   def ==(other) | 
					
						
							|  |  |  |     other = Tap.fetch(other) if other.is_a?(String) | 
					
						
							| 
									
										
										
										
											2024-02-23 15:02:10 +01:00
										 |  |  |     other.is_a?(self.class) && name == other.name | 
					
						
							| 
									
										
										
										
											2015-12-06 22:21:27 +08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   alias eql? == | 
					
						
							| 
									
										
										
										
											2015-12-06 22:21:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   sig { returns(Integer) } | 
					
						
							|  |  |  |   def hash | 
					
						
							|  |  |  |     [self.class, name].hash | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-08-03 17:18:13 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   # All locally installed taps. | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   sig { returns(T::Array[Tap]) } | 
					
						
							|  |  |  |   def self.installed | 
					
						
							| 
									
										
										
										
											2024-08-10 13:35:20 -07:00
										 |  |  |     cache[:installed] ||= if HOMEBREW_TAP_DIRECTORY.directory? | 
					
						
							|  |  |  |       HOMEBREW_TAP_DIRECTORY.subdirs.flat_map(&:subdirs).map { from_path(_1) } | 
					
						
							| 
									
										
										
										
											2024-02-20 15:10:26 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       [] | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-02-20 15:10:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   # All locally installed and core taps. Core taps might not be installed locally when using the API. | 
					
						
							|  |  |  |   sig { returns(T::Array[Tap]) } | 
					
						
							|  |  |  |   def self.all | 
					
						
							|  |  |  |     cache[:all] ||= begin | 
					
						
							|  |  |  |       core_taps = [ | 
					
						
							|  |  |  |         CoreTap.instance, | 
					
						
							| 
									
										
										
										
											2025-01-12 16:56:48 +00:00
										 |  |  |         # The conditional is valid here because we only want the cask tap on macOS. | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |         (CoreCaskTap.instance if OS.mac?), # rubocop:disable Homebrew/MoveToExtendOS | 
					
						
							|  |  |  |       ].compact | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       installed | core_taps | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-02-20 15:10:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Enumerate all available {Tap}s. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api public | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |   def self.each(&block) | 
					
						
							|  |  |  |     if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  |       installed.each(&block) | 
					
						
							| 
									
										
										
										
											2024-02-20 15:10:26 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2024-03-05 23:53:52 -08:00
										 |  |  |       all.each(&block) | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |   # An array of all installed {Tap} names. | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   def self.names | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     odisabled "`#{self}.names`" | 
					
						
							| 
									
										
										
										
											2024-02-28 20:18:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-14 06:13:40 +01:00
										 |  |  |     map(&:name).sort | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-12-06 21:30:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-20 12:02:24 -05:00
										 |  |  |   # An array of official taps that have been manually untapped | 
					
						
							|  |  |  |   sig { returns(T::Array[String]) } | 
					
						
							|  |  |  |   def self.untapped_official_taps | 
					
						
							|  |  |  |     Homebrew::Settings.read(:untapped)&.split(";") || [] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { params(file: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2015-12-06 21:30:23 +08:00
										 |  |  |   def formula_file_to_name(file) | 
					
						
							|  |  |  |     "#{name}/#{file.basename(".rb")}" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { params(file: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2015-12-06 21:30:23 +08:00
										 |  |  |   def alias_file_to_name(file) | 
					
						
							|  |  |  |     "#{name}/#{file.basename}" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-04-12 18:51:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-04 21:45:20 -04:00
										 |  |  |   def audit_exception(list, formula_or_cask, value = nil) | 
					
						
							|  |  |  |     return false if audit_exceptions.blank? | 
					
						
							|  |  |  |     return false unless audit_exceptions.key? list | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     list = audit_exceptions[list] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     case list | 
					
						
							|  |  |  |     when Array | 
					
						
							|  |  |  |       list.include? formula_or_cask | 
					
						
							|  |  |  |     when Hash | 
					
						
							|  |  |  |       return false unless list.include? formula_or_cask | 
					
						
							|  |  |  |       return list[formula_or_cask] if value.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-06 09:11:33 +00:00
										 |  |  |       return list[formula_or_cask].include?(value) if list[formula_or_cask].is_a?(Array) | 
					
						
							| 
									
										
										
										
											2024-11-06 10:22:47 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-04 21:45:20 -04:00
										 |  |  |       list[formula_or_cask] == value | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-03 14:42:16 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def allowed_by_env? | 
					
						
							|  |  |  |     @allowed_by_env ||= begin | 
					
						
							|  |  |  |       allowed_taps = self.class.allowed_taps | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:42 +01:00
										 |  |  |       official? || allowed_taps.blank? || allowed_taps.include?(self) | 
					
						
							| 
									
										
										
										
											2024-05-03 14:42:16 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-03 16:08:42 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def forbidden_by_env? | 
					
						
							|  |  |  |     @forbidden_by_env ||= self.class.forbidden_taps.include?(self) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-12 18:51:43 +08:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-27 17:45:42 +11:00
										 |  |  |   sig { params(file: Pathname).returns(T.any(T::Array[String], Hash)) } | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |   def read_formula_list(file) | 
					
						
							|  |  |  |     JSON.parse file.read | 
					
						
							|  |  |  |   rescue JSON::ParserError | 
					
						
							|  |  |  |     opoo "#{file} contains invalid JSON" | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  |   rescue Errno::ENOENT | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { params(directory: String).returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  |   def read_formula_list_directory(directory) | 
					
						
							|  |  |  |     list = {} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |     Pathname.glob(path/directory).each do |exception_file| | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  |       list_name = exception_file.basename.to_s.chomp(".json").to_sym | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |       list_contents = read_formula_list exception_file | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |       next if list_contents.blank? | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |       list[list_name] = list_contents | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     list | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-06-10 15:39:47 +08:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  | class AbstractCoreTap < Tap | 
					
						
							|  |  |  |   extend T::Helpers | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   abstract! | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 15:10:14 +01:00
										 |  |  |   private_class_method :fetch | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-22 21:05:48 +02:00
										 |  |  |   # Get the singleton instance for this {Tap}. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @api internal | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { returns(T.attached_class) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def self.instance | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     @instance ||= T.unsafe(self).new | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { override.void } | 
					
						
							|  |  |  |   def ensure_installed! | 
					
						
							| 
									
										
										
										
											2023-02-24 13:25:18 +00:00
										 |  |  |     return unless Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2023-02-14 09:54:24 +00:00
										 |  |  |     return if Homebrew::EnvConfig.automatically_set_no_install_from_api? | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     super | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { void } | 
					
						
							|  |  |  |   def self.ensure_installed! | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     odisabled "`#{self}.ensure_installed!`", "`#{self}.instance.ensure_installed!`" | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     instance.ensure_installed! | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-09 17:02:34 -08:00
										 |  |  |   sig { params(file: Pathname).returns(String) } | 
					
						
							|  |  |  |   def formula_file_to_name(file) | 
					
						
							|  |  |  |     file.basename(".rb").to_s | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { override.returns(T::Boolean) } | 
					
						
							|  |  |  |   def should_report_analytics? | 
					
						
							|  |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # A specialized {Tap} class for the core formulae. | 
					
						
							|  |  |  | class CoreTap < AbstractCoreTap | 
					
						
							|  |  |  |   sig { void } | 
					
						
							|  |  |  |   def initialize | 
					
						
							|  |  |  |     super "Homebrew", "core" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.void } | 
					
						
							|  |  |  |   def ensure_installed! | 
					
						
							| 
									
										
										
										
											2022-11-09 14:45:43 +00:00
										 |  |  |     return if ENV["HOMEBREW_TESTS"] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-23 15:10:27 +01:00
										 |  |  |   sig { returns(T.nilable(String)) } | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  |   def remote | 
					
						
							| 
									
										
										
										
											2024-02-23 15:10:27 +01:00
										 |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2021-12-07 00:13:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Homebrew::EnvConfig.core_git_remote | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-09 09:32:38 +01:00
										 |  |  |   # CoreTap never allows shallow clones (on request from GitHub). | 
					
						
							| 
									
										
										
										
											2024-03-08 16:21:09 +00:00
										 |  |  |   def install(quiet: false, clone_target: nil, | 
					
						
							| 
									
										
										
										
											2023-07-05 19:15:48 +01:00
										 |  |  |               custom_remote: false, verify: false, force: false) | 
					
						
							| 
									
										
										
										
											2021-10-13 19:52:44 +08:00
										 |  |  |     remote = Homebrew::EnvConfig.core_git_remote # set by HOMEBREW_CORE_GIT_REMOTE | 
					
						
							|  |  |  |     requested_remote = clone_target || remote | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-10 23:15:40 -05:00
										 |  |  |     # The remote will changed again on `brew update` since remotes for homebrew/core are mismatched | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  |     raise TapCoreRemoteMismatchError.new(name, remote, requested_remote) if requested_remote != remote | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     if remote != default_remote | 
					
						
							| 
									
										
										
										
											2023-02-10 23:15:40 -05:00
										 |  |  |       $stderr.puts "HOMEBREW_CORE_GIT_REMOTE set: using #{remote} as the Homebrew/homebrew-core Git remote." | 
					
						
							| 
									
										
										
										
											2020-09-17 04:18:13 +05:30
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2021-10-11 17:00:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 16:21:09 +00:00
										 |  |  |     super(quiet:, clone_target: remote, custom_remote:, force:) | 
					
						
							| 
									
										
										
										
											2020-01-13 09:43:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-12 18:02:23 -04:00
										 |  |  |   sig { params(manual: T::Boolean).void } | 
					
						
							|  |  |  |   def uninstall(manual: false) | 
					
						
							| 
									
										
										
										
											2023-02-24 13:25:18 +00:00
										 |  |  |     raise "Tap#uninstall is not available for CoreTap" if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2021-06-12 18:02:23 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     super | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def core_tap? | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def linuxbrew_core? | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |     remote_repository.to_s.end_with?("/linuxbrew-core") || remote_repository == "Linuxbrew/homebrew-core" | 
					
						
							| 
									
										
										
										
											2021-10-20 11:01:38 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def formula_dir | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |     @formula_dir ||= begin | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |   sig { params(name: String).returns(Pathname) } | 
					
						
							|  |  |  |   def new_formula_path(name) | 
					
						
							|  |  |  |     formula_subdir = if name.start_with?("lib") | 
					
						
							|  |  |  |       "lib" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       name[0].to_s | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return super unless (formula_dir/formula_subdir).directory? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     formula_dir/formula_subdir/"#{name.downcase}.rb" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Pathname) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def alias_dir | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |     @alias_dir ||= begin | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-08 14:10:58 +02:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def formula_renames | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |     @formula_renames ||= if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |       super | 
					
						
							| 
									
										
										
										
											2023-04-27 04:09:41 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       Homebrew::API::Formula.all_renames | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def tap_migrations | 
					
						
							| 
									
										
										
										
											2023-07-05 17:18:12 +01:00
										 |  |  |     @tap_migrations ||= if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |       super | 
					
						
							| 
									
										
										
										
											2024-02-10 22:24:36 -08:00
										 |  |  |     elsif Homebrew::API.internal_json_v3? | 
					
						
							|  |  |  |       Homebrew::API::Formula.tap_migrations | 
					
						
							| 
									
										
										
										
											2023-07-05 17:18:12 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |       migrations, = Homebrew::API.fetch_json_api_file "formula_tap_migrations.jws.json", | 
					
						
							|  |  |  |                                                       stale_seconds: TAP_MIGRATIONS_STALE_SECONDS | 
					
						
							|  |  |  |       migrations | 
					
						
							| 
									
										
										
										
											2016-03-09 17:55:35 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-05 22:24:43 -05:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							|  |  |  |   def autobump | 
					
						
							|  |  |  |     @autobump ||= begin | 
					
						
							|  |  |  |       ensure_installed! | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |   def audit_exceptions | 
					
						
							|  |  |  |     @audit_exceptions ||= begin | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2020-11-03 13:06:33 -05:00
										 |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |   def style_exceptions | 
					
						
							|  |  |  |     @style_exceptions ||= begin | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2020-11-27 01:23:07 -05:00
										 |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(Hash) } | 
					
						
							| 
									
										
										
										
											2020-11-20 18:14:45 -05:00
										 |  |  |   def pypi_formula_mappings | 
					
						
							|  |  |  |     @pypi_formula_mappings ||= begin | 
					
						
							| 
									
										
										
										
											2024-02-20 21:10:15 +01:00
										 |  |  |       ensure_installed! | 
					
						
							| 
									
										
										
										
											2020-11-20 00:55:21 -05:00
										 |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-03 01:55:56 -05:00
										 |  |  |   sig { returns(T::Array[T::Array[String]]) } | 
					
						
							|  |  |  |   def synced_versions_formulae | 
					
						
							|  |  |  |     @synced_versions_formulae ||= begin | 
					
						
							|  |  |  |       ensure_installed! | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { params(file: Pathname).returns(String) } | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  |   def alias_file_to_name(file) | 
					
						
							|  |  |  |     file.basename.to_s | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-01-23 13:32:54 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-16 22:28:30 +01:00
										 |  |  |   sig { returns(T::Hash[String, String]) } | 
					
						
							|  |  |  |   def alias_table | 
					
						
							|  |  |  |     @alias_table ||= if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       Homebrew::API::Formula.all_aliases | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-01-23 13:32:54 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  |   sig { returns(T::Array[Pathname]) } | 
					
						
							|  |  |  |   def formula_files | 
					
						
							| 
									
										
										
										
											2024-02-20 17:59:22 +01:00
										 |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 17:59:22 +01:00
										 |  |  |     formula_files_by_name.values | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { returns(T::Array[String]) } | 
					
						
							| 
									
										
										
										
											2023-01-23 13:32:54 -05:00
										 |  |  |   def formula_names | 
					
						
							| 
									
										
										
										
											2023-04-05 09:19:20 +01:00
										 |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2023-01-23 13:32:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Homebrew::API::Formula.all_formulae.keys | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, Pathname]) } | 
					
						
							|  |  |  |   def formula_files_by_name | 
					
						
							|  |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 19:26:39 -08:00
										 |  |  |     @formula_files_by_name ||= begin | 
					
						
							|  |  |  |       tap_path = path.to_s | 
					
						
							|  |  |  |       Homebrew::API::Formula.all_formulae.each_with_object({}) do |item, hash| | 
					
						
							|  |  |  |         name, formula_hash = item | 
					
						
							|  |  |  |         # If there's more than one item with the same path: use the longer one to prioritise more specific results. | 
					
						
							|  |  |  |         existing_path = hash[name] | 
					
						
							|  |  |  |         # Pathname equivalent is slow in a tight loop | 
					
						
							|  |  |  |         new_path = File.join(tap_path, formula_hash.fetch("ruby_source_path")) | 
					
						
							|  |  |  |         hash[name] = Pathname(new_path) if existing_path.nil? || existing_path.to_s.length < new_path.length | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-02-17 14:53:26 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, T.untyped]) } | 
					
						
							| 
									
										
										
										
											2024-03-04 22:42:07 -08:00
										 |  |  |   def to_internal_api_hash | 
					
						
							| 
									
										
										
										
											2024-02-17 14:53:26 -08:00
										 |  |  |     formulae_api_hash = formula_names.to_h do |name| | 
					
						
							|  |  |  |       formula = Formulary.factory(name) | 
					
						
							| 
									
										
										
										
											2024-03-04 22:42:07 -08:00
										 |  |  |       formula_hash = formula.to_hash_with_variations(hash_method: :to_internal_api_hash) | 
					
						
							| 
									
										
										
										
											2024-02-17 14:53:26 -08:00
										 |  |  |       [name, formula_hash] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "tap_git_head"   => git_head, | 
					
						
							|  |  |  |       "aliases"        => alias_table, | 
					
						
							|  |  |  |       "renames"        => formula_renames, | 
					
						
							|  |  |  |       "tap_migrations" => tap_migrations, | 
					
						
							|  |  |  |       "formulae"       => formulae_api_hash, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  | # A specialized {Tap} class for homebrew-cask. | 
					
						
							|  |  |  | class CoreCaskTap < AbstractCoreTap | 
					
						
							|  |  |  |   sig { void } | 
					
						
							|  |  |  |   def initialize | 
					
						
							|  |  |  |     super "Homebrew", "cask" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { override.returns(T::Boolean) } | 
					
						
							|  |  |  |   def core_cask_tap? | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-04 16:21:31 +01:00
										 |  |  |   sig { params(token: String).returns(Pathname) } | 
					
						
							|  |  |  |   def new_cask_path(token) | 
					
						
							| 
									
										
										
										
											2024-05-16 11:29:59 +10:00
										 |  |  |     cask_subdir = if token.start_with?("font-") | 
					
						
							|  |  |  |       "font/font-#{token.delete_prefix("font-")[0]}" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       token[0].to_s | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-05-09 20:15:48 -04:00
										 |  |  |     cask_dir/cask_subdir/"#{token.downcase}.rb" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   sig { override.returns(T::Array[Pathname]) } | 
					
						
							|  |  |  |   def cask_files | 
					
						
							| 
									
										
										
										
											2024-02-20 17:59:32 +01:00
										 |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-20 17:59:32 +01:00
										 |  |  |     cask_files_by_name.values | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.returns(T::Array[String]) } | 
					
						
							|  |  |  |   def cask_tokens | 
					
						
							|  |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Homebrew::API::Cask.all_casks.keys | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.returns(T::Hash[String, Pathname]) } | 
					
						
							|  |  |  |   def cask_files_by_name | 
					
						
							|  |  |  |     return super if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-21 23:31:43 -07:00
										 |  |  |     @cask_files_by_name ||= begin | 
					
						
							|  |  |  |       tap_path = path.to_s | 
					
						
							|  |  |  |       Homebrew::API::Cask.all_casks.each_with_object({}) do |item, hash| | 
					
						
							|  |  |  |         name, cask_hash = item | 
					
						
							|  |  |  |         # If there's more than one item with the same path: use the longer one to prioritise more specific results. | 
					
						
							|  |  |  |         existing_path = hash[name] | 
					
						
							|  |  |  |         # Pathname equivalent is slow in a tight loop | 
					
						
							|  |  |  |         new_path = File.join(tap_path, cask_hash.fetch("ruby_source_path")) | 
					
						
							|  |  |  |         hash[name] = Pathname(new_path) if existing_path.nil? || existing_path.to_s.length < new_path.length | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2023-07-13 19:28:39 +01:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.returns(T::Hash[String, String]) } | 
					
						
							|  |  |  |   def cask_renames | 
					
						
							|  |  |  |     @cask_renames ||= if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       Homebrew::API::Cask.all_renames | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.returns(Hash) } | 
					
						
							|  |  |  |   def tap_migrations | 
					
						
							|  |  |  |     @tap_migrations ||= if Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  |       super | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       migrations, = Homebrew::API.fetch_json_api_file "cask_tap_migrations.jws.json", | 
					
						
							|  |  |  |                                                       stale_seconds: TAP_MIGRATIONS_STALE_SECONDS | 
					
						
							|  |  |  |       migrations | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-06-28 15:27:20 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2024-03-02 15:01:49 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Hash[String, T.untyped]) } | 
					
						
							| 
									
										
										
										
											2024-03-04 22:42:07 -08:00
										 |  |  |   def to_internal_api_hash | 
					
						
							| 
									
										
										
										
											2024-03-02 15:01:49 -08:00
										 |  |  |     casks_api_hash = cask_tokens.to_h do |token| | 
					
						
							|  |  |  |       cask = Cask::CaskLoader.load(token) | 
					
						
							| 
									
										
										
										
											2024-03-04 22:42:07 -08:00
										 |  |  |       cask_hash = cask.to_hash_with_variations(hash_method: :to_internal_api_hash) | 
					
						
							| 
									
										
										
										
											2024-03-02 15:01:49 -08:00
										 |  |  |       [token, cask_hash] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       "tap_git_head"   => git_head, | 
					
						
							|  |  |  |       "renames"        => cask_renames, | 
					
						
							|  |  |  |       "tap_migrations" => tap_migrations, | 
					
						
							|  |  |  |       "casks"          => casks_api_hash, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-03-07 18:04:25 +08:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  | # Permanent configuration per {Tap} using `git-config(1)`. | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  | class TapConfig | 
					
						
							| 
									
										
										
										
											2024-02-23 15:10:44 +01:00
										 |  |  |   sig { returns(Tap) } | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   attr_reader :tap | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-24 10:57:41 +00:00
										 |  |  |   sig { params(tap: Tap).void } | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   def initialize(tap) | 
					
						
							|  |  |  |     @tap = tap | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   sig { params(key: Symbol).returns(T.nilable(T::Boolean)) } | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   def [](key) | 
					
						
							|  |  |  |     return unless tap.git? | 
					
						
							| 
									
										
										
										
											2020-08-23 06:32:26 +02:00
										 |  |  |     return unless Utils::Git.available? | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |     case Homebrew::Settings.read(key, repo: tap.path) | 
					
						
							|  |  |  |     when "true" then true | 
					
						
							|  |  |  |     when "false" then false | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   sig { params(key: Symbol, value: T::Boolean).void } | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   def []=(key, value) | 
					
						
							|  |  |  |     return unless tap.git? | 
					
						
							| 
									
										
										
										
											2020-08-23 06:32:26 +02:00
										 |  |  |     return unless Utils::Git.available? | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-13 11:16:09 -05:00
										 |  |  |     Homebrew::Settings.write key, value.to_s, repo: tap.path | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2022-05-06 11:57:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-04 18:05:17 +01:00
										 |  |  |   sig { params(key: Symbol).void } | 
					
						
							| 
									
										
										
										
											2022-05-06 11:57:43 +08:00
										 |  |  |   def delete(key) | 
					
						
							|  |  |  |     return unless tap.git? | 
					
						
							|  |  |  |     return unless Utils::Git.available? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Homebrew::Settings.delete key, repo: tap.path | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-04-12 11:00:23 +01:00
										 |  |  | end |