From 5c799ef8c8720306a9dfb4db1e47f647e06f9857 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Tue, 8 Jan 2013 19:54:32 -0600 Subject: 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 Homebrew/homebrew#16957. --- Library/Homebrew/cmd/install.rb | 20 ++++++++++++-------- Library/Homebrew/cmd/upgrade.rb | 3 +++ Library/Homebrew/formula_installer.rb | 8 ++++---- 3 files changed, 19 insertions(+), 12 deletions(-) (limited to 'Library') 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 -- cgit v1.2.3