
* may be a problem if the constant is scoped (like A::B), but this is not the case (const.split('::').inject(Object) { |c, part| c.const_get part } would solve that) * this was noticed in a comment of 9afc85ad but it has disappeared Signed-off-by: Adam Vandenberg <flangy@gmail.com>
149 lines
4.5 KiB
Ruby
Executable File
149 lines
4.5 KiB
Ruby
Executable File
#!/usr/bin/ruby
|
|
# -*- coding: utf-8 -*-
|
|
|
|
HOMEBREW_BREW_FILE = ENV['HOMEBREW_BREW_FILE'] = File.expand_path(__FILE__)
|
|
|
|
require 'pathname'
|
|
HOMEBREW_LIBRARY_PATH = Pathname.new(__FILE__).realpath.dirname.parent.join("Library/Homebrew").to_s
|
|
$:.unshift(HOMEBREW_LIBRARY_PATH)
|
|
require 'global'
|
|
|
|
case ARGV.first when '-h', '--help', '--usage', '-?', 'help', nil
|
|
require 'cmd/help'
|
|
puts Homebrew.help_s
|
|
exit ARGV.first ? 0 : 1
|
|
when '--version'
|
|
puts HOMEBREW_VERSION
|
|
exit 0
|
|
when '-v'
|
|
if ARGV.length > 1
|
|
puts "Homebrew #{HOMEBREW_VERSION}"
|
|
# continue in verbose mode
|
|
ARGV << ARGV.shift
|
|
else
|
|
puts HOMEBREW_VERSION
|
|
exit 0
|
|
end
|
|
end
|
|
|
|
case HOMEBREW_PREFIX.to_s when '/', '/usr'
|
|
# it may work, but I only see pain this route and don't want to support it
|
|
abort "Cowardly refusing to continue at this prefix: #{HOMEBREW_PREFIX}"
|
|
end
|
|
if MACOS_VERSION < 10.5
|
|
abort <<-EOABORT.undent
|
|
Homebrew requires Leopard or higher. For Tiger support, see:
|
|
http://github.com/sceaga/homebrew/tree/tiger
|
|
EOABORT
|
|
end
|
|
|
|
# Many Pathname operations use getwd when they shouldn't, and then throw
|
|
# odd exceptions. Reduce our support burden by showing a user-friendly error.
|
|
Dir.getwd rescue abort "The current working directory doesn't exist, cannot proceed."
|
|
|
|
|
|
def require? path
|
|
require path.to_s.chomp
|
|
rescue LoadError => e
|
|
# HACK :( because we should raise on syntax errors but
|
|
# not if the file doesn't exist. TODO make robust!
|
|
raise unless e.to_s.include? path
|
|
end
|
|
|
|
begin
|
|
aliases = {'ls' => :list,
|
|
'homepage' => :home,
|
|
'-S' => :search,
|
|
'up' => :update,
|
|
'ln' => :link,
|
|
'instal' => :install, # gem does the same
|
|
'rm' => :uninstall,
|
|
'remove' => :uninstall,
|
|
'configure' => :diy,
|
|
'abv' => :info,
|
|
'dr' => :doctor,
|
|
'--repo' => '--repository',
|
|
'environment' => '--env' # same as gem
|
|
}
|
|
|
|
cmd = ARGV.shift
|
|
cmd = aliases[cmd] if aliases[cmd]
|
|
|
|
# Add example external commands to PATH before checking.
|
|
ENV['PATH'] += ":#{HOMEBREW_REPOSITORY}/Library/Contributions/examples"
|
|
if system "/usr/bin/which -s brew-#{cmd}"
|
|
%w[CACHE CELLAR LIBRARY_PATH PREFIX REPOSITORY].each do |e|
|
|
ENV["HOMEBREW_#{e}"] = Object.const_get "HOMEBREW_#{e}"
|
|
end
|
|
exec "brew-#{cmd}", *ARGV
|
|
elsif require? `/usr/bin/which brew-#{cmd}.rb`
|
|
exit 0
|
|
elsif require? HOMEBREW_REPOSITORY/"Library/Homebrew/cmd"/cmd
|
|
Homebrew.send cmd.to_s.gsub('-', '_')
|
|
else
|
|
# Check for git commands
|
|
if %w[branch checkout pull push rebase reset].include? cmd
|
|
onoe "Unknown command: #{cmd} (did you mean `git #{cmd}'?)"
|
|
else
|
|
onoe "Unknown command: #{cmd}"
|
|
end
|
|
end
|
|
|
|
rescue FormulaUnspecifiedError
|
|
abort "This command requires a formula argument"
|
|
rescue KegUnspecifiedError
|
|
abort "This command requires a keg argument"
|
|
rescue UsageError
|
|
onoe "Invalid usage"
|
|
abort ARGV.usage
|
|
rescue SystemExit
|
|
puts "Kernel.exit" if ARGV.verbose?
|
|
raise
|
|
rescue Interrupt => e
|
|
puts # seemingly a newline is typical
|
|
exit 130
|
|
rescue BuildError => e
|
|
require 'cmd/--config'
|
|
require 'cmd/--env'
|
|
|
|
e.backtrace[1] =~ %r{Library/Formula/(.+)\.rb:(\d+)}
|
|
formula_name = $1
|
|
error_line = $2
|
|
|
|
ohai "Exit Status: #{e.exit_status}"
|
|
puts "http://github.com/mxcl/homebrew/blob/master/Library/Formula/#{formula_name}.rb#L#{error_line}"
|
|
ohai "Environment"
|
|
puts Homebrew.config_s
|
|
ohai "Build Flags"
|
|
Homebrew.dump_build_env e.env
|
|
puts
|
|
onoe e
|
|
puts PLEASE_REPORT_BUG
|
|
# this feature can be slow (depends on network conditions and if github is up)
|
|
# so ideally we'd show feedback, eg. "checking for existing issues..." and
|
|
# then replace that string with the following when the github api returns
|
|
issues = GitHub.issues_for_formula formula_name
|
|
puts "These existing issues may help you:", *issues unless issues.empty?
|
|
if e.was_running_configure?
|
|
puts "It looks like an autotools configure failed."
|
|
puts "Consider re-running the install with '-vd' to keep 'config.log' around:"
|
|
puts " brew install -vd #{formula_name}"
|
|
puts "Gist 'config.log' and any error output when reporting an issue."
|
|
puts "Remember to include your config information: brew --config"
|
|
end
|
|
puts
|
|
puts "Also try:"
|
|
puts " `brew doctor` to check your setup for common problems."
|
|
puts " `brew missing` to check installed packages for missing deps."
|
|
exit 1
|
|
rescue RuntimeError, SystemCallError => e
|
|
onoe e
|
|
puts e.backtrace if ARGV.debug?
|
|
exit 1
|
|
rescue Exception => e
|
|
onoe e
|
|
puts PLEASE_REPORT_BUG
|
|
puts e.backtrace
|
|
exit 1
|
|
end
|