diff options
| -rwxr-xr-x | Library/Homebrew/build.rb | 71 | ||||
| -rw-r--r-- | Library/Homebrew/formula_installer.rb | 20 | ||||
| -rw-r--r-- | Library/Homebrew/utils.rb | 2 | ||||
| -rwxr-xr-x | bin/brew | 4 |
4 files changed, 54 insertions, 43 deletions
diff --git a/Library/Homebrew/build.rb b/Library/Homebrew/build.rb index fa55480bb..eb3431b9c 100755 --- a/Library/Homebrew/build.rb +++ b/Library/Homebrew/build.rb @@ -1,51 +1,54 @@ -#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby +#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0 # This script is called by formula_installer as a separate instance. # Rationale: Formula can use __END__, Formula can change ENV # Thrown exceptions are propogated back to the parent process over a pipe -require 'global' +STD_TRAP = trap("INT") { exit! 130 } # no backtrace thanks at_exit do # the whole of everything must be run in at_exit because the formula has to # be the run script as __END__ must work for *that* formula. + main +end - error_pipe = nil - - begin - # The main Homebrew process expects to eventually see EOF on the error - # pipe in FormulaInstaller#build. However, if any child process fails to - # terminate (i.e, fails to close the descriptor), this won't happen, and - # the installer will hang. Set close-on-exec to prevent this. - # Whether it is *wise* to launch daemons from formulae is a separate - # question altogether. - if ENV['HOMEBREW_ERROR_PIPE'] - require 'fcntl' - error_pipe = IO.new(ENV['HOMEBREW_ERROR_PIPE'].to_i, 'w') - error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) - end +require 'global' - raise $! if $! # an exception was already thrown when parsing the formula +def main + # The main Homebrew process expects to eventually see EOF on the error + # pipe in FormulaInstaller#build. However, if any child process fails to + # terminate (i.e, fails to close the descriptor), this won't happen, and + # the installer will hang. Set close-on-exec to prevent this. + # Whether it is *wise* to launch daemons from formulae is a separate + # question altogether. + if ENV['HOMEBREW_ERROR_PIPE'] + require 'fcntl' + error_pipe = IO.new(ENV['HOMEBREW_ERROR_PIPE'].to_i, 'w') + error_pipe.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) + end - require 'hardware' - require 'keg' + raise $! if $! # an exception was already thrown when parsing the formula - # Force any future invocations of sudo to require the user's password to be - # re-entered. This is in-case any build script call sudo. Certainly this is - # can be inconvenient for the user. But we need to be safe. - system "/usr/bin/sudo -k" + trap("INT", STD_TRAP) # restore default CTRL-C handler - install(Formula.factory($0)) - rescue Exception => e - unless error_pipe.nil? - Marshal.dump(e, error_pipe) - error_pipe.close - exit! 1 - else - onoe e - puts e.backtrace - exit! 2 - end + require 'hardware' + require 'keg' + + # Force any future invocations of sudo to require the user's password to be + # re-entered. This is in-case any build script call sudo. Certainly this is + # can be inconvenient for the user. But we need to be safe. + system "/usr/bin/sudo -k" + + install(Formula.factory($0)) +rescue Exception => e + unless error_pipe.nil? + Marshal.dump(e, error_pipe) + error_pipe.close + exit! 1 + else + onoe e + puts e.backtrace + exit! 2 end end diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index 9d8add9d2..8e082a7ce 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -238,6 +238,7 @@ class FormulaInstaller Process.wait data = read.read raise Marshal.load(data) unless data.nil? or data.empty? + raise Interrupt if $?.exitstatus == 130 raise "Suspicious installation failure" unless $?.success? end @@ -266,15 +267,18 @@ class FormulaInstaller end keg = Keg.new(f.prefix) - keg.link - rescue Exception => e - onoe "The `brew link` step did not complete successfully." - puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}." - puts "You can try again using `brew link #{f.name}`." - keg.unlink - ohai e, e.backtrace if ARGV.debug? - @show_summary_heading = true + begin + keg.link + rescue Exception => e + onoe "The `brew link` step did not complete successfully" + puts "The formula built, but is not symlinked into #{HOMEBREW_PREFIX}" + puts "You can try again using `brew link #{f.name}'" + ohai e, e.backtrace if ARGV.debug? + @show_summary_heading = true + ignore_interrupts{ keg.unlink } + raise unless e.kind_of? RuntimeError + end end def fix_install_names diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index b7158ae98..0970f99fe 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -217,7 +217,7 @@ def inreplace path, before=nil, after=nil end def ignore_interrupts - std_trap = trap("INT") {} + std_trap = trap("INT") { puts "One sec, just cleaning up" } yield ensure trap("INT", std_trap) @@ -1,6 +1,8 @@ #!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -W0 # -*- coding: utf-8 -*- +std_trap = trap("INT") { exit! 130 } # no backtrace thanks + HOMEBREW_BREW_FILE = ENV['HOMEBREW_BREW_FILE'] = File.expand_path(__FILE__) require 'pathname' @@ -49,6 +51,8 @@ rescue LoadError => e end begin + trap("INT", std_trap) # restore default CTRL-C handler + aliases = {'ls' => :list, 'homepage' => :home, '-S' => :search, |
