| 
									
										
										
										
											2024-08-12 10:30:59 +01:00
										 |  |  | # typed: true # rubocop:todo Sorbet/StrictSigil | 
					
						
							| 
									
										
										
										
											2021-02-12 01:42:17 +05:30
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require "cask_dependent" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Helper functions for installed dependents. | 
					
						
							|  |  |  | module InstalledDependents | 
					
						
							|  |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Given an array of kegs, this method will try to find some other kegs | 
					
						
							|  |  |  |   # or casks that depend on them. If it does, it returns: | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # - some kegs in the passed array that have installed dependents | 
					
						
							|  |  |  |   # - some installed dependents of those kegs. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # If it doesn't, it returns nil. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # Note that nil will be returned if the only installed dependents of the | 
					
						
							|  |  |  |   # passed kegs are other kegs in the array or casks present in the casks | 
					
						
							|  |  |  |   # parameter. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # For efficiency, we don't bother trying to get complete data. | 
					
						
							|  |  |  |   def find_some_installed_dependents(kegs, casks: []) | 
					
						
							|  |  |  |     keg_names = kegs.select(&:optlinked?).map(&:name) | 
					
						
							|  |  |  |     keg_formulae = [] | 
					
						
							|  |  |  |     kegs_by_source = kegs.group_by do |keg| | 
					
						
							|  |  |  |       # First, attempt to resolve the keg to a formula | 
					
						
							|  |  |  |       # to get up-to-date name and tap information. | 
					
						
							|  |  |  |       f = keg.to_formula | 
					
						
							|  |  |  |       keg_formulae << f | 
					
						
							|  |  |  |       [f.name, f.tap] | 
					
						
							|  |  |  |     rescue | 
					
						
							|  |  |  |       # If the formula for the keg can't be found, | 
					
						
							|  |  |  |       # fall back to the information in the tab. | 
					
						
							|  |  |  |       [keg.name, keg.tab.tap] | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_required_kegs = Set.new | 
					
						
							|  |  |  |     all_dependents = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Don't include dependencies of kegs that were in the given array. | 
					
						
							|  |  |  |     dependents_to_check = (Formula.installed - keg_formulae) + (Cask::Caskroom.casks - casks) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dependents_to_check.each do |dependent| | 
					
						
							|  |  |  |       required = case dependent | 
					
						
							|  |  |  |       when Formula | 
					
						
							|  |  |  |         dependent.missing_dependencies(hide: keg_names) | 
					
						
							|  |  |  |       when Cask::Cask | 
					
						
							| 
									
										
										
										
											2021-07-16 13:13:12 +01:00
										 |  |  |         # When checking for cask dependents, we don't care about missing or non-runtime dependencies | 
					
						
							| 
									
										
										
										
											2022-02-10 00:29:39 +09:00
										 |  |  |         CaskDependent.new(dependent).runtime_dependencies.map(&:to_formula) | 
					
						
							| 
									
										
										
										
											2021-02-12 01:42:17 +05:30
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-22 23:29:55 +00:00
										 |  |  |       required_kegs = required.filter_map do |f| | 
					
						
							| 
									
										
										
										
											2021-02-12 01:42:17 +05:30
										 |  |  |         f_kegs = kegs_by_source[[f.name, f.tap]] | 
					
						
							|  |  |  |         next unless f_kegs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-31 16:53:15 -07:00
										 |  |  |         f_kegs.max_by(&:scheme_and_version) | 
					
						
							| 
									
										
										
										
											2024-02-22 23:29:55 +00:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-02-12 01:42:17 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |       next if required_kegs.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       all_required_kegs += required_kegs | 
					
						
							|  |  |  |       all_dependents << dependent.to_s | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return if all_required_kegs.empty? | 
					
						
							|  |  |  |     return if all_dependents.empty? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     [all_required_kegs.to_a, all_dependents.sort] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |