mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00

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
|