Permalink
Browse files

Stop supporting `brew install --force'

Rationale: it breaks stuff. You should not be able to install over something already installed *and* linked. brew now prompts you to unlink the existing linked keg first.

I came to fix this because I discovered that `brew install foo` works without --force provided foo's formula version is different to that which is installed and linked. I'm not sure if this was intentionally broken, but it led to at least two tickets I found where people were getting crazy issues trying to install over the top of already installed previous versions.

So I also fixed a whole category of other issues, mostly by moving error handling into FormulaInstaller. Now error's can be caught in Homebrew.install and handled on a formula-by-formula basis. I will next port this behaviour to upgrade.
  • Loading branch information...
1 parent 9b798cc commit 5bddaf2e355e5fe78e05e68113fad830ed12f517 @mxcl mxcl committed Mar 7, 2012
Showing with 35 additions and 25 deletions.
  1. +3 −20 Library/Homebrew/cmd/install.rb
  2. +1 −4 Library/Homebrew/exceptions.rb
  3. +31 −1 Library/Homebrew/formula_installer.rb
@@ -11,10 +11,6 @@ def install
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 @@ def install_formulae formulae
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
@@ -42,10 +42,7 @@ def initialize formula, message=""
end
end
-class FormulaAlreadyInstalledError < Homebrew::InstallationError
- def message
- "Formula already installed: #{formula}"
- end
+class CannotInstallFormulaError < RuntimeError
end
class FormulaInstallationAlreadyAttemptedError < Homebrew::InstallationError
@@ -16,10 +16,40 @@ def initialize ff
@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

0 comments on commit 5bddaf2

Please sign in to comment.