brew/bin/brew

224 lines
6.5 KiB
Plaintext
Raw Normal View History

2009-05-21 00:04:43 +01:00
#!/usr/bin/ruby
2009-09-03 17:10:35 +02:00
# -*- coding: utf-8 -*-
$:.unshift ENV['RUBYLIB']=File.expand_path(__FILE__+'/../../Library/Homebrew')
require 'pathname+yeast'
require 'ARGV+yeast'
require 'utils'
require 'hardware'
require 'brew.h'
2009-08-25 11:25:47 -07:00
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.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)"
if %w[/ /usr].include? HOMEBREW_PREFIX.to_s then abort <<-EOS
You have placed Homebrew at the prefix: #{HOMEBREW_PREFIX}
This is not currently supported. Voice your support for this feature at:
#{HOMEBREW_WWW}
EOS
end
2009-08-12 01:56:40 +01:00
if `sw_vers -productVersion` =~ /10\.(\d)\.(\d+)/ and $1.to_i < 5
onoe "Homebrew requires Leopard or higher"
abort "But thanks for your interest anyway!"
end
if Hardware.cpu_type == :ppc or Hardware.cpu_type == :dunno
abort "Sorry, Homebrew does not support your computer's CPU architecture."
end
unless system "which gcc-4.2 &> /dev/null" and $?.success?
abort "Sorry, Homebrew requires gcc 4.2, which is provided by Xcode 3.1"
end
2009-06-15 01:41:53 +01:00
begin
case ARGV.shift
when '--prefix' then puts HOMEBREW_PREFIX
when '--cache' then puts HOMEBREW_CACHE
when '-h', '--help', '--usage', '-?' then puts ARGV.usage
when '-v', '--version' then puts HOMEBREW_VERSION
when 'home', 'homepage'
if ARGV.named_empty?
exec "open", HOMEBREW_WWW
else
exec "open", *ARGV.formulae.collect {|f| f.homepage}
end
when 'ls', 'list'
if ARGV.named_empty?
ENV['CLICOLOR']=nil
exec 'ls', *ARGV.options<<HOMEBREW_CELLAR
else
exec "find", *ARGV.kegs+%w[-not -type d -print]
end
when 'search', '-S'
formulae = (HOMEBREW_PREFIX+'Library'+'Formula').children.sort.map{|f| f.basename('.rb') }
puts_columns formulae.grep(Regexp.new(ARGV.first || ''))
2009-06-26 13:03:49 +01:00
when 'edit'
if ARGV.named_empty?
exec "mate", *Dir["#{HOMEBREW_PREFIX}/Library/*"]<<
"#{HOMEBREW_PREFIX}/bin/brew"<<
"#{HOMEBREW_PREFIX}/README"
2009-06-26 13:03:49 +01:00
else
exec "mate", *ARGV.formulae.collect {|f| f.path}
2009-06-26 13:03:49 +01:00
end
when 'install'
if ARGV.named_empty?
puts "You must specify a formula. Search for available formulae with `brew search'."
exit 0
end
require 'brewkit'
if ARGV.verbose?
ohai "Build Environment"
%w[CFLAGS LDFLAGS CPPFLAGS MAKEFLAGS CC CXX].each do |f|
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?"
end
require 'beer_events'
watch_out_for_spill do
ARGV.formulae.each do |f|
if f.installed? and not ARGV.force?
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
end
# we need to ensure a pristine ENV for each process or the formula
# will start with the ENV from the previous build
pid=fork
if pid.nil?
exec __FILE__, "install-just-one", f.name, *ARGV.options
else
Process.wait pid
end
#FIXME I don't think $? represents the exit code from the child fork…
exit! $? if $? != 0 # exception in other brew will be visible on screen
end
end
# this is an internal option, don't expose it to the user
when 'install-just-one'
require 'keg'
f=ARGV.formulae.shift
begin
build_time=install f
ohai "Caveats", f.caveats, ''
ohai 'Finishing up' if ARGV.verbose?
clean f
raise "Nothing was installed to #{f.prefix}" unless f.installed?
rescue Exception
f.prefix.rmtree if f.prefix.directory?
raise
2009-06-05 08:09:34 +01:00
end
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 "Summary" unless ARGV.verbose?
end
ohai "Summary" if ARGV.verbose?
print "#{f.prefix}: #{f.prefix.abv}"
print ", built in #{pretty_duration build_time}" if build_time
puts
2009-07-22 20:27:58 +01:00
when 'ln', 'link'
ARGV.kegs.each {|keg| puts "#{keg.link} links created for #{keg}"}
when 'unlink'
ARGV.kegs.each {|keg| puts "#{keg.unlink} links removed for #{keg}"}
2009-07-22 20:27:58 +01:00
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}..."
keg.uninstall
end
prune
when 'up', 'update'
puts "You can't yet update :( But you can try:"
puts " git pull"
puts " brew rm foo"
puts " brew install foo"
when 'prune'
prune
when 'mk', 'make'
if ARGV.include? '--macports'
exec "open", "http://www.macports.org/ports.php?by=name&substr=#{ARGV.next}"
else
exec "mate", *ARGV.collect {|name| make name}
end
2009-08-22 15:54:26 +01:00
when 'diy', 'configure'
puts diy
when 'info', 'abv'
if ARGV.named_empty?
puts `ls #{HOMEBREW_CELLAR} | wc -l`.strip+" kegs, "+HOMEBREW_CELLAR.abv
elsif ARGV[0][0..6] == 'http://'
puts Pathname.new(ARGV.shift).version
2009-06-13 12:59:18 +01:00
else
ARGV.named.each {|name| info name}
2009-06-05 12:57:00 +01:00
end
else
puts ARGV.usage
end
2009-05-23 16:37:24 +01:00
rescue UsageError
onoe "Invalid usage"
puts ARGV.usage
rescue SystemExit
ohai "Kernel.exit" if ARGV.verbose?
rescue Interrupt => e
puts # seemingly a newline is typical
exit 130
rescue SystemCallError, RuntimeError => e
if ARGV.debug?
onoe e.inspect
puts e.backtrace
2009-05-21 00:04:43 +01:00
else
onoe e
end
exit 1
rescue Exception => e
onoe "Homebrew has failed you :("
puts "Please report this bug at: #{HOMEBREW_WWW}"
puts "Please include this backtrace:"
ohai e.inspect
puts e.backtrace
end