aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew
diff options
context:
space:
mode:
authorMike McQuaid2016-07-15 19:33:30 +0100
committerGitHub2016-07-15 19:33:30 +0100
commita07ab8bb92da082078203301a22eef68eaf3d0ac (patch)
tree49776d1f60832106a5c5d2bdddb4f263ad6ea05d /Library/Homebrew
parenta02be9eea204264ce48827ac365c8b53b986d66a (diff)
downloadbrew-a07ab8bb92da082078203301a22eef68eaf3d0ac.tar.bz2
brew.{rb,sh}: move to Library/Homebrew. (#506)
Diffstat (limited to 'Library/Homebrew')
-rw-r--r--Library/Homebrew/brew.rb146
-rw-r--r--Library/Homebrew/brew.sh249
-rw-r--r--Library/Homebrew/cmd/update.sh2
-rw-r--r--Library/Homebrew/test/.simplecov2
-rw-r--r--Library/Homebrew/test/test_integration_cmds.rb2
5 files changed, 398 insertions, 3 deletions
diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb
new file mode 100644
index 000000000..9d29f4396
--- /dev/null
+++ b/Library/Homebrew/brew.rb
@@ -0,0 +1,146 @@
+std_trap = trap("INT") { exit! 130 } # no backtrace thanks
+
+require "pathname"
+HOMEBREW_LIBRARY_PATH = Pathname.new(__FILE__).realpath.parent
+$:.unshift(HOMEBREW_LIBRARY_PATH.to_s)
+require "global"
+
+if ARGV == %w[--version] || ARGV == %w[-v]
+ puts "Homebrew #{Homebrew.homebrew_version_string}"
+ puts "Homebrew/homebrew-core #{Homebrew.core_tap_version_string}"
+ exit 0
+end
+
+if OS.mac? && 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
+
+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_flag_list = %w[-h --help --usage -?]
+ help_flag = false
+ internal_cmd = true
+ cmd = nil
+
+ ARGV.dup.each_with_index do |arg, i|
+ if help_flag && cmd
+ break
+ elsif help_flag_list.include?(arg)
+ # Option-style help: Both `--help <cmd>` and `<cmd> --help` are fine.
+ help_flag = true
+ elsif arg == "help" && !cmd
+ # Command-style help: `help <cmd>` is fine, but `<cmd> help` is not.
+ help_flag = true
+ elsif !cmd
+ cmd = ARGV.delete_at(i)
+ 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_SHIMS_PATH}/scm"
+
+ if cmd
+ internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("cmd", cmd)
+
+ if !internal_cmd && ARGV.homebrew_developer?
+ internal_cmd = require? HOMEBREW_LIBRARY_PATH.join("dev-cmd", cmd)
+ end
+ end
+
+ # 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
+ require "cmd/help"
+ Homebrew.help cmd, :empty_argv => empty_argv
+ # `Homebrew.help` never returns, except for external/unknown commands.
+ end
+
+ # Uninstall old brew-cask if it's still around; we just use the tap now.
+ if cmd == "cask" && (HOMEBREW_CELLAR/"brew-cask").exist?
+ system(HOMEBREW_BREW_FILE, "uninstall", "--force", "brew-cask")
+ end
+
+ if internal_cmd
+ Homebrew.send cmd.to_s.tr("-", "_").downcase
+ elsif which "brew-#{cmd}"
+ %w[CACHE LIBRARY_PATH].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
+ require "tap"
+ possible_tap = OFFICIAL_CMD_TAPS.find { |_, cmds| cmds.include?(cmd) }
+ possible_tap = Tap.fetch(possible_tap.first) if possible_tap
+
+ if possible_tap && !possible_tap.installed?
+ brew_uid = HOMEBREW_BREW_FILE.stat.uid
+ tap_commands = []
+ if Process.uid.zero? && !brew_uid.zero?
+ tap_commands += %W[/usr/bin/sudo -u ##{brew_uid}]
+ end
+ tap_commands += %W[#{HOMEBREW_BREW_FILE} tap #{possible_tap}]
+ safe_system(*tap_commands)
+ exec HOMEBREW_BREW_FILE, cmd, *ARGV
+ else
+ onoe "Unknown command: #{cmd}"
+ exit 1
+ end
+ end
+
+rescue UsageError => e
+ require "cmd/help"
+ Homebrew.help cmd, :usage_error => e.message
+rescue SystemExit => e
+ onoe "Kernel.exit" if ARGV.verbose? && !e.success?
+ $stderr.puts e.backtrace if ARGV.debug?
+ raise
+rescue Interrupt => e
+ $stderr.puts # seemingly a newline is typical
+ exit 130
+rescue BuildError => e
+ Utils::Analytics.report_exception(e)
+ e.dump
+ exit 1
+rescue RuntimeError, SystemCallError => e
+ Utils::Analytics.report_exception(e)
+ raise if e.message.empty?
+ onoe e
+ $stderr.puts e.backtrace if ARGV.debug?
+ exit 1
+rescue Exception => e
+ Utils::Analytics.report_exception(e)
+ onoe e
+ if internal_cmd && defined?(OS::ISSUES_URL)
+ $stderr.puts "#{Tty.white}Please report this bug:"
+ $stderr.puts " #{Tty.em}#{OS::ISSUES_URL}#{Tty.reset}"
+ end
+ $stderr.puts e.backtrace
+ exit 1
+else
+ exit 1 if Homebrew.failed?
+end
diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh
new file mode 100644
index 000000000..dd9e54e7e
--- /dev/null
+++ b/Library/Homebrew/brew.sh
@@ -0,0 +1,249 @@
+HOMEBREW_VERSION="0.9.9"
+
+onoe() {
+ if [[ -t 2 ]] # check whether stderr is a tty.
+ then
+ echo -ne "\033[4;31mError\033[0m: " >&2 # highlight Error with underline and red color
+ else
+ echo -n "Error: " >&2
+ fi
+ if [[ $# -eq 0 ]]
+ then
+ /bin/cat >&2
+ else
+ echo "$*" >&2
+ fi
+}
+
+odie() {
+ onoe "$@"
+ exit 1
+}
+
+safe_cd() {
+ cd "$@" >/dev/null || odie "Error: failed to cd to $*!"
+}
+
+brew() {
+ "$HOMEBREW_BREW_FILE" "$@"
+}
+
+git() {
+ "$HOMEBREW_LIBRARY/Homebrew/shims/scm/git" "$@"
+}
+
+# Force UTF-8 to avoid encoding issues for users with broken locale settings.
+if [[ "$(locale charmap 2> /dev/null)" != "UTF-8" ]]
+then
+ export LC_ALL="en_US.UTF-8"
+fi
+
+# Where we store built products; /usr/local/Cellar if it exists,
+# otherwise a Cellar relative to the Repository.
+if [[ -d "$HOMEBREW_PREFIX/Cellar" ]]
+then
+ HOMEBREW_CELLAR="$HOMEBREW_PREFIX/Cellar"
+else
+ HOMEBREW_CELLAR="$HOMEBREW_REPOSITORY/Cellar"
+fi
+
+case "$*" in
+ --prefix) echo "$HOMEBREW_PREFIX"; exit 0 ;;
+ --cellar) echo "$HOMEBREW_CELLAR"; exit 0 ;;
+ --repository|--repo) echo "$HOMEBREW_REPOSITORY"; exit 0 ;;
+esac
+
+if [[ "$HOMEBREW_PREFIX" = "/" || "$HOMEBREW_PREFIX" = "/usr" ]]
+then
+ # it may work, but I only see pain this route and don't want to support it
+ odie "Cowardly refusing to continue at this prefix: $HOMEBREW_PREFIX"
+fi
+
+# Users may have these set, pointing the system Ruby
+# at non-system gem paths
+unset GEM_HOME
+unset GEM_PATH
+
+HOMEBREW_SYSTEM="$(uname -s)"
+case "$HOMEBREW_SYSTEM" in
+ Darwin) HOMEBREW_OSX="1";;
+ Linux) HOMEBREW_LINUX="1";;
+esac
+
+HOMEBREW_CURL="/usr/bin/curl"
+if [[ -n "$HOMEBREW_OSX" ]]
+then
+ HOMEBREW_PROCESSOR="$(uname -p)"
+ HOMEBREW_PRODUCT="Homebrew"
+ HOMEBREW_SYSTEM="Macintosh"
+ # This is i386 even on x86_64 machines
+ [[ "$HOMEBREW_PROCESSOR" = "i386" ]] && HOMEBREW_PROCESSOR="Intel"
+ HOMEBREW_OSX_VERSION="$(/usr/bin/sw_vers -productVersion)"
+ HOMEBREW_OS_VERSION="Mac OS X $HOMEBREW_OSX_VERSION"
+
+ printf -v HOMEBREW_OSX_VERSION_NUMERIC "%02d%02d%02d" ${HOMEBREW_OSX_VERSION//./ }
+ if [[ "$HOMEBREW_OSX_VERSION_NUMERIC" -lt "100900" &&
+ -x "$HOMEBREW_PREFIX/opt/curl/bin/curl" ]]
+ then
+ HOMEBREW_CURL="$HOMEBREW_PREFIX/opt/curl/bin/curl"
+ fi
+else
+ HOMEBREW_PROCESSOR="$(uname -m)"
+ HOMEBREW_PRODUCT="${HOMEBREW_SYSTEM}brew"
+ [[ -n "$HOMEBREW_LINUX" ]] && HOMEBREW_OS_VERSION="$(lsb_release -sd 2>/dev/null)"
+ : "${HOMEBREW_OS_VERSION:=$(uname -r)}"
+fi
+HOMEBREW_USER_AGENT="$HOMEBREW_PRODUCT/$HOMEBREW_VERSION ($HOMEBREW_SYSTEM; $HOMEBREW_PROCESSOR $HOMEBREW_OS_VERSION)"
+HOMEBREW_CURL_VERSION="$("$HOMEBREW_CURL" --version 2>/dev/null | head -n1 | /usr/bin/awk '{print $1"/"$2}')"
+HOMEBREW_USER_AGENT_CURL="$HOMEBREW_USER_AGENT $HOMEBREW_CURL_VERSION"
+
+if [[ -z "$HOMEBREW_CACHE" ]]
+then
+ HOMEBREW_CACHE="$HOME/Library/Caches/Homebrew"
+fi
+
+# Declared in bin/brew
+export HOMEBREW_BREW_FILE
+export HOMEBREW_PREFIX
+export HOMEBREW_REPOSITORY
+export HOMEBREW_LIBRARY
+
+# Declared in brew.sh
+export HOMEBREW_VERSION
+export HOMEBREW_CACHE
+export HOMEBREW_CELLAR
+export HOMEBREW_SYSTEM
+export HOMEBREW_CURL
+export HOMEBREW_PROCESSOR
+export HOMEBREW_PRODUCT
+export HOMEBREW_OS_VERSION
+export HOMEBREW_OSX_VERSION
+export HOMEBREW_USER_AGENT
+export HOMEBREW_USER_AGENT_CURL
+
+if [[ -n "$HOMEBREW_OSX" ]]
+then
+ XCODE_SELECT_PATH=$('/usr/bin/xcode-select' --print-path 2>/dev/null)
+ if [[ "$XCODE_SELECT_PATH" = "/" ]]
+ then
+ odie <<EOS
+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
+ fi
+
+ # Don't check xcrun if Xcode and the CLT aren't installed, as that opens
+ # a popup window asking the user to install the CLT
+ if [[ -n "$XCODE_SELECT_PATH" ]]
+ then
+ XCRUN_OUTPUT="$(/usr/bin/xcrun clang 2>&1)"
+ XCRUN_STATUS="$?"
+
+ if [[ "$XCRUN_STATUS" -ne 0 && "$XCRUN_OUTPUT" = *license* ]]
+ then
+ odie <<EOS
+You have not agreed to the Xcode license. Please resolve this by running:
+ sudo xcodebuild -license
+EOS
+ fi
+ fi
+fi
+
+# Many Pathname operations use getwd when they shouldn't, and then throw
+# odd exceptions. Reduce our support burden by showing a user-friendly error.
+if [[ ! -d "$(pwd)" ]]
+then
+ odie "The current working directory doesn't exist, cannot proceed."
+fi
+
+if [[ "$1" = -v ]]
+then
+ # Shift the -v to the end of the parameter list
+ shift
+ set -- "$@" -v
+fi
+
+HOMEBREW_ARG_COUNT="$#"
+HOMEBREW_COMMAND="$1"
+shift
+case "$HOMEBREW_COMMAND" in
+ ls) HOMEBREW_COMMAND="list";;
+ homepage) HOMEBREW_COMMAND="home";;
+ -S) HOMEBREW_COMMAND="search";;
+ up) HOMEBREW_COMMAND="update";;
+ ln) HOMEBREW_COMMAND="link";;
+ instal) HOMEBREW_COMMAND="install";; # gem does the same
+ rm) HOMEBREW_COMMAND="uninstall";;
+ remove) HOMEBREW_COMMAND="uninstall";;
+ configure) HOMEBREW_COMMAND="diy";;
+ abv) HOMEBREW_COMMAND="info";;
+ dr) HOMEBREW_COMMAND="doctor";;
+ --repo) HOMEBREW_COMMAND="--repository";;
+ environment) HOMEBREW_COMMAND="--env";;
+ --config) HOMEBREW_COMMAND="config";;
+esac
+
+if [[ -f "$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.sh" ]]
+then
+ HOMEBREW_BASH_COMMAND="$HOMEBREW_LIBRARY/Homebrew/cmd/$HOMEBREW_COMMAND.sh"
+elif [[ -n "$HOMEBREW_DEVELOPER" && -f "$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.sh" ]]
+then
+ HOMEBREW_BASH_COMMAND="$HOMEBREW_LIBRARY/Homebrew/dev-cmd/$HOMEBREW_COMMAND.sh"
+fi
+
+if [[ "$(id -u)" = "0" && "$(/usr/bin/stat -f%u "$HOMEBREW_BREW_FILE")" != "0" ]]
+then
+ case "$HOMEBREW_COMMAND" in
+ analytics|install|reinstall|postinstall|link|pin|update|upgrade|vendor-install|create|migrate|tap|tap-pin|switch)
+ odie <<EOS
+Cowardly refusing to 'sudo brew $HOMEBREW_COMMAND'
+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
+ ;;
+ esac
+fi
+
+# Hide shellcheck complaint:
+# shellcheck source=/dev/null
+source "$HOMEBREW_LIBRARY/Homebrew/utils/analytics.sh"
+setup-analytics
+report-analytics-screenview-command
+
+update-preinstall() {
+ [[ -n "$HOMEBREW_DEVELOPER" ]] || return
+ [[ -z "$HOMEBREW_NO_AUTO_UPDATE" ]] || return
+ [[ -z "$HOMEBREW_UPDATE_PREINSTALL" ]] || return
+
+ if [[ "$HOMEBREW_COMMAND" = "install" || "$HOMEBREW_COMMAND" = "upgrade" ]]
+ then
+ brew update --preinstall
+ fi
+}
+
+if [[ -n "$HOMEBREW_BASH_COMMAND" ]]
+then
+ # source rather than executing directly to ensure the entire file is read into
+ # memory before it is run. This makes running a Bash script behave more like
+ # a Ruby script and avoids hard-to-debug issues if the Bash script is updated
+ # at the same time as being run.
+ #
+ # Hide shellcheck complaint:
+ # shellcheck source=/dev/null
+ source "$HOMEBREW_BASH_COMMAND"
+ { update-preinstall; "homebrew-$HOMEBREW_COMMAND" "$@"; exit $?; }
+else
+ # Hide shellcheck complaint:
+ # shellcheck source=/dev/null
+ source "$HOMEBREW_LIBRARY/Homebrew/utils/ruby.sh"
+ setup-ruby-path
+
+ # Unshift command back into argument list (unless argument list was empty).
+ [[ "$HOMEBREW_ARG_COUNT" -gt 0 ]] && set -- "$HOMEBREW_COMMAND" "$@"
+ { update-preinstall; exec "$HOMEBREW_RUBY_PATH" -W0 "$HOMEBREW_LIBRARY/Homebrew/brew.rb" "$@"; }
+fi
diff --git a/Library/Homebrew/cmd/update.sh b/Library/Homebrew/cmd/update.sh
index 49a15864f..e9ad69c06 100644
--- a/Library/Homebrew/cmd/update.sh
+++ b/Library/Homebrew/cmd/update.sh
@@ -9,7 +9,7 @@
# shellcheck source=/dev/null
source "$HOMEBREW_LIBRARY/Homebrew/utils/lock.sh"
-# Replaces the function in Library/brew.sh to cache the Git executable to
+# Replaces the function in Library/Homebrew/brew.sh to cache the Git executable to
# provide speedup when using Git repeatedly (as update.sh does).
git() {
if [[ -z "$GIT_EXECUTABLE" ]]
diff --git a/Library/Homebrew/test/.simplecov b/Library/Homebrew/test/.simplecov
index 3dec7d3b7..b3f87cfdb 100644
--- a/Library/Homebrew/test/.simplecov
+++ b/Library/Homebrew/test/.simplecov
@@ -34,7 +34,7 @@ SimpleCov.start do
add_group "OS", "/Homebrew/os/"
add_group "Requirements", "/Homebrew/requirements/"
add_group "Scripts", %w[
- /brew.rb
+ /Homebrew/brew.rb
/Homebrew/build.rb
/Homebrew/postinstall.rb
/Homebrew/test.rb
diff --git a/Library/Homebrew/test/test_integration_cmds.rb b/Library/Homebrew/test/test_integration_cmds.rb
index 642fadf5f..c020deaf4 100644
--- a/Library/Homebrew/test/test_integration_cmds.rb
+++ b/Library/Homebrew/test/test_integration_cmds.rb
@@ -64,7 +64,7 @@ class IntegrationCommandTests < Homebrew::TestCase
cmd_args << "-rsimplecov"
end
cmd_args << "-rintegration_mocks"
- cmd_args << (HOMEBREW_LIBRARY_PATH/"../brew.rb").resolved_path.to_s
+ cmd_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
cmd_args += args
Bundler.with_original_env do
ENV["HOMEBREW_BREW_FILE"] = HOMEBREW_PREFIX/"bin/brew"