| 
									
										
										
										
											2024-03-10 13:21:40 -07:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  | require "abstract_command" | 
					
						
							| 
									
										
										
										
											2018-11-11 18:35:55 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-18 22:41:47 -05:00
										 |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  |   module Cmd | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  |     class Untap < AbstractCommand | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  |       cmd_args do | 
					
						
							|  |  |  |         description <<~EOS | 
					
						
							|  |  |  |           Remove a tapped formula repository. | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |         switch "-f", "--force", | 
					
						
							|  |  |  |                description: "Untap even if formulae or casks from this tap are currently installed." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         named_args :tap, min: 1
 | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2021-10-28 17:13:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  |       sig { override.void } | 
					
						
							|  |  |  |       def run | 
					
						
							|  |  |  |         args.named.to_installed_taps.each do |tap| | 
					
						
							|  |  |  |           odie "Untapping #{tap} is not allowed" if tap.core_tap? && Homebrew::EnvConfig.no_install_from_api? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           if Homebrew::EnvConfig.no_install_from_api? || (!tap.core_tap? && !tap.core_cask_tap?) | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  |             installed_tap_formulae = installed_formulae_for(tap:) | 
					
						
							|  |  |  |             installed_tap_casks = installed_casks_for(tap:) | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if installed_tap_formulae.present? || installed_tap_casks.present? | 
					
						
							|  |  |  |               installed_names = (installed_tap_formulae + installed_tap_casks.map(&:token)).join("\n") | 
					
						
							|  |  |  |               if args.force? || Homebrew::EnvConfig.developer? | 
					
						
							|  |  |  |                 opoo <<~EOS | 
					
						
							|  |  |  |                   Untapping #{tap} even though it contains the following installed formulae or casks: | 
					
						
							|  |  |  |                   #{installed_names} | 
					
						
							|  |  |  |                 EOS | 
					
						
							|  |  |  |               else | 
					
						
							|  |  |  |                 odie <<~EOS | 
					
						
							|  |  |  |                   Refusing to untap #{tap} because it contains the following installed formulae or casks: | 
					
						
							|  |  |  |                   #{installed_names} | 
					
						
							|  |  |  |                 EOS | 
					
						
							|  |  |  |               end | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2021-10-28 17:13:34 -04:00
										 |  |  |           end | 
					
						
							| 
									
										
										
										
											2024-04-01 11:50:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |           tap.uninstall manual: true | 
					
						
							| 
									
										
										
										
											2020-12-04 21:19:48 +01:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2024-04-02 23:10:37 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       # All installed formulae currently available in a tap by formula full name. | 
					
						
							|  |  |  |       sig { params(tap: Tap).returns(T::Array[Formula]) } | 
					
						
							|  |  |  |       def installed_formulae_for(tap:) | 
					
						
							|  |  |  |         tap.formula_names.filter_map do |formula_name| | 
					
						
							|  |  |  |           next unless installed_formulae_names.include?(T.must(formula_name.split("/").last)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           formula = begin | 
					
						
							|  |  |  |             Formulary.factory(formula_name) | 
					
						
							|  |  |  |           rescue FormulaUnavailableError | 
					
						
							|  |  |  |             # Don't blow up because of a single unavailable formula. | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           # Can't use Formula#any_version_installed? because it doesn't consider | 
					
						
							|  |  |  |           # taps correctly. | 
					
						
							|  |  |  |           formula if formula.installed_kegs.any? { |keg| keg.tab.tap == tap } | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # All installed casks currently available in a tap by cask full name. | 
					
						
							|  |  |  |       sig { params(tap: Tap).returns(T::Array[Cask::Cask]) } | 
					
						
							|  |  |  |       def installed_casks_for(tap:) | 
					
						
							|  |  |  |         tap.cask_tokens.filter_map do |cask_token| | 
					
						
							|  |  |  |           next unless installed_cask_tokens.include?(T.must(cask_token.split("/").last)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cask = begin | 
					
						
							|  |  |  |             Cask::CaskLoader.load(cask_token) | 
					
						
							|  |  |  |           rescue Cask::CaskUnavailableError | 
					
						
							|  |  |  |             # Don't blow up because of a single unavailable cask. | 
					
						
							|  |  |  |             next | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           cask if cask.installed? | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T::Set[String]) } | 
					
						
							|  |  |  |       def installed_formulae_names | 
					
						
							|  |  |  |         @installed_formulae_names ||= T.let(Formula.installed_formula_names.to_set.freeze, T.nilable(T::Set[String])) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       sig { returns(T::Set[String]) } | 
					
						
							|  |  |  |       def installed_cask_tokens | 
					
						
							|  |  |  |         @installed_cask_tokens ||= T.let(Cask::Caskroom.tokens.to_set.freeze, T.nilable(T::Set[String])) | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-02-01 12:11:54 -05:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2012-03-18 00:40:41 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2012-03-02 20:28:54 +00:00
										 |  |  | end |