diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 580b11422f..bfc5d3e7b9 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -11,10 +11,6 @@ module Homebrew extend self raise "No available formula for #{name}\n#{msg}" if msg end unless ARGV.force? - ARGV.formulae.each do |f| - opoo "#{f} already installed" if f.linked_keg.directory? - end unless ARGV.force? - if Process.uid.zero? and not File.stat(HOMEBREW_BREW_FILE).uid.zero? # note we only abort if Homebrew is *not* installed as sudo and the user # calls brew as root. The fix is to chown brew to root. @@ -84,29 +80,16 @@ module Homebrew extend self unless formulae.empty? perform_preinstall_checks formulae.each do |f| - # Check formula status and skip if necessary---a formula passed on the - # command line may have been installed to satisfy a dependency. - next if f.installed? unless ARGV.force? - - # Building head-only without --HEAD is an error - if not ARGV.build_head? and f.standard.nil? - raise "This is a head-only formula; install with `brew install --HEAD #{f.name}`" - end - - # Building stable-only with --HEAD is an error - if ARGV.build_head? and f.unstable.nil? - raise "No head is defined for #{f.name}" - end - begin fi = FormulaInstaller.new(f) fi.install fi.caveats fi.finish - rescue FormulaAlreadyInstalledError => e - opoo e.message + rescue CannotInstallFormulaError => e + onoe e.message end end end end + end diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 6db601fe12..df334582ca 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -42,10 +42,7 @@ module Homebrew end end -class FormulaAlreadyInstalledError < Homebrew::InstallationError - def message - "Formula already installed: #{formula}" - end +class CannotInstallFormulaError < RuntimeError end class FormulaInstallationAlreadyAttemptedError < Homebrew::InstallationError diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 45cd007706..e4b799ef7f 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -16,10 +16,40 @@ class FormulaInstaller @show_header = true @ignore_deps = ARGV.include? '--ignore-dependencies' || ARGV.interactive? @install_bottle = !ARGV.build_from_source? && ff.bottle_up_to_date? + + check_install_sanity + end + + def check_install_sanity + if f.installed? + raise CannotInstallFormulaError, "#{f}-#{f.version} already installed" + end + + # Building head-only without --HEAD is an error + if not ARGV.build_head? and f.standard.nil? + raise CannotInstallFormulaError, <<-EOS.undent + #{f} is a head-only formula + Install with `brew install --HEAD #{f.name} + EOS + end + + # Building stable-only with --HEAD is an error + if ARGV.build_head? and f.unstable.nil? + raise CannotInstallFormulaError, "No head is defined for #{f.name}" + end end def install - raise FormulaAlreadyInstalledError, f if f.installed? and not ARGV.force? + # not in initialize so upgrade can unlink the active keg before calling this + # function but after instantiating this class so that it can avoid having to + # relink the active keg if possible (because it is slow). + if f.linked_keg.directory? + # some other version is already installed *and* linked + raise CannotInstallFormulaError, <<-EOS.undent + #{f}-#{f.linked_keg.realpath.basename} already installed + To install this version, first `brew unlink #{f}' + EOS + end unless ignore_deps f.check_external_deps