diff --git a/Library/Homebrew/brew.sh b/Library/Homebrew/brew.sh index f3bb605bb8..8a6ceff8fd 100644 --- a/Library/Homebrew/brew.sh +++ b/Library/Homebrew/brew.sh @@ -296,6 +296,13 @@ source "$HOMEBREW_LIBRARY/Homebrew/utils/analytics.sh" setup-analytics report-analytics-screenview-command +# Let user know we're still updating Homebrew if brew update --preinstall +# exceeds 3 seconds. +update-preinstall-timer() { + sleep 3 + echo 'Updating Homebrew...' >&2 +} + update-preinstall() { [[ -z "$HOMEBREW_HELP" ]] || return [[ -z "$HOMEBREW_NO_AUTO_UPDATE" ]] || return @@ -306,7 +313,19 @@ update-preinstall() { if [[ "$HOMEBREW_COMMAND" = "install" || "$HOMEBREW_COMMAND" = "upgrade" || "$HOMEBREW_COMMAND" = "tap" ]] then + if [[ -z "$HOMEBREW_VERBOSE" ]] + then + update-preinstall-timer & + timer_pid=$! + fi + brew update --preinstall + + if [[ -n "$timer_pid" ]] + then + kill "$timer_pid" 2>/dev/null + wait "$timer_pid" 2>/dev/null + fi fi # If brew update --preinstall did a migration then export the new locations. diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 0867e893ad..16639c4aac 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -142,6 +142,7 @@ module Homebrew msg = "#{current.full_name}-#{current.installed_version} already installed" unless current.linked_keg.symlink? || current.keg_only? msg << ", it's just not linked" + puts "You can link formula with `brew link #{f}`" end opoo msg elsif f.migration_needed? && !ARGV.force? @@ -222,25 +223,12 @@ module Homebrew def check_development_tools checks = Diagnostic::Checks.new - all_development_tools_checks = checks.development_tools_checks + - checks.fatal_development_tools_checks - all_development_tools_checks.each do |check| + checks.fatal_development_tools_checks.each do |check| out = checks.send(check) next if out.nil? - if checks.fatal_development_tools_checks.include?(check) - odie out - else - opoo out - end + ofail out end - end - - def check_macports - return if MacOS.macports_or_fink.empty? - - opoo "It appears you have MacPorts or Fink installed." - puts "Software installed with other package managers causes known problems for" - puts "Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again." + exit 1 if Homebrew.failed? end def check_cellar @@ -282,8 +270,5 @@ module Homebrew # another formula. In that case, don't generate an error, just move on. rescue CannotInstallFormulaError => e ofail e.message - rescue BuildError - check_macports - raise end end diff --git a/Library/Homebrew/cmd/update-report.rb b/Library/Homebrew/cmd/update-report.rb index 72dcc293de..9d096c4cbb 100644 --- a/Library/Homebrew/cmd/update-report.rb +++ b/Library/Homebrew/cmd/update-report.rb @@ -415,7 +415,7 @@ class Reporter # This means it is a Cask if report[:DC].include? full_name - next unless (HOMEBREW_REPOSITORY/"Caskroom"/name).exist? + next unless (HOMEBREW_PREFIX/"Caskroom"/name).exist? new_tap = Tap.fetch(new_tap_name) new_tap.install unless new_tap.installed? ohai "#{name} has been moved to Homebrew.", <<-EOS.undent @@ -442,7 +442,7 @@ class Reporter new_tap = Tap.fetch(new_tap_name) # For formulae migrated to cask: Auto-install cask or provide install instructions. if new_tap_name == "caskroom/cask" - if new_tap.installed? && (HOMEBREW_REPOSITORY/"Caskroom").directory? + if new_tap.installed? && (HOMEBREW_PREFIX/"Caskroom").directory? ohai "#{name} has been moved to Homebrew-Cask." ohai "brew uninstall --force #{name}" system HOMEBREW_BREW_FILE, "uninstall", "--force", name diff --git a/Library/Homebrew/dev-cmd/bottle.rb b/Library/Homebrew/dev-cmd/bottle.rb index b1a3ebb431..7e98f2ebb1 100644 --- a/Library/Homebrew/dev-cmd/bottle.rb +++ b/Library/Homebrew/dev-cmd/bottle.rb @@ -251,6 +251,8 @@ module Homebrew relocatable = false if keg_contain?(cellar, keg, ignores) if prefix != prefix_check relocatable = false if keg_contain_absolute_symlink_starting_with?(prefix, keg) + relocatable = false if keg_contain?("#{prefix}/etc", keg, ignores) + relocatable = false if keg_contain?("#{prefix}/var", keg, ignores) end skip_relocation = relocatable && !keg.require_relocation? end diff --git a/Library/Homebrew/diagnostic.rb b/Library/Homebrew/diagnostic.rb index fbc10fe208..e499c4d3b8 100644 --- a/Library/Homebrew/diagnostic.rb +++ b/Library/Homebrew/diagnostic.rb @@ -86,12 +86,17 @@ module Homebrew def development_tools_checks %w[ check_for_installed_developer_tools - ] + ].freeze end def fatal_development_tools_checks %w[ - ] + ].freeze + end + + def build_error_checks + (development_tools_checks + %w[ + ]).freeze end def check_for_installed_developer_tools @@ -172,6 +177,7 @@ module Homebrew "libUFSDExtFS.dylib", # Paragon ExtFS "libecomlodr.dylib", # Symantec Endpoint Protection "libsymsea.*.dylib", # Symantec Endpoint Protection + "sentinel.dylib", # SentinelOne ] __check_stray_files "/usr/local/lib", "*.dylib", white_list, <<-EOS.undent diff --git a/Library/Homebrew/exceptions.rb b/Library/Homebrew/exceptions.rb index 7aecbe494f..3d9b24034f 100644 --- a/Library/Homebrew/exceptions.rb +++ b/Library/Homebrew/exceptions.rb @@ -327,22 +327,9 @@ class BuildError < RuntimeError end def dump - if !ARGV.verbose? - puts - puts Formatter.error(Formatter.url(OS::ISSUES_URL), label: "READ THIS") - if formula.tap - case formula.tap.name - when "homebrew/boneyard" - puts "#{formula} was moved to homebrew-boneyard because it has unfixable issues." - puts "Please do not file any issues about this. Sorry!" - else - if issues_url = formula.tap.issues_url - puts "If reporting this issue please do so at (not Homebrew/brew):" - puts " #{Formatter.url(issues_url)}" - end - end - end - else + puts + + if ARGV.verbose? require "system_config" require "build_environment" @@ -360,15 +347,50 @@ class BuildError < RuntimeError puts logs.map { |fn| " #{fn}" }.join("\n") end end + + if formula.tap && formula.tap.name == "homebrew/boneyard" + onoe <<-EOS.undent + #{formula} was moved to homebrew-boneyard because it has unfixable issues. + Please do not file any issues about this. Sorry! + EOS + return + end + + if formula.tap + if formula.tap.official? + puts Formatter.error(Formatter.url(OS::ISSUES_URL), label: "READ THIS") + elsif issues_url = formula.tap.issues_url + puts <<-EOS.undent + If reporting this issue please do so at (not Homebrew/brew or Homebrew/core): + #{Formatter.url(issues_url)} + EOS + else + puts <<-EOS.undent + If reporting this issue please do so to (not Homebrew/brew or Homebrew/core): + #{formula.tap} + EOS + end + else + puts <<-EOS.undent + Do not report this issue to Homebrew/brew or Homebrew/core! + EOS + end + puts + if issues && !issues.empty? puts "These open issues may also help:" puts issues.map { |i| "#{i["title"]} #{i["html_url"]}" }.join("\n") end require "diagnostic" - unsupported_macos = Homebrew::Diagnostic::Checks.new.check_for_unsupported_macos - opoo unsupported_macos if unsupported_macos + checks = Homebrew::Diagnostic::Checks.new + checks.build_error_checks.each do |check| + out = checks.send(check) + next if out.nil? + puts + ofail out + end end end diff --git a/Library/Homebrew/extend/os/mac/diagnostic.rb b/Library/Homebrew/extend/os/mac/diagnostic.rb index 0ac95bfd98..0f37e8af57 100644 --- a/Library/Homebrew/extend/os/mac/diagnostic.rb +++ b/Library/Homebrew/extend/os/mac/diagnostic.rb @@ -10,19 +10,23 @@ module Homebrew check_xcode_license_approved check_for_osx_gcc_installer check_xcode_8_without_clt_on_el_capitan - ] + check_xcode_up_to_date + check_clt_up_to_date + check_for_other_package_managers + ].freeze end def fatal_development_tools_checks - if MacOS.version >= :sierra && ENV["CI"].nil? - %w[ - check_xcode_up_to_date - check_clt_up_to_date - ] - else - %w[ - ] - end + %w[ + check_xcode_minimum_version + check_clt_minimum_version + ].freeze + end + + def build_error_checks + (development_tools_checks + %w[ + check_for_unsupported_macos + ]).freeze end def check_for_unsupported_macos @@ -62,7 +66,8 @@ module Homebrew end def check_xcode_up_to_date - return unless MacOS::Xcode.installed? && MacOS::Xcode.outdated? + return unless MacOS::Xcode.installed? + return unless MacOS::Xcode.outdated? message = <<-EOS.undent Your Xcode (#{MacOS::Xcode.version}) is outdated. @@ -83,7 +88,8 @@ module Homebrew end def check_clt_up_to_date - return unless MacOS::CLT.installed? && MacOS::CLT.outdated? + return unless MacOS::CLT.installed? + return unless MacOS::CLT.outdated? <<-EOS.undent A newer Command Line Tools release is available. @@ -94,7 +100,8 @@ module Homebrew def check_xcode_8_without_clt_on_el_capitan return unless MacOS::Xcode.without_clt? # Scope this to Xcode 8 on El Cap for now - return unless MacOS.version == :el_capitan && MacOS::Xcode.version >= "8" + return unless MacOS.version == :el_capitan + return unless MacOS::Xcode.version >= "8" <<-EOS.undent You have Xcode 8 installed without the CLT; @@ -104,6 +111,27 @@ module Homebrew EOS end + def check_xcode_minimum_version + return unless MacOS::Xcode.installed? + return unless MacOS::Xcode.minimum_version? + + <<-EOS.undent + Your Xcode (#{MacOS::Xcode.version}) is too outdated. + Please update to Xcode #{MacOS::Xcode.latest_version} (or delete it). + #{MacOS::Xcode.update_instructions} + EOS + end + + def check_clt_minimum_version + return unless MacOS::CLT.installed? + return unless MacOS::CLT.minimum_version? + + <<-EOS.undent + Your Command Line Tools are too outdated. + #{MacOS::CLT.update_instructions} + EOS + end + def check_for_osx_gcc_installer return unless MacOS.version < "10.7" || ((MacOS::Xcode.version || "0") > "4.1") return unless DevelopmentTools.clang_version == "2.1" diff --git a/Library/Homebrew/extend/os/mac/utils/bottles.rb b/Library/Homebrew/extend/os/mac/utils/bottles.rb index 0dd7341ea1..18312c9fa8 100644 --- a/Library/Homebrew/extend/os/mac/utils/bottles.rb +++ b/Library/Homebrew/extend/os/mac/utils/bottles.rb @@ -38,7 +38,6 @@ module Utils # Allows a bottle tag to specify a specific OS or later, # so the same bottle can target multiple OSs. - # Not used in core, used in taps. def find_or_later_tag(tag) begin tag_version = MacOS::Version.from_symbol(tag) diff --git a/Library/Homebrew/formulary.rb b/Library/Homebrew/formulary.rb index 5ce09f6ba5..4d6832e44f 100644 --- a/Library/Homebrew/formulary.rb +++ b/Library/Homebrew/formulary.rb @@ -159,6 +159,11 @@ class Formulary attr_reader :tap def initialize(tapped_name) + name, path = formula_name_path(tapped_name) + super name, path + end + + def formula_name_path(tapped_name, warn: true) user, repo, name = tapped_name.split("/", 3).map(&:downcase) @tap = Tap.fetch user, repo formula_dir = @tap.formula_dir || @tap.path @@ -170,12 +175,25 @@ class Formulary name = path.basename(".rb").to_s elsif (new_name = @tap.formula_renames[name]) && (new_path = formula_dir/"#{new_name}.rb").file? + old_name = name path = new_path name = new_name + new_name = @tap.core_tap? ? name : "#{@tap}/#{name}" + elsif (new_tap_name = @tap.tap_migrations[name]) + new_tap = Tap.fetch new_tap_name + new_tap.install unless new_tap.installed? + new_tapped_name = "#{new_tap_name}/#{name}" + name, path = formula_name_path(new_tapped_name, warn: false) + old_name = tapped_name + new_name = new_tap.core_tap? ? name : new_tapped_name + end + + if warn && old_name && new_name + opoo "Use #{new_name} instead of deprecated #{old_name}" end end - super name, path + [name, path] end def get_formula(spec, alias_path: nil) diff --git a/Library/Homebrew/os.rb b/Library/Homebrew/os.rb index b49bbff644..f6fe1eb811 100644 --- a/Library/Homebrew/os.rb +++ b/Library/Homebrew/os.rb @@ -13,7 +13,10 @@ module OS if OS.mac? require "os/mac" - ISSUES_URL = "https://git.io/brew-troubleshooting".freeze + # Don't tell people to report issues on unsupported versions of macOS. + if !OS::Mac.prerelease? && !OS::Mac.outdated_release? + ISSUES_URL = "https://git.io/brew-troubleshooting".freeze + end PATH_OPEN = "/usr/bin/open".freeze # compatibility ::MACOS_FULL_VERSION = OS::Mac.full_version.to_s.freeze diff --git a/Library/Homebrew/os/mac/xcode.rb b/Library/Homebrew/os/mac/xcode.rb index 9f49162d5e..f081d4382b 100644 --- a/Library/Homebrew/os/mac/xcode.rb +++ b/Library/Homebrew/os/mac/xcode.rb @@ -25,6 +25,17 @@ module OS end end + def minimum_version + case MacOS.version + when "10.12" then "8.0" + else "2.0" + end + end + + def minimum_version? + version < minimum_version + end + def prerelease? # TODO: bump to version >= "8.3" after Xcode 8.2 is stable. version >= "8.2" @@ -205,6 +216,17 @@ module OS end end + def minimum_version + case MacOS.version + when "10.12" then "8.0.0" + else "4.0.0" + end + end + + def minimum_version? + version < minimum_version + end + def outdated? if MacOS.version >= :mavericks version = Utils.popen_read("#{MAVERICKS_PKG_PATH}/usr/bin/clang --version") diff --git a/Library/Homebrew/software_spec.rb b/Library/Homebrew/software_spec.rb index bb432e2dd5..f368c59b54 100644 --- a/Library/Homebrew/software_spec.rb +++ b/Library/Homebrew/software_spec.rb @@ -221,7 +221,7 @@ class Bottle def initialize(name, version, tag, rebuild) @name = name @version = version - @tag = tag + @tag = tag.to_s.gsub(/_or_later$/, "") @rebuild = rebuild end diff --git a/docs/Formula-Cookbook.md b/docs/Formula-Cookbook.md index 950b662aeb..6657b97668 100644 --- a/docs/Formula-Cookbook.md +++ b/docs/Formula-Cookbook.md @@ -805,7 +805,7 @@ Homebrew wants to maintain a consistent Ruby style across all formulae based on ### Version detection fails -Homebrew tries to automatically determine the [`version`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#version-class_method) from the [`url`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#url-class_method) in avoid duplication. If the tarball has an unusual name you may need to manually assign the [`version`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#version-class_method). +Homebrew tries to automatically determine the [`version`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#version-class_method) from the [`url`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#url-class_method) to avoid duplication. If the tarball has an unusual name you may need to manually assign the [`version`](http://www.rubydoc.info/github/Homebrew/brew/master/Formula#version-class_method). ## Bad Makefiles