Merge branch 'deps'

Conflicts:
	Library/Formula/imagemagick.rb
	Library/Formula/taglib.rb
	Library/Homebrew/brew.h.rb
	Library/Homebrew/formula.rb
	bin/brew
This commit is contained in:
Max Howell 2009-09-21 18:42:24 +01:00
commit e9701dbc81
5 changed files with 92 additions and 26 deletions

View File

@ -66,6 +66,9 @@ module HomebrewArgvExtension
def quieter?
flag? '--quieter'
end
def interactive?
flag? '--interactive'
end
def flag? flag
options.each do |arg|

View File

@ -144,6 +144,15 @@ def clean f
end
def expand_deps ff
deps = []
ff.deps.collect do |f|
deps += expand_deps(Formula.factory(f))
end
deps << ff
end
def prune
$n=0
$d=0

View File

@ -116,9 +116,7 @@ class Formula
# }
# The final option is to return DATA, then put a diff after __END__. 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
def patches; [] end
# sometimes the clean process breaks things, return true to skip anything
def skip_clean? path; false end
# rarely, you don't want your library symlinked into the main prefix
@ -129,7 +127,7 @@ class Formula
def brew
validate_variable :name
validate_variable :version
stage do
begin
patch
@ -165,6 +163,7 @@ class Formula
end
def self.factory name
return name if name.kind_of? Formula
path = Pathname.new(name)
if path.absolute?
require name
@ -181,6 +180,10 @@ class Formula
HOMEBREW_PREFIX+'Library'+'Formula'+"#{name.downcase}.rb"
end
def deps
self.class.deps or []
end
protected
# Pretty titles the command and buffers stdout/stderr
# Throws if there's an error
@ -327,9 +330,31 @@ private
end
class <<self
attr_reader :url, :version, :homepage, :head
attr_reader :url, :version, :homepage, :head, :deps
attr_reader *CHECKSUM_TYPES
end
def depends_on name, *args
@deps ||= []
case name
when String
# noop
when Hash
name = name.keys.first # indeed, we only support one mapping
when Symbol
name = name.to_s
when Formula
@deps << name
return # we trust formula dev to not dupe their own instantiations
else
raise "Unsupported type #{name.class}"
end
# we get duplicates because every new fork of this process repeats this
# step for some reason I am not sure about
@deps << name unless @deps.include? name
end
end
end
# see ack.rb for an example usage

View File

@ -42,7 +42,8 @@ class MostlyAbstractFormula <Formula
end
class TestBall <Formula
def initialize
# name parameter required for some Formula::factory
def initialize name=nil
@url="file:///#{Pathname.new(ABS__FILE__).parent.realpath}/testball-0.1.tbz"
super "testball"
end
@ -123,9 +124,13 @@ def nostdout
end
module ExtendArgvPlusYeast
def stick_an_arg_in_thar
def reset
@named=nil
unshift 'foo'
@formulae=nil
@kegs=nil
while ARGV.count > 0
ARGV.shift
end
end
end
ARGV.extend ExtendArgvPlusYeast
@ -372,8 +377,9 @@ class BeerTasting <Test::Unit::TestCase
end
def test_no_ARGV_dupes
ARGV.unshift'foo'
ARGV.unshift'foo'
ARGV.reset
ARGV.unshift 'foo'
ARGV.unshift 'foo'
n=0
ARGV.named.each{|arg| n+=1 if arg == 'foo'}
assert_equal 1, n
@ -385,9 +391,10 @@ class BeerTasting <Test::Unit::TestCase
assert_raises(UsageError) { ARGV.kegs }
assert ARGV.named_empty?
(HOMEBREW_CELLAR+'foo'+'0.1').mkpath
(HOMEBREW_CELLAR+'mxcl'+'10.0').mkpath
ARGV.stick_an_arg_in_thar
ARGV.reset
ARGV.unshift 'mxcl'
assert_equal 1, ARGV.named.length
assert_equal 1, ARGV.kegs.length
assert_raises(FormulaUnavailableError) { ARGV.formulae }
@ -425,7 +432,7 @@ class BeerTasting <Test::Unit::TestCase
nostdout do
assert_nothing_raised do
f=TestBall.new
make 'http://example.com/testball-0.1.tbz'
make f.url
info f.name
clean f
prune

View File

@ -22,6 +22,7 @@ unless system "which -s gcc-4.2" and $?.success?
abort "Sorry, Homebrew requires gcc 4.2, which is provided by Xcode 3.1"
end
begin
case ARGV.shift
when '--prefix' then puts HOMEBREW_PREFIX
@ -76,24 +77,48 @@ begin
puts "#{f}: #{ENV[f]}" unless ENV[f].to_s.empty?
end
end
unless system "which #{ENV['CC'] or 'cc'} &> /dev/null" and $?.success?
raise "We cannot find a c compiler, have you installed the latest Xcode?"
if ARGV.interactive? and ARGV.formulae.count > 1
# the reason for this is interactive mode is a little tricky to do
# with more than one formula, AND I can't think of a time where you'd
# want to do it anyway. If someone comes up with a legitimate use for
# this we will adapt the code. "But I might want it!" is not a
# legitimate use!
raise "Interactive mode can only be used with one formula argument"
end
require 'beer_events'
watch_out_for_spill do
ARGV.formulae.each do |f|
if f.installed? and not ARGV.force?
unless ARGV.force?
unless system "which #{ENV['CC'] or 'cc'} &> /dev/null" and $?.success?
raise "We cannot find a c compiler, have you installed the latest Xcode?"
end
formulae = ARGV.formulae.reject do |f|
if f.installed?
message = "Formula already installed: #{f.prefix}"
if ARGV.formulae.count > 1
opoo message
else
puts message # if only one is being installed a warning looks severe
end
next
true
end
end
exit 0 if formulae.empty?
else
formulae = ARGV.formulae
end
deps = []
formulae.each { |f| deps += expand_deps f }
formulae = deps.reject { |f| f.installed? }
require 'set'
done = Set.new
require 'beer_events'
watch_out_for_spill do
formulae.each do |f|
next if done.include? f.class
done << f.class
# 1. formulae can modify ENV, so we must ensure that each
# installation has a pristine ENV when it starts, forking now is
@ -133,9 +158,6 @@ begin
when 'unlink'
ARGV.kegs.each {|keg| puts "#{keg.unlink} links removed for #{keg}"}
when 'unlink'
ARGV.kegs.each {|keg| puts "#{keg.unlink} links removed for #{keg}"}
when 'rm', 'uninstall', 'remove'
ARGV.kegs.each do |keg|
puts "Uninstalling #{keg}..."