| 
									
										
										
										
											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 | 
					
						
							|  |  |  |   module_function | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |   def reinstall_formula( | 
					
						
							|  |  |  |     formula, | 
					
						
							|  |  |  |     flags:, | 
					
						
							|  |  |  |     installed_on_request: false, | 
					
						
							|  |  |  |     force_bottle: false, | 
					
						
							|  |  |  |     build_from_source_formulae: [], | 
					
						
							|  |  |  |     interactive: false, | 
					
						
							|  |  |  |     keep_tmp: false, | 
					
						
							| 
									
										
										
										
											2022-07-26 12:15:53 +01:00
										 |  |  |     debug_symbols: false, | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |     force: false, | 
					
						
							|  |  |  |     debug: false, | 
					
						
							|  |  |  |     quiet: false, | 
					
						
							| 
									
										
										
										
											2021-06-09 16:26:09 -07:00
										 |  |  |     verbose: false, | 
					
						
							|  |  |  |     git: false | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |   ) | 
					
						
							|  |  |  |     if formula.opt_prefix.directory? | 
					
						
							|  |  |  |       keg = Keg.new(formula.opt_prefix.resolved_path) | 
					
						
							| 
									
										
										
										
											2024-04-28 03:23:21 +02:00
										 |  |  |       tab = keg.tab | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |       keg_had_linked_opt = true | 
					
						
							|  |  |  |       keg_was_linked = keg.linked? | 
					
						
							|  |  |  |       backup keg | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |     build_options = BuildOptions.new(Options.create(flags), formula.options) | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |     options = build_options.used_options | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |     options |= formula.build.used_options | 
					
						
							|  |  |  |     options &= formula.options | 
					
						
							| 
									
										
										
										
											2020-08-11 02:31:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |     fi = FormulaInstaller.new( | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |       formula, | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |       **{ | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |         options:, | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |         link_keg:                   keg_had_linked_opt ? keg_was_linked : nil, | 
					
						
							|  |  |  |         installed_as_dependency:    tab&.installed_as_dependency, | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         installed_on_request:       installed_on_request || tab&.installed_on_request, | 
					
						
							|  |  |  |         build_bottle:               tab&.built_bottle?, | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |         force_bottle:, | 
					
						
							|  |  |  |         build_from_source_formulae:, | 
					
						
							|  |  |  |         git:, | 
					
						
							|  |  |  |         interactive:, | 
					
						
							|  |  |  |         keep_tmp:, | 
					
						
							|  |  |  |         debug_symbols:, | 
					
						
							|  |  |  |         force:, | 
					
						
							|  |  |  |         debug:, | 
					
						
							|  |  |  |         quiet:, | 
					
						
							|  |  |  |         verbose:, | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |       }.compact, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-05-03 14:54:31 +01:00
										 |  |  |     fi.prelude | 
					
						
							| 
									
										
										
										
											2020-05-23 13:40:13 +01:00
										 |  |  |     fi.fetch | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |     oh1 "Reinstalling #{Formatter.identifier(formula.full_name)} #{options.to_a.join " "}" | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     fi.install | 
					
						
							|  |  |  |     fi.finish | 
					
						
							|  |  |  |   rescue FormulaInstallationAlreadyAttemptedError | 
					
						
							|  |  |  |     nil | 
					
						
							|  |  |  |   rescue Exception # rubocop:disable Lint/RescueException | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |     ignore_interrupts { restore_backup(keg, keg_was_linked, verbose:) } | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |     raise | 
					
						
							|  |  |  |   else | 
					
						
							| 
									
										
										
										
											2019-05-24 16:46:54 +01:00
										 |  |  |     begin | 
					
						
							|  |  |  |       backup_path(keg).rmtree if backup_path(keg).exist? | 
					
						
							|  |  |  |     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 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def backup(keg) | 
					
						
							|  |  |  |     keg.unlink | 
					
						
							| 
									
										
										
										
											2019-05-24 16:46:54 +01:00
										 |  |  |     begin | 
					
						
							|  |  |  |       keg.rename backup_path(keg) | 
					
						
							|  |  |  |     rescue Errno::EACCES, Errno::ENOTEMPTY | 
					
						
							|  |  |  |       odie <<~EOS | 
					
						
							|  |  |  |         Could not rename #{keg.name} keg! Check/fix its permissions: | 
					
						
							| 
									
										
										
										
											2023-09-29 12:32:22 +01:00
										 |  |  |           sudo chown -R #{ENV.fetch("USER", "$(whoami)")} #{keg} | 
					
						
							| 
									
										
										
										
											2019-05-24 16:46:54 +01:00
										 |  |  |       EOS | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-07 08:57:54 +02:00
										 |  |  |   def restore_backup(keg, keg_was_linked, verbose:) | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |     path = backup_path(keg) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return unless path.directory? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Pathname.new(keg).rmtree if keg.exist? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     path.rename keg | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |     keg.link(verbose:) if keg_was_linked | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def backup_path(path) | 
					
						
							|  |  |  |     Pathname.new "#{path}.reinstall" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |