Handle exceptions during install correctly

rm -rf the prefix and build dirs when appropriate.
This commit is contained in:
Max Howell 2009-06-08 11:43:28 +01:00
parent cbbc7b0f0f
commit 71a6287409
2 changed files with 32 additions and 26 deletions

View File

@ -178,8 +178,9 @@ public
# yields self with current working directory set to the uncompressed tarball # yields self with current working directory set to the uncompressed tarball
def brew def brew
ohai "Downloading #{@url}" ohai "Downloading #{@url}"
Dir.chdir appsupport do Dir.chdir appsupport do
tmp=tgz=nil
begin
tgz=Pathname.new(fetch()).realpath tgz=Pathname.new(fetch()).realpath
md5=`md5 -q "#{tgz}"`.strip md5=`md5 -q "#{tgz}"`.strip
raise "MD5 mismatch: #{md5}" unless @md5 and md5 == @md5.downcase raise "MD5 mismatch: #{md5}" unless @md5 and md5 == @md5.downcase
@ -188,22 +189,19 @@ public
# recursively deleting later # recursively deleting later
# we use mktemp rather than appsupport/blah because some build scripts # we use mktemp rather than appsupport/blah because some build scripts
# can't handle being built in a directory with spaces in it :P # can't handle being built in a directory with spaces in it :P
tmp=nil
begin
tmp=`mktemp -dt #{File.basename @url}`.strip tmp=`mktemp -dt #{File.basename @url}`.strip
Dir.chdir tmp do Dir.chdir tmp do
Dir.chdir uncompress(tgz) do Dir.chdir uncompress(tgz) do
yield self yield self
end end
end end
rescue => e rescue Interrupt, RuntimeError
if e.kind_of? Interrupt and ARGV.include? '--debug' if ARGV.include? '--debug'
# debug mode allows the packager to intercept a failed build and # debug mode allows the packager to intercept a failed build and
# investigate the problems # investigate the problems
puts "Rescued build at: #{tmp}" puts "Rescued build at: #{tmp}"
exit! 1 exit! 1
else else
FileUtils.rm_rf prefix
raise raise
end end
ensure ensure

View File

@ -212,12 +212,16 @@ begin
shift_formulae_from_ARGV.each do |name| shift_formulae_from_ARGV.each do |name|
beginning = Time.now beginning = Time.now
o=__obj(name) o=__obj(name)
begin
raise "#{o.prefix} already exists!" if o.prefix.exist? raise "#{o.prefix} already exists!" if o.prefix.exist?
o.prefix.mkpath o.prefix.mkpath
o.brew { o.install } o.brew do
o.install
['README','ChangeLog','COPYING','AUTHORS'].each do |file|
FileUtils.cp file, o.prefix if File.file? file
end
end
ohai 'Finishing up' ohai 'Finishing up'
#TODO copy changelog or CHANGES file to pkg root,
#TODO maybe README, etc. to versioned root
o.clean o.clean
ln name ln name
if o.caveats if o.caveats
@ -226,6 +230,10 @@ begin
ohai "Summary" ohai "Summary"
end end
puts "#{o.prefix}: "+abv(name)+", built in #{Time.now - beginning} seconds" puts "#{o.prefix}: "+abv(name)+", built in #{Time.now - beginning} seconds"
rescue Exception
FileUtils.rm_rf o.prefix
raise
end
end end
when 'ln' when 'ln'
n=0 n=0