diff options
Diffstat (limited to 'Library')
| -rw-r--r-- | Library/Homebrew/brew.h.rb | 25 | ||||
| -rw-r--r-- | Library/Homebrew/formula.rb | 29 | ||||
| -rw-r--r-- | Library/Homebrew/global.rb | 41 | ||||
| -rwxr-xr-x | Library/Homebrew/install.rb | 78 | ||||
| -rwxr-xr-x | Library/Homebrew/unittest.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/utils.rb | 4 |
6 files changed, 144 insertions, 35 deletions
diff --git a/Library/Homebrew/brew.h.rb b/Library/Homebrew/brew.h.rb index 60fce7eb8..a524c3298 100644 --- a/Library/Homebrew/brew.h.rb +++ b/Library/Homebrew/brew.h.rb @@ -144,31 +144,6 @@ def clean f end -def install f - 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 - return Time.now-beginning - end - end -end - - def prune $n=0 $d=0 diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index a5a69b496..bf7e55865 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -114,6 +114,8 @@ class Formula # :p1 => 'http://bar.com/patch2', # :p2 => ['http://moo.com/patch5', 'http://moo.com/patch6'] # } + # The final option is to return DATA, then put a diff after __END__ and you + # can still return a Hash with DATA as the value for a patch level key. def patches; [] end # reimplement and specify dependencies def deps; end @@ -128,6 +130,8 @@ class Formula stage do begin patch + # we allow formulas to do anything they want to the Ruby process + # so load any deps before this point! And exit asap afterwards yield self rescue Interrupt, RuntimeError, SystemCallError => e raise unless ARGV.debug? @@ -158,7 +162,13 @@ class Formula end def self.factory name - require self.path(name) + path = Pathname.new(name) + if path.absolute? + require name + name = path.stem + else + require self.path(name) + end return eval(self.class_s(name)).new(name) rescue LoadError raise FormulaUnavailableError.new(name) @@ -242,7 +252,7 @@ private yield end end - + def patch return if patches.empty? @@ -258,17 +268,20 @@ private n=0 patch_defns.each do |arg, urls| urls.each do |url| - p = {:filename => '%03d-homebrew.patch' % n+=1, :compression => false} + p = {:filename => '%03d-homebrew.diff' % n+=1, :compression => false} - if url =~ %r[^\w+\://] + if defined? DATA and url == DATA + pn=Pathname.new p[:filename] + pn.write DATA.read + elsif url =~ %r[^\w+\://] out_fn = p[:filename] case url when /\.gz$/ p[:compression] = :gzip - out_fn << '.gz' + out_fn += '.gz' when /\.bz2$/ p[:compression] = :bzip2 - out_fn << '.bz2' + out_fn += '.bz2' end p[:curl_args] = [url, '-o', out_fn] else @@ -281,9 +294,11 @@ private patch_list << p end end + + return if patch_list.empty? # downloading all at once is much more efficient, espeically for FTP - curl *(patch_list.collect { |p| p[:curl_args] }).flatten + curl *(patch_list.collect{|p| p[:curl_args]}.select{|p| p}.flatten) patch_list.each do |p| case p[:compression] diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb new file mode 100644 index 000000000..3feec1c8c --- /dev/null +++ b/Library/Homebrew/global.rb @@ -0,0 +1,41 @@ +# Copyright 2009 Max Howell and other contributors. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +require 'pathname+yeast' +require 'ARGV+yeast' +require 'utils' +require 'hardware' + +if Process.uid == 0 + # technically this is not the correct place, this cache is for *all users* + # so in that case, maybe we should always use it, root or not? + HOMEBREW_CACHE=Pathname.new("/Library/Caches/Homebrew") +else + HOMEBREW_CACHE=Pathname.new("~/Library/Caches/Homebrew").expand_path +end + +HOMEBREW_PREFIX=(Pathname.getwd+__FILE__).dirname.parent.parent.cleanpath +HOMEBREW_CELLAR=HOMEBREW_PREFIX+'Cellar' +HOMEBREW_VERSION='0.4' +HOMEBREW_WWW='http://bit.ly/Homebrew' +HOMEBREW_USER_AGENT="Homebrew #{HOMEBREW_VERSION} (Ruby #{VERSION}; Mac OS X 10.5 Leopard)" 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)) } diff --git a/Library/Homebrew/unittest.rb b/Library/Homebrew/unittest.rb index 15b0dc3cf..8d5f1b76f 100755 --- a/Library/Homebrew/unittest.rb +++ b/Library/Homebrew/unittest.rb @@ -14,7 +14,7 @@ require 'utils' require 'brew.h' require 'hardware.rb' -# these are defined in bin/brew, but we don't want to break our actual +# these are defined in global.rb, but we don't want to break our actual # homebrew tree, and we do want to test everything :) HOMEBREW_PREFIX=Pathname.new '/tmp/testbrew/prefix' HOMEBREW_CACHE=HOMEBREW_PREFIX.parent+"cache" diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index ff58aabfd..8606b21fe 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -75,8 +75,8 @@ def safe_system cmd, *args end end -def curl url, *args - safe_system 'curl', '-f#LA', HOMEBREW_USER_AGENT, url, *args +def curl *args + safe_system 'curl', '-f#LA', HOMEBREW_USER_AGENT, *args unless args.empty? end def puts_columns items, cols = 4 |
