| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | require "formula_installer" | 
					
						
							|  |  |  | require "development_tools" | 
					
						
							|  |  |  | require "messages" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module Homebrew | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |   module Reinstall | 
					
						
							|  |  |  |     def self.reinstall_formula( | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |       formula, | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       flags:, | 
					
						
							|  |  |  |       force_bottle: false, | 
					
						
							|  |  |  |       build_from_source_formulae: [], | 
					
						
							|  |  |  |       interactive: false, | 
					
						
							|  |  |  |       keep_tmp: false, | 
					
						
							|  |  |  |       debug_symbols: false, | 
					
						
							|  |  |  |       force: false, | 
					
						
							|  |  |  |       debug: false, | 
					
						
							|  |  |  |       quiet: false, | 
					
						
							|  |  |  |       verbose: false, | 
					
						
							|  |  |  |       git: false | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       if formula.opt_prefix.directory? | 
					
						
							|  |  |  |         keg = Keg.new(formula.opt_prefix.resolved_path) | 
					
						
							|  |  |  |         tab = keg.tab | 
					
						
							| 
									
										
										
										
											2024-11-14 15:00:33 +00:00
										 |  |  |         link_keg = keg.linked? | 
					
						
							|  |  |  |         installed_as_dependency = tab.installed_as_dependency | 
					
						
							|  |  |  |         installed_on_request = tab.installed_on_request | 
					
						
							|  |  |  |         build_bottle = tab.built_bottle? | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |         backup keg | 
					
						
							| 
									
										
										
										
											2024-11-14 15:00:33 +00:00
										 |  |  |       else | 
					
						
							|  |  |  |         link_keg = nil | 
					
						
							|  |  |  |         installed_as_dependency = false | 
					
						
							|  |  |  |         installed_on_request = true | 
					
						
							|  |  |  |         build_bottle = false | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       build_options = BuildOptions.new(Options.create(flags), formula.options) | 
					
						
							|  |  |  |       options = build_options.used_options | 
					
						
							|  |  |  |       options |= formula.build.used_options | 
					
						
							|  |  |  |       options &= formula.options | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       fi = FormulaInstaller.new( | 
					
						
							|  |  |  |         formula, | 
					
						
							|  |  |  |         **{ | 
					
						
							|  |  |  |           options:, | 
					
						
							| 
									
										
										
										
											2024-11-14 15:00:33 +00:00
										 |  |  |           link_keg:, | 
					
						
							|  |  |  |           installed_as_dependency:, | 
					
						
							|  |  |  |           installed_on_request:, | 
					
						
							|  |  |  |           build_bottle:, | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |           force_bottle:, | 
					
						
							|  |  |  |           build_from_source_formulae:, | 
					
						
							|  |  |  |           git:, | 
					
						
							|  |  |  |           interactive:, | 
					
						
							|  |  |  |           keep_tmp:, | 
					
						
							|  |  |  |           debug_symbols:, | 
					
						
							|  |  |  |           force:, | 
					
						
							|  |  |  |           debug:, | 
					
						
							|  |  |  |           quiet:, | 
					
						
							|  |  |  |           verbose:, | 
					
						
							|  |  |  |         }.compact, | 
					
						
							|  |  |  |       ) | 
					
						
							|  |  |  |       fi.prelude | 
					
						
							|  |  |  |       fi.fetch | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       oh1 "Reinstalling #{Formatter.identifier(formula.full_name)} #{options.to_a.join " "}" | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       fi.install | 
					
						
							|  |  |  |       fi.finish | 
					
						
							|  |  |  |     rescue FormulaInstallationAlreadyAttemptedError | 
					
						
							|  |  |  |       nil | 
					
						
							|  |  |  |     rescue Exception # rubocop:disable Lint/RescueException | 
					
						
							| 
									
										
										
										
											2024-11-14 15:00:33 +00:00
										 |  |  |       ignore_interrupts { restore_backup(keg, link_keg, verbose:) } | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       raise | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       begin | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |         FileUtils.rm_r(backup_path(keg)) if backup_path(keg).exist? | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       rescue Errno::EACCES, Errno::ENOTEMPTY | 
					
						
							|  |  |  |         odie <<~EOS | 
					
						
							|  |  |  |           Could not remove #{backup_path(keg).parent.basename} backup keg! Do so manually: | 
					
						
							|  |  |  |             sudo rm -rf #{backup_path(keg)} | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-05-24 16:46:54 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |     def self.backup(keg) | 
					
						
							|  |  |  |       keg.unlink | 
					
						
							|  |  |  |       begin | 
					
						
							|  |  |  |         keg.rename backup_path(keg) | 
					
						
							|  |  |  |       rescue Errno::EACCES, Errno::ENOTEMPTY | 
					
						
							|  |  |  |         odie <<~EOS | 
					
						
							|  |  |  |           Could not rename #{keg.name} keg! Check/fix its permissions: | 
					
						
							|  |  |  |             sudo chown -R #{ENV.fetch("USER", "$(whoami)")} #{keg} | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2019-05-24 16:46:54 +01:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |     private_class_method :backup | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |     def self.restore_backup(keg, keg_was_linked, verbose:) | 
					
						
							|  |  |  |       path = backup_path(keg) | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       return unless path.directory? | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-24 10:15:34 +01:00
										 |  |  |       FileUtils.rm_r(Pathname.new(keg)) if keg.exist? | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |       path.rename keg | 
					
						
							|  |  |  |       keg.link(verbose:) if keg_was_linked | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     private_class_method :restore_backup | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-20 03:58:01 +01:00
										 |  |  |     def self.backup_path(path) | 
					
						
							|  |  |  |       Pathname.new "#{path}.reinstall" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     private_class_method :backup_path | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | end |