@@ -48,10 +48,15 @@ def to_formula
4848 end
4949
5050 sig {
51- params ( minimum_version : T . nilable ( Version ) , minimum_revision : T . nilable ( Integer ) ,
52- minimum_compatibility_version : T . nilable ( Integer ) ) . returns ( T ::Boolean )
51+ params (
52+ minimum_version : T . nilable ( Version ) ,
53+ minimum_revision : T . nilable ( Integer ) ,
54+ minimum_compatibility_version : T . nilable ( Integer ) ,
55+ bottle_os_version : T . nilable ( String ) ,
56+ ) . returns ( T ::Boolean )
5357 }
54- def installed? ( minimum_version : nil , minimum_revision : nil , minimum_compatibility_version : nil )
58+ def installed? ( minimum_version : nil , minimum_revision : nil , minimum_compatibility_version : nil ,
59+ bottle_os_version : nil )
5560 formula = begin
5661 to_installed_formula
5762 rescue FormulaUnavailableError
@@ -100,8 +105,8 @@ def installed?(minimum_version: nil, minimum_revision: nil, minimum_compatibilit
100105 end
101106
102107 def satisfied? ( inherited_options = [ ] , minimum_version : nil , minimum_revision : nil ,
103- minimum_compatibility_version : nil )
104- installed? ( minimum_version :, minimum_revision :, minimum_compatibility_version :) &&
108+ minimum_compatibility_version : nil , bottle_os_version : nil )
109+ installed? ( minimum_version :, minimum_revision :, minimum_compatibility_version :, bottle_os_version : ) &&
105110 missing_options ( inherited_options ) . empty?
106111 end
107112
@@ -312,25 +317,39 @@ def hash
312317 end
313318
314319 sig {
315- params ( minimum_version : T . nilable ( Version ) , minimum_revision : T . nilable ( Integer ) ,
316- minimum_compatibility_version : T . nilable ( Integer ) ) . returns ( T ::Boolean )
320+ params (
321+ minimum_version : T . nilable ( Version ) ,
322+ minimum_revision : T . nilable ( Integer ) ,
323+ minimum_compatibility_version : T . nilable ( Integer ) ,
324+ bottle_os_version : T . nilable ( String ) ,
325+ ) . returns ( T ::Boolean )
317326 }
318- def installed? ( minimum_version : nil , minimum_revision : nil , minimum_compatibility_version : nil )
319- use_macos_install? || super
327+ def installed? ( minimum_version : nil , minimum_revision : nil , minimum_compatibility_version : nil ,
328+ bottle_os_version : nil )
329+ use_macos_install? ( bottle_os_version :) || super
320330 end
321331
322- sig { returns ( T ::Boolean ) }
323- def use_macos_install?
332+ sig { params ( bottle_os_version : T . nilable ( String ) ) . returns ( T ::Boolean ) }
333+ def use_macos_install? ( bottle_os_version : nil )
324334 # Check whether macOS is new enough for dependency to not be required.
325335 if Homebrew ::SimulateSystem . simulating_or_running_on_macos?
326- # Assume the oldest macOS version when simulating a generic macOS version
327- return true if Homebrew ::SimulateSystem . current_os == :macos && !bounds . key? ( :since )
328-
329- if Homebrew ::SimulateSystem . current_os != :macos
330- current_os = MacOSVersion . from_symbol ( Homebrew ::SimulateSystem . current_os )
331- since_os = MacOSVersion . from_symbol ( bounds [ :since ] ) if bounds . key? ( :since )
332- return true if current_os >= since_os
336+ # If there's no since bound, the dependency is always available from macOS
337+ since_os_bounds = bounds [ :since ]
338+ return true if since_os_bounds . blank?
339+
340+ # When installing a bottle built on an older macOS version, use that version
341+ # to determine if the dependency should come from macOS or Homebrew
342+ effective_os = if bottle_os_version . present? &&
343+ bottle_os_version . start_with? ( "macOS " )
344+ # bottle_os_version is a string like "14" for Sonoma, "15" for Sequoia
345+ # Convert it to a MacOS version symbol for comparison
346+ MacOSVersion . new ( bottle_os_version . delete_prefix ( "macOS " ) )
347+ else
348+ MacOSVersion . from_symbol ( Homebrew ::SimulateSystem . current_os )
333349 end
350+
351+ since_os = MacOSVersion . from_symbol ( since_os_bounds )
352+ return true if effective_os >= since_os
334353 end
335354
336355 false
0 commit comments