| 
									
										
										
										
											2023-04-26 09:13:00 -07:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Utils | 
					
						
							|  |  |  |   # Helper function for finding autoremovable formulae. | 
					
						
							|  |  |  |   # | 
					
						
							|  |  |  |   # @private | 
					
						
							|  |  |  |   module Autoremove | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |     class << self | 
					
						
							| 
									
										
										
										
											2023-04-26 09:11:21 -07:00
										 |  |  |       # An array of {Formula} without {Formula} or {Cask} | 
					
						
							|  |  |  |       # dependents that weren't installed on request and without | 
					
						
							|  |  |  |       # build dependencies for {Formula} installed from source. | 
					
						
							|  |  |  |       # @private | 
					
						
							| 
									
										
										
										
											2023-04-26 09:13:00 -07:00
										 |  |  |       sig { params(formulae: T::Array[Formula], casks: T::Array[Cask::Cask]).returns(T::Array[Formula]) } | 
					
						
							| 
									
										
										
										
											2023-04-26 09:11:21 -07:00
										 |  |  |       def removable_formulae(formulae, casks) | 
					
						
							|  |  |  |         unused_formulae = unused_formulae_with_no_formula_dependents(formulae) | 
					
						
							|  |  |  |         unused_formulae - formulae_with_cask_dependents(casks) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:12:08 -07:00
										 |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |       # An array of all installed {Formula} with {Cask} dependents. | 
					
						
							|  |  |  |       # @private | 
					
						
							| 
									
										
										
										
											2023-04-26 09:13:00 -07:00
										 |  |  |       sig { params(casks: T::Array[Cask::Cask]).returns(T::Array[Formula]) } | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |       def formulae_with_cask_dependents(casks) | 
					
						
							|  |  |  |         casks.flat_map { |cask| cask.depends_on[:formula] } | 
					
						
							|  |  |  |              .compact | 
					
						
							|  |  |  |              .map { |f| Formula[f] } | 
					
						
							|  |  |  |              .flat_map { |f| [f, *f.runtime_formula_dependencies].compact } | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |       # An array of all installed bottled {Formula} without runtime {Formula} | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |       # dependents for bottles and without build {Formula} dependents | 
					
						
							|  |  |  |       # for those built from source. | 
					
						
							|  |  |  |       # @private | 
					
						
							| 
									
										
										
										
											2023-04-26 09:13:00 -07:00
										 |  |  |       sig { params(formulae: T::Array[Formula]).returns(T::Array[Formula]) } | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |       def bottled_formulae_with_no_formula_dependents(formulae) | 
					
						
							|  |  |  |         formulae_to_keep = T.let([], T::Array[Formula]) | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |         formulae.each do |formula| | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |           formulae_to_keep += formula.runtime_formula_dependencies | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |           if (tab = formula.any_installed_keg&.tab) | 
					
						
							|  |  |  |             # Ignore build dependencies when the formula is a bottle | 
					
						
							|  |  |  |             next if tab.poured_from_bottle | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Keep the formula if it was built from source | 
					
						
							|  |  |  |             formulae_to_keep << formula | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |           formula.deps.select(&:build?).each do |dep| | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |             formulae_to_keep << dep.to_formula | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |           rescue FormulaUnavailableError | 
					
						
							|  |  |  |             # do nothing | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-06-14 17:26:28 +01:00
										 |  |  |         formulae - formulae_to_keep | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |       # Recursive function that returns an array of {Formula} without | 
					
						
							|  |  |  |       # {Formula} dependents that weren't installed on request. | 
					
						
							|  |  |  |       # @private | 
					
						
							| 
									
										
										
										
											2023-04-26 09:13:00 -07:00
										 |  |  |       sig { params(formulae: T::Array[Formula]).returns(T::Array[Formula]) } | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |       def unused_formulae_with_no_formula_dependents(formulae) | 
					
						
							| 
									
										
										
										
											2024-06-28 21:57:47 -04:00
										 |  |  |         unused_formulae = bottled_formulae_with_no_formula_dependents(formulae).select do |f| | 
					
						
							|  |  |  |           f.any_installed_keg&.tab&.installed_on_request == false | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |         unless unused_formulae.empty? | 
					
						
							|  |  |  |           unused_formulae += unused_formulae_with_no_formula_dependents(formulae - unused_formulae) | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-26 09:10:30 -07:00
										 |  |  |         unused_formulae | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2022-09-13 23:23:48 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |