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 (opt_link = f.opt_prefix).exist?
 | |
|       keg = Keg.new(opt_link.realpath)
 | |
|       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
 | 
