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:
commit
e9701dbc81
@ -66,6 +66,9 @@ module HomebrewArgvExtension
|
||||
def quieter?
|
||||
flag? '--quieter'
|
||||
end
|
||||
def interactive?
|
||||
flag? '--interactive'
|
||||
end
|
||||
|
||||
def flag? flag
|
||||
options.each do |arg|
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
46
bin/brew
46
bin/brew
@ -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}..."
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user