Created
September 25, 2015 14:39
-
-
Save kennethjohnbalgos/75580adbe58594aefc0f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby -W0 | |
std_trap = trap("INT") { exit! 130 } # no backtrace thanks | |
HOMEBREW_BREW_FILE = ENV['HOMEBREW_BREW_FILE'] | |
if ARGV == %w{--prefix} | |
puts File.dirname(File.dirname(HOMEBREW_BREW_FILE)) | |
exit 0 | |
end | |
require 'pathname' | |
HOMEBREW_LIBRARY_PATH = Pathname.new(__FILE__).realpath.parent.join("Homebrew") | |
$:.unshift(HOMEBREW_LIBRARY_PATH.to_s) | |
require 'global' | |
if ARGV.first == '--version' | |
puts HOMEBREW_VERSION | |
exit 0 | |
elsif ARGV.first == '-v' | |
puts "Homebrew #{HOMEBREW_VERSION}" | |
# Shift the -v to the end of the parameter list | |
ARGV << ARGV.shift | |
# If no other arguments, just quit here. | |
exit 0 if ARGV.length == 1 | |
end | |
# Check for bad xcode-select before anything else, because `doctor` and | |
# many other things will hang | |
# Note that this bug was fixed in 10.9 | |
if OS.mac? && MacOS.version < :mavericks && MacOS.active_developer_dir == "/" | |
odie <<-EOS.undent | |
Your xcode-select path is currently set to '/'. | |
This causes the `xcrun` tool to hang, and can render Homebrew unusable. | |
If you are using Xcode, you should: | |
sudo xcode-select -switch /Applications/Xcode.app | |
Otherwise, you should: | |
sudo rm -rf /usr/share/xcode-select | |
EOS | |
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 OS.mac? and MacOS.version < "10.6" | |
abort <<-EOABORT.undent | |
Homebrew requires Snow Leopard or higher. For Tiger and Leopard support, see: | |
https://github.com/mistydemeo/tigerbrew | |
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 | |
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 | |
trap("INT", std_trap) # restore default CTRL-C handler | |
empty_argv = ARGV.empty? | |
help_regex = /(-h$|--help$|--usage$|-\?$|^help$)/ | |
help_flag = false | |
cmd = nil | |
ARGV.dup.each_with_index do |arg, i| | |
if help_flag && cmd | |
break | |
elsif arg =~ help_regex | |
help_flag = true | |
elsif !cmd | |
cmd = ARGV.delete_at(i) | |
end | |
end | |
cmd = HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(cmd, cmd) | |
sudo_check = %w[ install link pin unpin upgrade ] | |
if sudo_check.include? cmd | |
if Process.uid.zero? and not File.stat(HOMEBREW_BREW_FILE).uid.zero? | |
raise <<-EOS.undent | |
Cowardly refusing to `sudo brew #{cmd}` | |
You can use brew with sudo, but only if the brew executable is owned by root. | |
However, this is both not recommended and completely unsupported so do so at | |
your own risk. | |
EOS | |
end | |
end | |
# Add contributed commands to PATH before checking. | |
Dir["#{HOMEBREW_LIBRARY}/Taps/*/*/cmd"].each do |tap_cmd_dir| | |
ENV["PATH"] += "#{File::PATH_SEPARATOR}#{tap_cmd_dir}" | |
end | |
# Add SCM wrappers. | |
ENV["PATH"] += "#{File::PATH_SEPARATOR}#{HOMEBREW_LIBRARY}/ENV/scm" | |
internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("cmd", cmd) if cmd | |
# Usage instructions should be displayed if and only if one of: | |
# - a help flag is passed AND an internal command is matched | |
# - a help flag is passed AND there is no command specified | |
# - no arguments are passed | |
# | |
# It should never affect external commands so they can handle usage | |
# arguments themselves. | |
if empty_argv || (help_flag && (cmd.nil? || internal_cmd)) | |
# TODO - `brew help cmd` should display subcommand help | |
require 'cmd/help' | |
puts ARGV.usage | |
exit ARGV.any? ? 0 : 1 | |
end | |
if internal_cmd | |
Homebrew.send cmd.to_s.gsub('-', '_').downcase | |
elsif which "brew-#{cmd}" | |
%w[CACHE CELLAR LIBRARY_PATH PREFIX REPOSITORY].each do |e| | |
ENV["HOMEBREW_#{e}"] = Object.const_get("HOMEBREW_#{e}").to_s | |
end | |
exec "brew-#{cmd}", *ARGV | |
elsif (path = which("brew-#{cmd}.rb")) && require?(path) | |
exit Homebrew.failed? ? 1 : 0 | |
else | |
onoe "Unknown command: #{cmd}" | |
exit 1 | |
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 | |
e.dump | |
exit 1 | |
rescue RuntimeError, SystemCallError => e | |
raise if e.message.empty? | |
onoe e | |
puts e.backtrace if ARGV.debug? | |
exit 1 | |
rescue Exception => e | |
onoe e | |
puts "#{Tty.white}Please report this bug:" | |
puts " #{Tty.em}#{OS::ISSUES_URL}#{Tty.reset}" | |
puts e.backtrace | |
exit 1 | |
else | |
exit 1 if Homebrew.failed? | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment