 ce1f598e98
			
		
	
	
		ce1f598e98
		
	
	
	
	
		
			
			Symlinks in opt and LinkedKegs point directly at a keg in the cellar, so only resolving one symlink should suffice, and make it clear what path we are actually interested in.
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require 'cmd/install'
 | |
| 
 | |
| module Homebrew extend self
 | |
|   def reinstall
 | |
|     ARGV.formulae.each { |f| reinstall_formula(f) }
 | |
|   end
 | |
| 
 | |
|   def reinstall_formula f
 | |
|     tab = Tab.for_formula(f)
 | |
|     options = tab.used_options | f.build.used_options
 | |
| 
 | |
|     notice  = "Reinstalling #{f.name}"
 | |
|     notice += " with #{options * ", "}" unless options.empty?
 | |
|     oh1 notice
 | |
| 
 | |
|     if f.opt_prefix.directory?
 | |
|       keg = Keg.new(f.opt_prefix.resolved_path)
 | |
|       backup keg
 | |
|     end
 | |
| 
 | |
|     fi = FormulaInstaller.new(f)
 | |
|     fi.options             = options
 | |
|     fi.build_bottle        = ARGV.build_bottle?
 | |
|     fi.build_bottle      ||= tab.built_as_bottle && !tab.poured_from_bottle
 | |
|     fi.build_from_source   = ARGV.build_from_source?
 | |
|     fi.force_bottle        = ARGV.force_bottle?
 | |
|     fi.verbose             = ARGV.verbose?
 | |
|     fi.debug               = ARGV.debug?
 | |
|     fi.prelude
 | |
|     fi.install
 | |
|     fi.caveats
 | |
|     fi.finish
 | |
|   rescue FormulaInstallationAlreadyAttemptedError
 | |
|     # next
 | |
|   rescue FormulaAlreadyInstalledError => e
 | |
|     opoo e.message
 | |
|   rescue Exception
 | |
|     ignore_interrupts { restore_backup(keg, f) }
 | |
|     raise
 | |
|   else
 | |
|     backup_path(keg).rmtree if backup_path(keg).exist?
 | |
|   end
 | |
| 
 | |
|   def backup keg
 | |
|     keg.unlink
 | |
|     keg.rename backup_path(keg)
 | |
|   end
 | |
| 
 | |
|   def restore_backup keg, formula
 | |
|     path = backup_path(keg)
 | |
|     if path.directory?
 | |
|       path.rename keg
 | |
|       keg.link unless formula.keg_only?
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def backup_path path
 | |
|     Pathname.new "#{path}.reinstall"
 | |
|   end
 | |
| end
 |