#!/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 if Process.uid.zero? and not File.stat(HOMEBREW_BREW_FILE).uid.zero? # note we only abort if Homebrew is *not* uninstalled sudo and the user # calls brew as root. The fix is to chown brew to root. abort "Cowardly refusing to `sudo brew'" 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