| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-03 13:09:07 +01:00
										 |  |  | require "dependable" | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | # A dependency on another Homebrew formula. | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  | # | 
					
						
							|  |  |  | # @api internal | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | class Dependency | 
					
						
							|  |  |  |   include Dependable | 
					
						
							| 
									
										
										
										
											2021-03-19 03:21:27 +00:00
										 |  |  |   extend Cachable | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 14:05:21 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   attr_reader :name | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T.nilable(Tap)) } | 
					
						
							|  |  |  |   attr_reader :tap | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-02 17:36:26 +00:00
										 |  |  |   def initialize(name, tags = []) | 
					
						
							| 
									
										
										
										
											2018-06-01 19:22:33 +01:00
										 |  |  |     raise ArgumentError, "Dependency must have a name!" unless name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:43 -06:00
										 |  |  |     @name = name | 
					
						
							| 
									
										
										
										
											2013-05-06 16:08:50 -05:00
										 |  |  |     @tags = tags | 
					
						
							| 
									
										
										
										
											2023-06-19 04:37:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 03:13:56 +01:00
										 |  |  |     return unless (tap_with_name = Tap.with_formula_name(name)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @tap, = tap_with_name | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def ==(other) | 
					
						
							| 
									
										
										
										
											2014-11-21 16:08:37 -06:00
										 |  |  |     instance_of?(other.class) && name == other.name && tags == other.tags | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-09-23 18:13:48 +02:00
										 |  |  |   alias eql? == | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def hash | 
					
						
							| 
									
										
										
										
											2022-04-23 01:48:15 +01:00
										 |  |  |     [name, tags].hash | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def to_formula | 
					
						
							| 
									
										
										
										
											2023-12-10 00:57:30 -05:00
										 |  |  |     formula = Formulary.factory(name, warn: false) | 
					
						
							| 
									
										
										
										
											2014-08-11 17:48:30 -05:00
										 |  |  |     formula.build = BuildOptions.new(options, formula.options) | 
					
						
							|  |  |  |     formula | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-10 17:17:24 +00:00
										 |  |  |   sig { params(minimum_version: T.nilable(Version), minimum_revision: T.nilable(Integer)).returns(T::Boolean) } | 
					
						
							|  |  |  |   def installed?(minimum_version: nil, minimum_revision: nil) | 
					
						
							| 
									
										
										
										
											2023-09-02 21:46:07 -04:00
										 |  |  |     formula = begin | 
					
						
							|  |  |  |       to_formula | 
					
						
							|  |  |  |     rescue FormulaUnavailableError | 
					
						
							|  |  |  |       nil | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     return false unless formula | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-14 16:46:53 +00:00
										 |  |  |     return true if formula.latest_version_installed? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return false if minimum_version.blank? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-18 15:30:04 +01:00
										 |  |  |     # If the opt prefix doesn't exist: we likely have an incomplete installation. | 
					
						
							|  |  |  |     return false unless formula.opt_prefix.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     installed_keg = formula.any_installed_keg | 
					
						
							|  |  |  |     return false unless installed_keg | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # If the keg name doesn't match, we may have moved from an alias to a full formula and need to upgrade. | 
					
						
							|  |  |  |     return false unless formula.possible_names.include?(installed_keg.name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     installed_version = installed_keg.version | 
					
						
							| 
									
										
										
										
											2023-11-14 16:46:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Tabs prior to 4.1.18 did not have revision or pkg_version fields. | 
					
						
							|  |  |  |     # As a result, we have to be more conversative when we do not have | 
					
						
							|  |  |  |     # a minimum revision from the tab and assume that if the formula has a | 
					
						
							|  |  |  |     # the same version and a non-zero revision that it needs upgraded. | 
					
						
							|  |  |  |     if minimum_revision.present? | 
					
						
							|  |  |  |       minimum_pkg_version = PkgVersion.new(minimum_version, minimum_revision) | 
					
						
							|  |  |  |       installed_version >= minimum_pkg_version | 
					
						
							|  |  |  |     elsif installed_version.version == minimum_version | 
					
						
							|  |  |  |       formula.revision.zero? | 
					
						
							| 
									
										
										
										
											2023-09-02 21:46:07 -04:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2023-11-14 16:46:53 +00:00
										 |  |  |       installed_version.version > minimum_version | 
					
						
							| 
									
										
										
										
											2023-09-02 21:46:07 -04:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2019-12-03 11:42:09 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-10 17:17:24 +00:00
										 |  |  |   def satisfied?(inherited_options = [], minimum_version: nil, minimum_revision: nil) | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |     installed?(minimum_version:, minimum_revision:) && | 
					
						
							| 
									
										
										
										
											2023-11-10 17:17:24 +00:00
										 |  |  |       missing_options(inherited_options).empty? | 
					
						
							| 
									
										
										
										
											2013-01-27 19:40:10 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-23 22:41:35 -05:00
										 |  |  |   def missing_options(inherited_options) | 
					
						
							| 
									
										
										
										
											2016-12-10 17:58:41 +00:00
										 |  |  |     formula = to_formula | 
					
						
							|  |  |  |     required = options | 
					
						
							|  |  |  |     required |= inherited_options | 
					
						
							|  |  |  |     required &= formula.options.to_a | 
					
						
							|  |  |  |     required -= Tab.for_formula(formula).used_options | 
					
						
							|  |  |  |     required | 
					
						
							| 
									
										
										
										
											2013-01-27 19:40:10 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-02 17:36:26 +00:00
										 |  |  |   def option_names | 
					
						
							|  |  |  |     [name.split("/").last].freeze | 
					
						
							| 
									
										
										
										
											2013-06-03 15:08:47 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |   sig { overridable.returns(T::Boolean) } | 
					
						
							|  |  |  |   def uses_from_macos? | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-06 01:00:39 +01:00
										 |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def to_s = name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |   sig { returns(String) } | 
					
						
							| 
									
										
										
										
											2013-06-07 20:36:13 -05:00
										 |  |  |   def inspect | 
					
						
							| 
									
										
										
										
											2014-07-01 15:07:06 -05:00
										 |  |  |     "#<#{self.class.name}: #{name.inspect} #{tags.inspect}>" | 
					
						
							| 
									
										
										
										
											2013-06-07 20:36:13 -05:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 23:01:31 +01:00
										 |  |  |   sig { params(formula: Formula).returns(T.self_type) } | 
					
						
							|  |  |  |   def dup_with_formula_name(formula) | 
					
						
							| 
									
										
										
										
											2024-01-02 17:36:26 +00:00
										 |  |  |     self.class.new(formula.full_name.to_s, tags) | 
					
						
							| 
									
										
										
										
											2023-06-28 23:01:31 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |   class << self | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |     # Expand the dependencies of each dependent recursively, optionally yielding | 
					
						
							| 
									
										
										
										
											2018-10-18 21:42:43 -04:00
										 |  |  |     # `[dependent, dep]` pairs to allow callers to apply arbitrary filters to | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     # the list. | 
					
						
							|  |  |  |     # The default filter, which is applied when a block is not given, omits | 
					
						
							| 
									
										
										
										
											2023-07-17 12:30:12 -07:00
										 |  |  |     # optionals and recommends based on what the dependent has asked for | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @api internal | 
					
						
							| 
									
										
										
										
											2022-06-14 15:03:55 -04:00
										 |  |  |     def expand(dependent, deps = dependent.deps, cache_key: nil, &block) | 
					
						
							| 
									
										
										
										
											2016-01-18 08:59:43 +00:00
										 |  |  |       # Keep track dependencies to avoid infinite cyclic dependency recursion. | 
					
						
							|  |  |  |       @expand_stack ||= [] | 
					
						
							|  |  |  |       @expand_stack.push dependent.name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 03:21:27 +00:00
										 |  |  |       if cache_key.present? | 
					
						
							|  |  |  |         cache[cache_key] ||= {} | 
					
						
							| 
									
										
										
										
											2021-05-29 18:08:42 -04:00
										 |  |  |         return cache[cache_key][cache_id dependent].dup if cache[cache_key][cache_id dependent] | 
					
						
							| 
									
										
										
										
											2021-03-19 03:21:27 +00:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-13 15:38:39 -05:00
										 |  |  |       expanded_deps = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       deps.each do |dep| | 
					
						
							| 
									
										
										
										
											2014-02-27 14:22:42 -06:00
										 |  |  |         next if dependent.name == dep.name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 15:03:55 -04:00
										 |  |  |         case action(dependent, dep, &block) | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |         when :prune | 
					
						
							| 
									
										
										
										
											2014-02-13 15:38:39 -05:00
										 |  |  |           next | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |         when :skip | 
					
						
							| 
									
										
										
										
											2016-01-18 08:59:43 +00:00
										 |  |  |           next if @expand_stack.include? dep.name | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |           expanded_deps.concat(expand(dep.to_formula, cache_key:, &block)) | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  |         when :keep_but_prune_recursive_deps | 
					
						
							| 
									
										
										
										
											2014-02-13 15:38:39 -05:00
										 |  |  |           expanded_deps << dep | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2016-01-18 08:59:43 +00:00
										 |  |  |           next if @expand_stack.include? dep.name | 
					
						
							| 
									
										
										
										
											2018-09-17 02:45:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 23:01:31 +01:00
										 |  |  |           dep_formula = dep.to_formula | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |           expanded_deps.concat(expand(dep_formula, cache_key:, &block)) | 
					
						
							| 
									
										
										
										
											2023-06-28 23:01:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |           # Fixes names for renamed/aliased formulae. | 
					
						
							|  |  |  |           dep = dep.dup_with_formula_name(dep_formula) | 
					
						
							| 
									
										
										
										
											2014-02-13 15:38:39 -05:00
										 |  |  |           expanded_deps << dep | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2014-02-13 15:38:39 -05:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-19 03:21:27 +00:00
										 |  |  |       expanded_deps = merge_repeats(expanded_deps) | 
					
						
							| 
									
										
										
										
											2021-05-29 18:08:42 -04:00
										 |  |  |       cache[cache_key][cache_id dependent] = expanded_deps.dup if cache_key.present? | 
					
						
							| 
									
										
										
										
											2021-03-19 03:21:27 +00:00
										 |  |  |       expanded_deps | 
					
						
							| 
									
										
										
										
											2016-02-06 13:32:12 +08:00
										 |  |  |     ensure | 
					
						
							|  |  |  |       @expand_stack.pop | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-14 15:03:55 -04:00
										 |  |  |     def action(dependent, dep, &block) | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |       catch(:action) do | 
					
						
							| 
									
										
										
										
											2020-11-16 22:18:56 +01:00
										 |  |  |         if block | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |           yield dependent, dep | 
					
						
							|  |  |  |         elsif dep.optional? || dep.recommended? | 
					
						
							| 
									
										
										
										
											2013-12-09 14:36:10 -06:00
										 |  |  |           prune unless dependent.build.with?(dep) | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |     # Prune a dependency and its dependencies recursively. | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     sig { void } | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     def prune | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |       throw(:action, :prune) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |     # Prune a single dependency but do not prune its dependencies. | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     sig { void } | 
					
						
							| 
									
										
										
										
											2013-07-22 21:36:11 -05:00
										 |  |  |     def skip | 
					
						
							|  |  |  |       throw(:action, :skip) | 
					
						
							| 
									
										
										
										
											2013-05-10 23:45:05 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-05 17:17:03 -05:00
										 |  |  |     # Keep a dependency, but prune its dependencies. | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |     # | 
					
						
							|  |  |  |     # @api internal | 
					
						
							| 
									
										
										
										
											2020-10-20 12:03:48 +02:00
										 |  |  |     sig { void } | 
					
						
							| 
									
										
										
										
											2013-11-13 10:38:14 -06:00
										 |  |  |     def keep_but_prune_recursive_deps | 
					
						
							|  |  |  |       throw(:action, :keep_but_prune_recursive_deps) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-21 16:08:37 -06:00
										 |  |  |     def merge_repeats(all) | 
					
						
							| 
									
										
										
										
											2014-11-21 22:25:36 -06:00
										 |  |  |       grouped = all.group_by(&:name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       all.map(&:name).uniq.map do |name| | 
					
						
							|  |  |  |         deps = grouped.fetch(name) | 
					
						
							| 
									
										
										
										
											2014-11-21 16:08:37 -06:00
										 |  |  |         dep  = deps.first | 
					
						
							| 
									
										
										
										
											2015-12-15 10:50:38 +01:00
										 |  |  |         tags = merge_tags(deps) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |         kwargs = {} | 
					
						
							|  |  |  |         kwargs[:bounds] = dep.bounds if dep.uses_from_macos? | 
					
						
							| 
									
										
										
										
											2024-01-02 17:36:26 +00:00
										 |  |  |         dep.class.new(name, tags, **kwargs) | 
					
						
							| 
									
										
										
										
											2013-06-07 22:27:30 -05:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-12-15 10:50:38 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-29 18:08:42 -04:00
										 |  |  |     def cache_id(dependent) | 
					
						
							|  |  |  |       "#{dependent.full_name}_#{dependent.class}" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-15 10:50:38 +01:00
										 |  |  |     def merge_tags(deps) | 
					
						
							| 
									
										
										
										
											2018-03-08 09:46:53 +00:00
										 |  |  |       other_tags = deps.flat_map(&:option_tags).uniq | 
					
						
							|  |  |  |       other_tags << :test if deps.flat_map(&:tags).include?(:test) | 
					
						
							|  |  |  |       merge_necessity(deps) + merge_temporality(deps) + other_tags | 
					
						
							| 
									
										
										
										
											2015-12-15 10:50:38 +01:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def merge_necessity(deps) | 
					
						
							|  |  |  |       # Cannot use `deps.any?(&:required?)` here due to its definition. | 
					
						
							|  |  |  |       if deps.any? { |dep| !dep.recommended? && !dep.optional? } | 
					
						
							|  |  |  |         [] # Means required dependency. | 
					
						
							|  |  |  |       elsif deps.any?(&:recommended?) | 
					
						
							|  |  |  |         [:recommended] | 
					
						
							|  |  |  |       else # deps.all?(&:optional?) | 
					
						
							|  |  |  |         [:optional] | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def merge_temporality(deps) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:06:15 +01:00
										 |  |  |       new_tags = [] | 
					
						
							|  |  |  |       new_tags << :build if deps.all?(&:build?) | 
					
						
							|  |  |  |       new_tags << :implicit if deps.all?(&:implicit?) | 
					
						
							|  |  |  |       new_tags | 
					
						
							| 
									
										
										
										
											2015-12-15 10:50:38 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2013-01-26 20:05:39 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 14:46:15 -04:00
										 |  |  | # A dependency that's marked as "installed" on macOS | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  | class UsesFromMacOSDependency < Dependency | 
					
						
							|  |  |  |   attr_reader :bounds | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-13 00:42:54 +01:00
										 |  |  |   sig { params(name: String, tags: T::Array[Symbol], bounds: T::Hash[Symbol, Symbol]).void } | 
					
						
							| 
									
										
										
										
											2024-01-02 17:36:26 +00:00
										 |  |  |   def initialize(name, tags = [], bounds:) | 
					
						
							|  |  |  |     super(name, tags) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @bounds = bounds | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-28 17:33:01 -04:00
										 |  |  |   def ==(other) | 
					
						
							|  |  |  |     instance_of?(other.class) && name == other.name && tags == other.tags && bounds == other.bounds | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def hash | 
					
						
							|  |  |  |     [name, tags, bounds].hash | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-10 17:17:24 +00:00
										 |  |  |   sig { params(minimum_version: T.nilable(Version), minimum_revision: T.nilable(Integer)).returns(T::Boolean) } | 
					
						
							|  |  |  |   def installed?(minimum_version: nil, minimum_revision: nil) | 
					
						
							| 
									
										
										
										
											2024-05-23 17:08:41 +01:00
										 |  |  |     use_macos_install? || super | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(T::Boolean) } | 
					
						
							|  |  |  |   def use_macos_install? | 
					
						
							|  |  |  |     # Check whether macOS is new enough for dependency to not be required. | 
					
						
							|  |  |  |     if Homebrew::SimulateSystem.simulating_or_running_on_macos? | 
					
						
							|  |  |  |       # Assume the oldest macOS version when simulating a generic macOS version | 
					
						
							|  |  |  |       return true if Homebrew::SimulateSystem.current_os == :macos && !bounds.key?(:since) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if Homebrew::SimulateSystem.current_os != :macos | 
					
						
							|  |  |  |         current_os = MacOSVersion.from_symbol(Homebrew::SimulateSystem.current_os) | 
					
						
							|  |  |  |         since_os = MacOSVersion.from_symbol(bounds[:since]) if bounds.key?(:since) | 
					
						
							|  |  |  |         return true if current_os >= since_os | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     false | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.returns(T::Boolean) } | 
					
						
							|  |  |  |   def uses_from_macos? | 
					
						
							|  |  |  |     true | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   sig { override.params(formula: Formula).returns(T.self_type) } | 
					
						
							|  |  |  |   def dup_with_formula_name(formula) | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |     self.class.new(formula.full_name.to_s, tags, bounds:) | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-08-28 12:20:15 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   sig { returns(String) } | 
					
						
							|  |  |  |   def inspect | 
					
						
							|  |  |  |     "#<#{self.class.name}: #{name.inspect} #{tags.inspect} #{bounds.inspect}>" | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2023-06-19 06:03:31 +01:00
										 |  |  | end |