aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/install.rb
diff options
context:
space:
mode:
authorMax Howell2009-09-04 15:28:18 +0100
committerMax Howell2009-09-16 14:49:06 +0100
commitc28bd7b57193c808f896c0f2a0eac20e8fd075bb (patch)
treec8958503c4ae1017b3404ad013877e38c360d882 /Library/Homebrew/install.rb
parentfd5ed391be80b4170efa9d34ab47b011c94f9e54 (diff)
downloadbrew-c28bd7b57193c808f896c0f2a0eac20e8fd075bb.tar.bz2
Allow formulae to use __END__
For this to work the "running script" must be the formulae file. Making this so wasn't so hard, there is now an install.rb script which is included with the -r flag to the ruby executable. An at_exit handler calls the install function. Having the install logic in its own file made it feel like there was so much space that I added extra error handling. So there is something to be said for separating functionality out into its own files. Still the error handling sucks, we'll need to marshall the exception back to the bin/brew command. Which is another PITA. Still overall I think this will prove worthwhile. But if it doesn't we'll revert. As a first usage, you can put a diff after __END__ and return DATA from Formula::patches to make Homebrew aware of it.
Diffstat (limited to 'Library/Homebrew/install.rb')
-rwxr-xr-xLibrary/Homebrew/install.rb78
1 files changed, 78 insertions, 0 deletions
diff --git a/Library/Homebrew/install.rb b/Library/Homebrew/install.rb
new file mode 100755
index 000000000..72fb2a1fa
--- /dev/null
+++ b/Library/Homebrew/install.rb
@@ -0,0 +1,78 @@
+#!/usr/bin/ruby
+require 'global'
+require 'formula'
+require 'keg'
+require 'brew.h'
+
+def install f
+ build_time=nil
+
+ begin
+ f.brew do
+ if ARGV.flag? '--interactive'
+ ohai "Entering interactive mode"
+ puts "Type `exit' to return and finalize the installation"
+ puts "Install to this prefix: #{f.prefix}"
+ interactive_shell
+ nil
+ elsif ARGV.include? '--help'
+ system './configure --help'
+ exit $?
+ else
+ f.prefix.mkpath
+ beginning=Time.now
+ f.install
+ %w[README ChangeLog COPYING LICENSE COPYRIGHT AUTHORS].each do |file|
+ FileUtils.mv "#{file}.txt", file rescue nil
+ f.prefix.install file rescue nil
+ end
+ build_time=Time.now-beginning
+ end
+ end
+ rescue Exception
+ if f.prefix.directory?
+ f.prefix.rmtree
+ f.prefix.parent.rmdir_if_possible
+ end
+ raise
+ end
+
+ ohai "Caveats", f.caveats, ''
+ ohai 'Finishing up' if ARGV.verbose?
+
+ begin
+ clean f
+ rescue Exception => e
+ opoo "The cleaning step did not complete successfully"
+ puts "Still, the installation was successful, so we will link it into your prefix"
+ ohai e, e.inspect if ARGV.debug?
+ end
+
+ raise "Nothing was installed to #{f.prefix}" unless f.installed?
+
+ begin
+ Keg.new(f.prefix).link
+ rescue Exception
+ onoe "The linking step did not complete successfully"
+ puts "The package built, but is not symlinked into #{HOMEBREW_PREFIX}"
+ puts "You can try again using `brew link #{f.name}'"
+ ohai e, e.inspect if ARGV.debug?
+ ohai "Summary"
+ else
+ ohai "Summary" if ARGV.verbose?
+ end
+
+ print "#{f.prefix}: #{f.prefix.abv}"
+ print ", built in #{pretty_duration build_time}" if build_time
+ puts
+
+rescue Exception => e
+ #TODO propogate exception back to brew script
+ onoe e
+ puts e.backtrace
+end
+
+
+# I like this little at all, but see no alternative seeing as the formula
+# rb file has to be the running script to allow it to use __END__ and DATA
+at_exit { install(Formula.factory($0)) }