227 lines
7.8 KiB
Ruby
Raw Normal View History

# typed: strict
# frozen_string_literal: true
2023-03-18 13:55:19 -07:00
# `HOMEBREW_STACKPROF` should be set via `brew prof --stackprof`, not manually.
if ENV["HOMEBREW_STACKPROF"]
require "rubygems"
require "stackprof"
StackProf.start(mode: :wall, raw: true)
end
raise "HOMEBREW_BREW_FILE was not exported! Please call bin/brew directly!" unless ENV["HOMEBREW_BREW_FILE"]
if $PROGRAM_NAME != __FILE__ && !$PROGRAM_NAME.end_with?("/bin/ruby-prof")
raise "#{__FILE__} must not be loaded via `require`."
end
std_trap = trap("INT") { exit! 130 } # no backtrace thanks
2022-05-30 04:05:07 +01:00
require_relative "global"
begin
trap("INT", std_trap) # restore default CTRL-C handler
2020-12-11 22:15:18 +01:00
if ENV["CI"]
$stdout.sync = true
$stderr.sync = true
end
empty_argv = ARGV.empty?
help_flag_list = %w[-h --help --usage -?]
2016-10-01 18:17:52 +03:00
help_flag = !ENV["HOMEBREW_HELP"].nil?
2023-03-18 13:55:19 -07:00
help_cmd_index = T.let(nil, T.nilable(Integer))
cmd = T.let(nil, T.nilable(String))
ARGV.each_with_index do |arg, i|
2016-09-22 20:12:28 +02:00
break if help_flag && cmd
2016-10-01 18:17:52 +03:00
if arg == "help" && !cmd
# Command-style help: `help <cmd>` is fine, but `<cmd> help` is not.
help_flag = true
help_cmd_index = i
2020-12-01 17:04:59 +00:00
elsif !cmd && help_flag_list.exclude?(arg)
require "commands"
cmd = ARGV.delete_at(i)
2020-06-22 10:23:00 +05:30
cmd = Commands::HOMEBREW_INTERNAL_COMMAND_ALIASES.fetch(cmd, cmd)
end
end
ARGV.delete_at(help_cmd_index) if help_cmd_index
2021-01-25 09:18:10 +00:00
require "cli/parser"
2024-08-10 09:22:12 -07:00
args = Homebrew::CLI::Parser.new(Homebrew::Cmd::Brew).parse(ARGV.dup.freeze, ignore_invalid_options: true)
Context.current = args.context
2020-07-30 18:40:10 +02:00
path = PATH.new(ENV.fetch("PATH"))
homebrew_path = PATH.new(ENV.fetch("HOMEBREW_PATH"))
2017-04-27 10:44:44 +02:00
# Add shared wrappers.
path.prepend(HOMEBREW_SHIMS_PATH/"shared")
homebrew_path.prepend(HOMEBREW_SHIMS_PATH/"shared")
2017-04-27 10:44:44 +02:00
2023-03-18 13:55:19 -07:00
ENV["PATH"] = path.to_s
require "commands"
2015-09-10 21:20:34 +08:00
internal_cmd = Commands.valid_internal_cmd?(cmd) || Commands.valid_internal_dev_cmd?(cmd) if cmd
2021-10-22 11:46:54 -04:00
unless internal_cmd
# Add contributed commands to PATH before checking.
homebrew_path.append(Commands.tap_cmd_directories)
# External commands expect a normal PATH
2023-03-18 13:55:19 -07:00
ENV["PATH"] = homebrew_path.to_s
end
# Usage instructions should be displayed if and only if one of:
# - a help flag is passed AND a command is matched
# - a help flag is passed AND there is no command specified
# - no arguments are passed
2021-01-25 09:18:10 +00:00
if empty_argv || help_flag
require "help"
2024-03-07 16:20:20 +00:00
Homebrew::Help.help cmd, remaining_args: args.remaining, empty_argv:
2020-08-02 15:36:05 +02:00
# `Homebrew::Help.help` never returns, except for unknown commands.
end
if internal_cmd || Commands.external_ruby_v2_cmd_path(cmd)
cmd = T.must(cmd)
cmd_class = Homebrew::AbstractCommand.command(cmd)
Homebrew.running_command = cmd
2024-03-03 15:32:30 -08:00
if cmd_class
command_instance = cmd_class.new
require "utils/analytics"
Utils::Analytics.report_command_run(command_instance)
command_instance.run
2024-03-03 15:32:30 -08:00
else
Homebrew.public_send Commands.method_name(cmd)
end
elsif (path = Commands.external_ruby_cmd_path(cmd))
Homebrew.running_command = cmd
require?(path)
exit Homebrew.failed? ? 1 : 0
elsif Commands.external_cmd_path(cmd)
%w[CACHE LIBRARY_PATH].each do |env|
2023-12-18 09:34:01 -08:00
ENV["HOMEBREW_#{env}"] = Object.const_get(:"HOMEBREW_#{env}").to_s
end
exec "brew-#{cmd}", *ARGV
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? ||
(blocked_tap = Tap.untapped_official_taps.include?(possible_tap.name))
if blocked_tap
onoe <<~EOS
`brew #{cmd}` is unavailable because #{possible_tap.name} was manually untapped.
Run `brew tap #{possible_tap.name}` to reenable `brew #{cmd}`.
EOS
end
2022-02-11 10:49:21 -05:00
# Check for cask explicitly because it's very common in old guides
odie "`brew cask` is no longer a `brew` command. Use `brew <command> --cask` instead." if cmd == "cask"
odie "Unknown command: brew #{cmd}"
2021-01-19 17:55:03 -05:00
end
2017-09-24 20:12:58 +01:00
2017-10-18 08:47:52 -03:00
# Unset HOMEBREW_HELP to avoid confusing the tap
2020-07-30 18:40:10 +02:00
with_env HOMEBREW_HELP: nil do
tap_commands = []
if (File.exist?("/.dockerenv") ||
Homebrew.running_as_root? ||
((cgroup = Utils.popen_read("cat", "/proc/1/cgroup").presence) &&
%w[azpl_job actions_job docker garden kubepods].none? { |type| cgroup.include?(type) })) &&
Homebrew.running_as_root_but_not_owned_by_root?
tap_commands += %W[/usr/bin/sudo -u ##{Homebrew.owner_uid}]
2020-07-30 18:40:10 +02:00
end
quiet_arg = args.quiet? ? "--quiet" : nil
tap_commands += [HOMEBREW_BREW_FILE, "tap", *quiet_arg, possible_tap.name]
2020-07-30 18:40:10 +02:00
safe_system(*tap_commands)
end
2020-07-30 18:40:10 +02:00
ARGV << "--help" if help_flag
2017-09-24 20:12:58 +01:00
exec HOMEBREW_BREW_FILE, cmd, *ARGV
end
rescue UsageError => e
require "help"
Homebrew::Help.help cmd, remaining_args: args&.remaining, usage_error: e.message
rescue SystemExit => e
onoe "Kernel.exit" if args&.debug? && !e.success?
if args&.debug? || ARGV.include?("--debug")
require "utils/backtrace"
$stderr.puts Utils::Backtrace.clean(e)
end
raise
rescue Interrupt
$stderr.puts # seemingly a newline is typical
exit 130
rescue BuildError => e
Utils::Analytics.report_build_error(e)
2024-04-03 20:17:02 -07:00
e.dump(verbose: args&.verbose? || false)
When a HEAD build fails, output an instruction to raise PRs not issues - This has to be in multiple places, hence a new method. A patch failing to apply, which is a common occurrence with HEAD builds because the patch is already upstream, raises a different exception to another, "normal" build failure. Tested with: ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD mtr ==> Cloning https://github.com/traviscross/mtr.git Updating /home/issyl0/.cache/Homebrew/mtr--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 155f76a Merge pull request #340 from Sea-n/master ==> Downloading https://github.com/traviscross/mtr/pull/315.patch?full_index=1 Already downloaded: /home/issyl0/.cache/Homebrew/downloads/82d9d939303d8fceb7a3ae071ecd49a5f075e0fb451b308653b555ffbae74336--315.patch ==> Patching ==> Applying 315.patch patching file packet/probe.c Hunk #1 FAILED at 323. Hunk #2 FAILED at 364. 2 out of 2 hunks FAILED -- saving rejects to file packet/probe.c.rej Error: Failure while executing; `patch -g 0 -f -p1 -i /tmp/mtr--patch-20200330-10734-avjmyy/315.patch` exited with 1. HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ``` and ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD zookeeper ==> Cloning https://gitbox.apache.org/repos/asf/zookeeper.git Updating /home/issyl0/.cache/Homebrew/zookeeper--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 1ff1b779 ZOOKEEPER-3755: Use maven to create fatjar ==> ant compile_jute Last 15 lines from /home/issyl0/.cache/Homebrew/Logs/zookeeper/01.ant: 2020-03-30 21:45:10 +0100 ant compile_jute Picked up _JAVA_OPTIONS: -Duser.home=/home/issyl0/.cache/Homebrew/java_cache Buildfile: build.xml does not exist! Build failed READ THIS: https://docs.brew.sh/Troubleshooting HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ```
2020-03-30 20:44:01 +01:00
if OS.unsupported_configuration?
$stderr.puts "#{Tty.bold}Do not report this issue: you are running in an unsupported configuration.#{Tty.reset}"
elsif e.formula.head? || e.formula.deprecated? || e.formula.disabled?
reason = if e.formula.head?
"was built from an unstable upstream --HEAD"
elsif e.formula.deprecated?
"is deprecated"
elsif e.formula.disabled?
"is disabled"
end
2020-07-26 11:53:05 +02:00
$stderr.puts <<~EOS
#{e.formula.name}'s formula #{reason}.
This build failure is expected behaviour.
Do not create issues about this on Homebrew's GitHub repositories.
Any opened issues will be immediately closed without response.
Do not ask for help from Homebrew or its maintainers on social media.
You may ask for help in Homebrew's discussions but are unlikely to receive a response.
Try to figure out the problem yourself and submit a fix as a pull request.
We will review it but may or may not accept it.
2020-07-26 11:53:05 +02:00
EOS
2020-07-26 11:53:05 +02:00
end
When a HEAD build fails, output an instruction to raise PRs not issues - This has to be in multiple places, hence a new method. A patch failing to apply, which is a common occurrence with HEAD builds because the patch is already upstream, raises a different exception to another, "normal" build failure. Tested with: ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD mtr ==> Cloning https://github.com/traviscross/mtr.git Updating /home/issyl0/.cache/Homebrew/mtr--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 155f76a Merge pull request #340 from Sea-n/master ==> Downloading https://github.com/traviscross/mtr/pull/315.patch?full_index=1 Already downloaded: /home/issyl0/.cache/Homebrew/downloads/82d9d939303d8fceb7a3ae071ecd49a5f075e0fb451b308653b555ffbae74336--315.patch ==> Patching ==> Applying 315.patch patching file packet/probe.c Hunk #1 FAILED at 323. Hunk #2 FAILED at 364. 2 out of 2 hunks FAILED -- saving rejects to file packet/probe.c.rej Error: Failure while executing; `patch -g 0 -f -p1 -i /tmp/mtr--patch-20200330-10734-avjmyy/315.patch` exited with 1. HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ``` and ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD zookeeper ==> Cloning https://gitbox.apache.org/repos/asf/zookeeper.git Updating /home/issyl0/.cache/Homebrew/zookeeper--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 1ff1b779 ZOOKEEPER-3755: Use maven to create fatjar ==> ant compile_jute Last 15 lines from /home/issyl0/.cache/Homebrew/Logs/zookeeper/01.ant: 2020-03-30 21:45:10 +0100 ant compile_jute Picked up _JAVA_OPTIONS: -Duser.home=/home/issyl0/.cache/Homebrew/java_cache Buildfile: build.xml does not exist! Build failed READ THIS: https://docs.brew.sh/Troubleshooting HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ```
2020-03-30 20:44:01 +01:00
exit 1
rescue RuntimeError, SystemCallError => e
raise if e.message.empty?
2018-09-17 02:45:00 +02:00
onoe e
if args&.debug? || ARGV.include?("--debug")
require "utils/backtrace"
$stderr.puts Utils::Backtrace.clean(e)
end
exit 1
rescue Exception => e # rubocop:disable Lint/RescueException
onoe e
When a HEAD build fails, output an instruction to raise PRs not issues - This has to be in multiple places, hence a new method. A patch failing to apply, which is a common occurrence with HEAD builds because the patch is already upstream, raises a different exception to another, "normal" build failure. Tested with: ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD mtr ==> Cloning https://github.com/traviscross/mtr.git Updating /home/issyl0/.cache/Homebrew/mtr--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 155f76a Merge pull request #340 from Sea-n/master ==> Downloading https://github.com/traviscross/mtr/pull/315.patch?full_index=1 Already downloaded: /home/issyl0/.cache/Homebrew/downloads/82d9d939303d8fceb7a3ae071ecd49a5f075e0fb451b308653b555ffbae74336--315.patch ==> Patching ==> Applying 315.patch patching file packet/probe.c Hunk #1 FAILED at 323. Hunk #2 FAILED at 364. 2 out of 2 hunks FAILED -- saving rejects to file packet/probe.c.rej Error: Failure while executing; `patch -g 0 -f -p1 -i /tmp/mtr--patch-20200330-10734-avjmyy/315.patch` exited with 1. HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ``` and ``` ╭─issyl0@rigel /home/linuxbrew/.linuxbrew/Homebrew ‹head-builds-arent-officially-supported*› ╰─ $ brew install --HEAD zookeeper ==> Cloning https://gitbox.apache.org/repos/asf/zookeeper.git Updating /home/issyl0/.cache/Homebrew/zookeeper--git ==> Checking out branch master Already on 'master' Your branch is up to date with 'origin/master'. HEAD is now at 1ff1b779 ZOOKEEPER-3755: Use maven to create fatjar ==> ant compile_jute Last 15 lines from /home/issyl0/.cache/Homebrew/Logs/zookeeper/01.ant: 2020-03-30 21:45:10 +0100 ant compile_jute Picked up _JAVA_OPTIONS: -Duser.home=/home/issyl0/.cache/Homebrew/java_cache Buildfile: build.xml does not exist! Build failed READ THIS: https://docs.brew.sh/Troubleshooting HEAD builds are unsupported by maintainers - please file pull requests instead of issues. ```
2020-03-30 20:44:01 +01:00
method_deprecated_error = e.is_a?(MethodDeprecatedError)
require "utils/backtrace"
$stderr.puts Utils::Backtrace.clean(e) if args&.debug? || ARGV.include?("--debug") || !method_deprecated_error
if OS.unsupported_configuration?
$stderr.puts "#{Tty.bold}Do not report this issue: you are running in an unsupported configuration.#{Tty.reset}"
elsif Homebrew::EnvConfig.no_auto_update? &&
(fetch_head = HOMEBREW_REPOSITORY/".git/FETCH_HEAD") &&
(!fetch_head.exist? || (fetch_head.mtime.to_date < Date.today))
$stderr.puts "#{Tty.bold}You have disabled automatic updates and have not updated today.#{Tty.reset}"
$stderr.puts "#{Tty.bold}Do not report this issue until you've run `brew update` and tried again.#{Tty.reset}"
elsif (issues_url = (method_deprecated_error && e.issues_url) || Utils::Backtrace.tap_error_url(e))
$stderr.puts "If reporting this issue please do so at (not Homebrew/brew or Homebrew/homebrew-core):"
$stderr.puts " #{Formatter.url(issues_url)}"
elsif internal_cmd
$stderr.puts "#{Tty.bold}Please report this issue:#{Tty.reset}"
$stderr.puts " #{Formatter.url(OS::ISSUES_URL)}"
end
exit 1
else
exit 1 if Homebrew.failed?
ensure
if ENV["HOMEBREW_STACKPROF"]
StackProf.stop
StackProf.results("prof/stackprof.dump")
end
end