
It's a great feature but it seems to conflict with our new system() replacement. Clearly the bug is still in our system() but what exactly it is is not clear and this bug sucks. See Homebrew/homebrew#124
73 lines
1.8 KiB
Ruby
73 lines
1.8 KiB
Ruby
require 'beer_events'
|
|
require 'formula'
|
|
require 'set'
|
|
|
|
class FormulaInstaller
|
|
@@attempted = Set.new
|
|
|
|
def initialize
|
|
@install_deps = true
|
|
end
|
|
|
|
attr_writer :install_deps
|
|
|
|
def expand_deps f
|
|
deps = []
|
|
f.deps.collect do |dep|
|
|
dep = Formula.factory dep
|
|
deps += expand_deps dep
|
|
deps << dep
|
|
end
|
|
deps
|
|
end
|
|
|
|
def install f
|
|
expand_deps(f).each do |dep|
|
|
begin
|
|
install_private dep unless dep.installed?
|
|
rescue
|
|
#TODO continue if this is an optional dep
|
|
raise
|
|
end
|
|
end if @install_deps
|
|
|
|
install_private f
|
|
end
|
|
|
|
private
|
|
|
|
def install_private f
|
|
return if @@attempted.include? f.name
|
|
@@attempted << f.name
|
|
|
|
# 1. formulae can modify ENV, so we must ensure that each
|
|
# installation has a pristine ENV when it starts, forking now is
|
|
# the easiest way to do this
|
|
# 2. formulae have access to __END__ the only way to allow this is
|
|
# to make the formula script the executed script
|
|
read, write = IO.pipe
|
|
# I'm guessing this is not a good way to do this, but I'm no UNIX guru
|
|
ENV['HOMEBREW_ERROR_PIPE'] = write.to_i.to_s
|
|
|
|
begin #watch_out_for_spill do #disabled temporarily, see Issue #124
|
|
fork do
|
|
begin
|
|
read.close
|
|
exec '/usr/bin/ruby', '-I', File.dirname(__FILE__), '-rinstall', f.path, '--', *ARGV.options
|
|
rescue => e
|
|
Marshal.dump(e, write)
|
|
write.close
|
|
exit! 1
|
|
end
|
|
end
|
|
ignore_interrupts do # because child proc will get it and marshall it back
|
|
write.close
|
|
Process.wait
|
|
data = read.read
|
|
raise Marshal.load(data) unless data.nil? or data.empty?
|
|
raise "Suspicious installation failure" unless $?.success?
|
|
end
|
|
end
|
|
end
|
|
end
|