aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Nagel2013-01-08 19:54:32 -0600
committerJack Nagel2013-01-10 16:46:54 -0600
commit30a08f5cc707e111685d2e73a862a95a5d8529ba (patch)
treefd7debe58fbdb9ab67c3ec3fc2fe36d42095ec1a
parente13842ac4764ec424dd52eec23108ff626a4a98c (diff)
downloadhomebrew-30a08f5cc707e111685d2e73a862a95a5d8529ba.tar.bz2
Don't attempt installation multiple times
When a dependency of a formula specified on the command-line is also specified, *after* the dependent formula, installation proceeds as part of the dependent's dependency tree and then is attempted again because the user asked for it explicitly. This results in the installer raising a CannotInstallFormulaError because it has already been installed. For example: $ brew install graphviz pkg-config ==> Installing graphviz dependency: pkg-config ... ==> Installing graphviz ... Error: pkg-config-0.27.1 already installed We already have a mechanism for dealing with this, but it does not kick in early enough. Move the installation attempt check into FormulaInstaller#check_install_sanity and catch the exception in the appropriate places. Fixes #16957.
-rw-r--r--Library/Homebrew/cmd/install.rb20
-rw-r--r--Library/Homebrew/cmd/upgrade.rb3
-rw-r--r--Library/Homebrew/formula_installer.rb8
3 files changed, 19 insertions, 12 deletions
diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb
index 90acb0774..ef01d0452 100644
--- a/Library/Homebrew/cmd/install.rb
+++ b/Library/Homebrew/cmd/install.rb
@@ -78,16 +78,20 @@ module Homebrew extend self
unless formulae.empty?
perform_preinstall_checks
formulae.each do |f|
- begin
- fi = FormulaInstaller.new(f)
- fi.install
- fi.caveats
- fi.finish
- rescue CannotInstallFormulaError => e
- ofail e.message
- end
+ install_formula(f)
end
end
end
+ def install_formula f
+ fi = FormulaInstaller.new(f)
+ fi.install
+ fi.caveats
+ fi.finish
+ rescue FormulaInstallationAlreadyAttemptedError
+ # We already attempted to install f as part of the dependency tree of
+ # another formula. In that case, don't generate an error, just move on.
+ rescue CannotInstallFormulaError => e
+ ofail e.message
+ end
end
diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb
index 06dfb8732..c3a924ec5 100644
--- a/Library/Homebrew/cmd/upgrade.rb
+++ b/Library/Homebrew/cmd/upgrade.rb
@@ -73,6 +73,9 @@ module Homebrew extend self
installer.install
installer.caveats
installer.finish
+ rescue FormulaInstallationAlreadyAttemptedError
+ # We already attempted to upgrade f as part of the dependency tree of
+ # another formula. In that case, don't generate an error, just move on.
rescue CannotInstallFormulaError => e
ofail e
rescue BuildError => e
diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb
index db54f9d60..66d0827cd 100644
--- a/Library/Homebrew/formula_installer.rb
+++ b/Library/Homebrew/formula_installer.rb
@@ -24,6 +24,10 @@ class FormulaInstaller
end
def check_install_sanity
+ @@attempted ||= Set.new
+ raise FormulaInstallationAlreadyAttemptedError, f if @@attempted.include? f
+ @@attempted << f
+
if f.installed?
msg = "#{f}-#{f.installed_version} already installed"
msg << ", it's just not linked" if not f.linked_keg.symlink? and not f.keg_only?
@@ -112,10 +116,6 @@ class FormulaInstaller
oh1 "Installing #{f}" if show_header
- @@attempted ||= Set.new
- raise FormulaInstallationAlreadyAttemptedError, f if @@attempted.include? f
- @@attempted << f
-
if install_bottle
pour
else