| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							| 
									
										
										
										
											2019-04-26 15:28:57 +08:00
										 |  |  |       tab = Tab.for_keg(keg) | 
					
						
							| 
									
										
										
										
											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
										 |  |  |       **{ | 
					
						
							|  |  |  |         options:                    options, | 
					
						
							|  |  |  |         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?, | 
					
						
							|  |  |  |         force_bottle:               force_bottle, | 
					
						
							| 
									
										
										
										
											2020-11-18 05:37:12 +01:00
										 |  |  |         build_from_source_formulae: build_from_source_formulae, | 
					
						
							| 
									
										
										
										
											2021-06-09 16:26:09 -07:00
										 |  |  |         git:                        git, | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         interactive:                interactive, | 
					
						
							|  |  |  |         keep_tmp:                   keep_tmp, | 
					
						
							| 
									
										
										
										
											2022-07-26 12:15:53 +01:00
										 |  |  |         debug_symbols:              debug_symbols, | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |         force:                      force, | 
					
						
							|  |  |  |         debug:                      debug, | 
					
						
							|  |  |  |         quiet:                      quiet, | 
					
						
							|  |  |  |         verbose:                    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 | 
					
						
							| 
									
										
										
										
											2021-03-18 14:46:48 +00:00
										 |  |  |     ignore_interrupts { restore_backup(keg, keg_was_linked, verbose: 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: | 
					
						
							|  |  |  |           sudo chown -R $(whoami) #{keg} | 
					
						
							|  |  |  |       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 | 
					
						
							| 
									
										
										
										
											2020-08-02 04:46:32 +02:00
										 |  |  |     keg.link(verbose: verbose) if keg_was_linked | 
					
						
							| 
									
										
										
										
											2018-09-12 19:28:02 +00:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def backup_path(path) | 
					
						
							|  |  |  |     Pathname.new "#{path}.reinstall" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |