From 63cfb0ff61b9f5c1eff01000a3cd9e4a38350cd7 Mon Sep 17 00:00:00 2001 From: Mike McQuaid Date: Sat, 12 Jan 2019 15:59:08 +0000 Subject: [PATCH] Better handle missing environment variables when updating Try to re-exec the Homebrew binary to get the environment variables we need and give up if that doesn't work. --- Library/Homebrew/brew.rb | 16 +++++++++++++++- Library/Homebrew/config.rb | 24 ++++++++++++------------ 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Library/Homebrew/brew.rb b/Library/Homebrew/brew.rb index fdd9092edc..8124cd02cf 100644 --- a/Library/Homebrew/brew.rb +++ b/Library/Homebrew/brew.rb @@ -10,7 +10,21 @@ if RUBY_X < 2 || (RUBY_X == 2 && RUBY_Y < 3) raise "Homebrew must be run under Ruby 2.3! You're running #{RUBY_VERSION}." end -require_relative "global" +begin + require_relative "global" +rescue MissingEnvironmentVariables => e + raise e if ENV["HOMEBREW_MISSING_ENV_RETRY"] + + if ENV["HOMEBREW_DEVELOPER"] + $stderr.puts <<~EOS + Warning: #{e.message} + Retrying with `exec #{ENV["HOMEBREW_BREW_FILE"]}`! + EOS + end + + ENV["HOMEBREW_MISSING_ENV_RETRY"] = "1" + exec ENV["HOMEBREW_BREW_FILE"], *ARGV +end begin trap("INT", std_trap) # restore default CTRL-C handler diff --git a/Library/Homebrew/config.rb b/Library/Homebrew/config.rb index 6d8f25efb4..36b44eb803 100644 --- a/Library/Homebrew/config.rb +++ b/Library/Homebrew/config.rb @@ -1,18 +1,18 @@ -def get_env_or_raise(env, message = nil) - message ||= <<~EOS - don't worry, you likely hit a bug auto-updating from an old version. - Rerun your command, everything is up-to-date and fine now - EOS - unless ENV[env] - abort <<~EOS - Error: #{env} was not exported!\nPlease #{message.chomp}. - EOS - end - ENV[env] +unless ENV["HOMEBREW_BREW_FILE"] + raise "HOMEBREW_BREW_FILE was not exported! Please call bin/brew directly!" end # Path to `bin/brew` main executable in `HOMEBREW_PREFIX` -HOMEBREW_BREW_FILE = Pathname.new(get_env_or_raise("HOMEBREW_BREW_FILE", "call bin/brew directly")) +HOMEBREW_BREW_FILE = Pathname.new(ENV["HOMEBREW_BREW_FILE"]) + +class MissingEnvironmentVariables < RuntimeError; end + +def get_env_or_raise(env) + unless ENV[env] + raise MissingEnvironmentVariables, "#{env} was not exported!" + end + ENV[env] +end # Where we link under HOMEBREW_PREFIX = Pathname.new(get_env_or_raise("HOMEBREW_PREFIX"))