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

This is the same that happens in the command 'install'. By passing the invalid option names, we enable the formula installer to output warnings if necessary.
76 lines
1.9 KiB
Ruby
76 lines
1.9 KiB
Ruby
#: * `reinstall` <formula>:
|
|
#: Uninstall and then install <formula>.
|
|
|
|
require "formula_installer"
|
|
require "development_tools"
|
|
|
|
module Homebrew
|
|
module_function
|
|
|
|
def reinstall
|
|
FormulaInstaller.prevent_build_flags unless DevelopmentTools.installed?
|
|
|
|
ARGV.resolved_formulae.each do |f|
|
|
if f.pinned?
|
|
onoe "#{f.full_name} is pinned. You must unpin it to reinstall."
|
|
next
|
|
end
|
|
reinstall_formula(f)
|
|
end
|
|
end
|
|
|
|
def reinstall_formula(f)
|
|
if f.opt_prefix.directory?
|
|
keg = Keg.new(f.opt_prefix.resolved_path)
|
|
backup keg
|
|
end
|
|
|
|
build_options = BuildOptions.new(Options.create(ARGV.flags_only), f.options)
|
|
options = build_options.used_options
|
|
options |= f.build.used_options
|
|
options &= f.options
|
|
|
|
fi = FormulaInstaller.new(f)
|
|
fi.options = options
|
|
fi.invalid_option_names = build_options.invalid_option_names
|
|
fi.build_bottle = ARGV.build_bottle? || (!f.bottled? && f.build.build_bottle?)
|
|
fi.build_from_source = ARGV.build_from_source? || ARGV.build_all_from_source?
|
|
fi.force_bottle = ARGV.force_bottle?
|
|
fi.interactive = ARGV.interactive?
|
|
fi.git = ARGV.git?
|
|
fi.verbose = ARGV.verbose?
|
|
fi.debug = ARGV.debug?
|
|
fi.prelude
|
|
|
|
oh1 "Reinstalling #{f.full_name} #{options.to_a.join " "}"
|
|
|
|
fi.install
|
|
fi.finish
|
|
rescue FormulaInstallationAlreadyAttemptedError
|
|
# next
|
|
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)
|
|
|
|
return unless path.directory?
|
|
|
|
path.rename keg
|
|
keg.link unless formula.keg_only?
|
|
end
|
|
|
|
def backup_path(path)
|
|
Pathname.new "#{path}.reinstall"
|
|
end
|
|
end
|