2016-01-04 23:14:58 +01:00
|
|
|
require "keg"
|
|
|
|
require "language/python"
|
|
|
|
require "formula"
|
|
|
|
require "version"
|
2016-07-29 20:31:32 -06:00
|
|
|
require "development_tools"
|
2016-08-10 23:19:09 -07:00
|
|
|
require "utils/shell"
|
2016-01-04 23:14:58 +01:00
|
|
|
|
|
|
|
module Homebrew
|
|
|
|
module Diagnostic
|
2016-09-29 11:28:01 +01:00
|
|
|
def self.missing_deps(ff, hide = nil)
|
2016-01-04 23:14:58 +01:00
|
|
|
missing = {}
|
|
|
|
ff.each do |f|
|
2016-10-05 20:56:07 +01:00
|
|
|
missing_dependencies = f.missing_dependencies(hide: hide)
|
2018-03-25 12:43:24 +01:00
|
|
|
next if missing_dependencies.empty?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2018-03-25 12:43:24 +01:00
|
|
|
yield f.full_name, missing_dependencies if block_given?
|
|
|
|
missing[f.full_name] = missing_dependencies
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
missing
|
|
|
|
end
|
|
|
|
|
|
|
|
class Volumes
|
|
|
|
def initialize
|
|
|
|
@volumes = get_mounts
|
|
|
|
end
|
|
|
|
|
|
|
|
def which(path)
|
|
|
|
vols = get_mounts path
|
|
|
|
|
|
|
|
# no volume found
|
2016-09-20 20:50:29 +02:00
|
|
|
return -1 if vols.empty?
|
2016-01-04 23:14:58 +01:00
|
|
|
|
|
|
|
vol_index = @volumes.index(vols[0])
|
|
|
|
# volume not found in volume list
|
2016-09-20 20:50:29 +02:00
|
|
|
return -1 if vol_index.nil?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
vol_index
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_mounts(path = nil)
|
|
|
|
vols = []
|
|
|
|
# get the volume of path, if path is nil returns all volumes
|
|
|
|
|
|
|
|
args = %w[/bin/df -P]
|
|
|
|
args << path if path
|
|
|
|
|
|
|
|
Utils.popen_read(*args) do |io|
|
|
|
|
io.each_line do |line|
|
|
|
|
case line.chomp
|
|
|
|
# regex matches: /dev/disk0s2 489562928 440803616 48247312 91% /
|
|
|
|
when /^.+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9]{1,3}%\s+(.+)/
|
2017-06-10 20:23:20 +03:00
|
|
|
vols << Regexp.last_match(1)
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
vols
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Checks
|
|
|
|
############# HELPERS
|
2018-10-18 21:42:43 -04:00
|
|
|
# Finds files in `HOMEBREW_PREFIX` *and* /usr/local.
|
|
|
|
# Specify paths relative to a prefix e.g. "include/foo.h".
|
2016-01-04 23:14:58 +01:00
|
|
|
# Sets @found for your convenience.
|
|
|
|
def find_relative_paths(*relative_paths)
|
2018-09-02 20:14:54 +01:00
|
|
|
@found = [HOMEBREW_PREFIX, "/usr/local"].uniq.reduce([]) do |found, prefix|
|
2016-01-04 23:14:58 +01:00
|
|
|
found + relative_paths.map { |f| File.join(prefix, f) }.select { |f| File.exist? f }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-09-21 14:36:11 +02:00
|
|
|
def inject_file_list(list, string)
|
2018-09-02 20:14:54 +01:00
|
|
|
list.reduce(string) { |acc, elem| acc << " #{elem}\n" }
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
############# END HELPERS
|
|
|
|
|
2018-09-06 18:38:43 +01:00
|
|
|
def fatal_install_checks
|
|
|
|
%w[
|
|
|
|
check_access_directories
|
|
|
|
].freeze
|
|
|
|
end
|
|
|
|
|
2016-09-07 09:11:06 +01:00
|
|
|
def development_tools_checks
|
2016-07-04 18:35:03 +01:00
|
|
|
%w[
|
|
|
|
check_for_installed_developer_tools
|
2016-11-05 10:38:39 -04:00
|
|
|
].freeze
|
2016-07-04 18:35:03 +01:00
|
|
|
end
|
|
|
|
|
2016-09-07 09:11:06 +01:00
|
|
|
def fatal_development_tools_checks
|
|
|
|
%w[
|
2016-11-05 10:38:39 -04:00
|
|
|
].freeze
|
|
|
|
end
|
2016-11-05 10:39:00 -04:00
|
|
|
|
|
|
|
def build_error_checks
|
|
|
|
(development_tools_checks + %w[
|
|
|
|
]).freeze
|
2016-09-07 09:11:06 +01:00
|
|
|
end
|
|
|
|
|
2016-07-04 18:35:03 +01:00
|
|
|
def check_for_installed_developer_tools
|
|
|
|
return if DevelopmentTools.installed?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-07-04 18:35:03 +01:00
|
|
|
No developer tools installed.
|
2016-07-16 21:03:12 +01:00
|
|
|
#{DevelopmentTools.installation_instructions}
|
2016-07-04 18:35:03 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2017-07-20 11:08:53 -04:00
|
|
|
def check_build_from_source
|
2017-07-20 20:02:34 +01:00
|
|
|
return unless ENV["HOMEBREW_BUILD_FROM_SOURCE"]
|
2017-07-20 11:08:53 -04:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-07-20 11:08:53 -04:00
|
|
|
You have HOMEBREW_BUILD_FROM_SOURCE set. This environment variable is
|
|
|
|
intended for use by Homebrew developers. If you are encountering errors,
|
|
|
|
please try unsetting this. Please do not file issues if you encounter
|
|
|
|
errors when using this environment variable.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
# Anaconda installs multiple system & brew dupes, including OpenSSL, Python,
|
|
|
|
# sqlite, libpng, Qt, etc. Regularly breaks compile on Vim, MacVim and others.
|
|
|
|
# Is flagged as part of the *-config script checks below, but people seem
|
|
|
|
# to ignore those as warnings rather than extremely likely breakage.
|
|
|
|
def check_for_anaconda
|
|
|
|
return unless which("anaconda")
|
|
|
|
return unless which("python")
|
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
anaconda_directory = which("anaconda").realpath.dirname
|
2017-04-27 20:17:06 +02:00
|
|
|
python_binary = Utils.popen_read(which("python"), "-c", "import sys; sys.stdout.write(sys.executable)")
|
2016-04-06 05:08:53 +02:00
|
|
|
python_directory = Pathname.new(python_binary).realpath.dirname
|
2016-01-04 23:14:58 +01:00
|
|
|
|
|
|
|
# Only warn if Python lives with Anaconda, since is most problematic case.
|
2016-04-06 05:08:53 +02:00
|
|
|
return unless python_directory == anaconda_directory
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
Anaconda is known to frequently break Homebrew builds, including Vim and
|
|
|
|
MacVim, due to bundling many duplicates of system and Homebrew-available
|
|
|
|
tools.
|
|
|
|
|
|
|
|
If you encounter a build failure please temporarily remove Anaconda
|
|
|
|
from your $PATH and attempt the build again prior to reporting the
|
|
|
|
failure to us. Thanks!
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def __check_stray_files(dir, pattern, white_list, message)
|
|
|
|
return unless File.directory?(dir)
|
|
|
|
|
|
|
|
files = Dir.chdir(dir) do
|
2017-10-07 00:31:28 +02:00
|
|
|
(Dir.glob(pattern) - Dir.glob(white_list))
|
|
|
|
.select { |f| File.file?(f) && !File.symlink?(f) }
|
|
|
|
.map { |f| File.join(dir, f) }
|
|
|
|
end
|
2016-04-06 05:08:53 +02:00
|
|
|
return if files.empty?
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2017-10-20 22:44:11 +01:00
|
|
|
inject_file_list(files.sort, message)
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_stray_dylibs
|
|
|
|
# Dylibs which are generally OK should be added to this list,
|
|
|
|
# with a short description of the software they come with.
|
|
|
|
white_list = [
|
|
|
|
"libfuse.2.dylib", # MacFuse
|
|
|
|
"libfuse_ino64.2.dylib", # MacFuse
|
|
|
|
"libmacfuse_i32.2.dylib", # OSXFuse MacFuse compatibility layer
|
|
|
|
"libmacfuse_i64.2.dylib", # OSXFuse MacFuse compatibility layer
|
|
|
|
"libosxfuse_i32.2.dylib", # OSXFuse
|
|
|
|
"libosxfuse_i64.2.dylib", # OSXFuse
|
2016-02-20 19:24:30 +00:00
|
|
|
"libosxfuse.2.dylib", # OSXFuse
|
2017-06-01 16:06:51 +02:00
|
|
|
"libTrAPI.dylib", # TrAPI/Endpoint Security VPN
|
2016-01-04 23:14:58 +01:00
|
|
|
"libntfs-3g.*.dylib", # NTFS-3G
|
|
|
|
"libntfs.*.dylib", # NTFS-3G
|
|
|
|
"libublio.*.dylib", # NTFS-3G
|
|
|
|
"libUFSDNTFS.dylib", # Paragon NTFS
|
|
|
|
"libUFSDExtFS.dylib", # Paragon ExtFS
|
2016-11-04 14:35:54 +00:00
|
|
|
"libecomlodr.dylib", # Symantec Endpoint Protection
|
2017-06-22 16:00:54 +08:00
|
|
|
"libsymsea*.dylib", # Symantec Endpoint Protection
|
2016-11-04 12:18:23 -04:00
|
|
|
"sentinel.dylib", # SentinelOne
|
2017-11-28 17:34:16 -05:00
|
|
|
"sentinel-*.dylib", # SentinelOne
|
2016-01-04 23:14:58 +01:00
|
|
|
]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
__check_stray_files "/usr/local/lib", "*.dylib", white_list, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Unbrewed dylibs were found in /usr/local/lib.
|
|
|
|
If you didn't put them there on purpose they could cause problems when
|
|
|
|
building Homebrew formulae, and may need to be deleted.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unexpected dylibs:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_stray_static_libs
|
|
|
|
# Static libs which are generally OK should be added to this list,
|
|
|
|
# with a short description of the software they come with.
|
|
|
|
white_list = [
|
|
|
|
"libsecurity_agent_client.a", # OS X 10.8.2 Supplemental Update
|
|
|
|
"libsecurity_agent_server.a", # OS X 10.8.2 Supplemental Update
|
|
|
|
"libntfs-3g.a", # NTFS-3G
|
|
|
|
"libntfs.a", # NTFS-3G
|
|
|
|
"libublio.a", # NTFS-3G
|
2016-11-04 14:35:54 +00:00
|
|
|
"libappfirewall.a", # Symantec Endpoint Protection
|
|
|
|
"libautoblock.a", # Symantec Endpoint Protection
|
|
|
|
"libautosetup.a", # Symantec Endpoint Protection
|
|
|
|
"libconnectionsclient.a", # Symantec Endpoint Protection
|
|
|
|
"liblocationawareness.a", # Symantec Endpoint Protection
|
|
|
|
"libpersonalfirewall.a", # Symantec Endpoint Protection
|
|
|
|
"libtrustedcomponents.a", # Symantec Endpoint Protection
|
2016-01-04 23:14:58 +01:00
|
|
|
]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
__check_stray_files "/usr/local/lib", "*.a", white_list, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Unbrewed static libraries were found in /usr/local/lib.
|
|
|
|
If you didn't put them there on purpose they could cause problems when
|
|
|
|
building Homebrew formulae, and may need to be deleted.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unexpected static libraries:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_stray_pcs
|
|
|
|
# Package-config files which are generally OK should be added to this list,
|
|
|
|
# with a short description of the software they come with.
|
|
|
|
white_list = [
|
|
|
|
"fuse.pc", # OSXFuse/MacFuse
|
|
|
|
"macfuse.pc", # OSXFuse MacFuse compatibility layer
|
|
|
|
"osxfuse.pc", # OSXFuse
|
|
|
|
"libntfs-3g.pc", # NTFS-3G
|
|
|
|
"libublio.pc", # NTFS-3G
|
|
|
|
]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
__check_stray_files "/usr/local/lib/pkgconfig", "*.pc", white_list, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Unbrewed .pc files were found in /usr/local/lib/pkgconfig.
|
|
|
|
If you didn't put them there on purpose they could cause problems when
|
|
|
|
building Homebrew formulae, and may need to be deleted.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unexpected .pc files:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_stray_las
|
|
|
|
white_list = [
|
|
|
|
"libfuse.la", # MacFuse
|
|
|
|
"libfuse_ino64.la", # MacFuse
|
|
|
|
"libosxfuse_i32.la", # OSXFuse
|
|
|
|
"libosxfuse_i64.la", # OSXFuse
|
2016-02-20 19:24:30 +00:00
|
|
|
"libosxfuse.la", # OSXFuse
|
2016-01-04 23:14:58 +01:00
|
|
|
"libntfs-3g.la", # NTFS-3G
|
|
|
|
"libntfs.la", # NTFS-3G
|
|
|
|
"libublio.la", # NTFS-3G
|
|
|
|
]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
__check_stray_files "/usr/local/lib", "*.la", white_list, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Unbrewed .la files were found in /usr/local/lib.
|
|
|
|
If you didn't put them there on purpose they could cause problems when
|
|
|
|
building Homebrew formulae, and may need to be deleted.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unexpected .la files:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_stray_headers
|
|
|
|
white_list = [
|
|
|
|
"fuse.h", # MacFuse
|
|
|
|
"fuse/**/*.h", # MacFuse
|
|
|
|
"macfuse/**/*.h", # OSXFuse MacFuse compatibility layer
|
|
|
|
"osxfuse/**/*.h", # OSXFuse
|
|
|
|
"ntfs/**/*.h", # NTFS-3G
|
|
|
|
"ntfs-3g/**/*.h", # NTFS-3G
|
|
|
|
]
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
__check_stray_files "/usr/local/include", "**/*.h", white_list, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Unbrewed header files were found in /usr/local/include.
|
|
|
|
If you didn't put them there on purpose they could cause problems when
|
|
|
|
building Homebrew formulae, and may need to be deleted.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unexpected header files:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_broken_symlinks
|
|
|
|
broken_symlinks = []
|
|
|
|
|
2018-09-25 22:03:29 +01:00
|
|
|
Keg::MUST_EXIST_SUBDIRECTORIES.each do |d|
|
2016-01-04 23:14:58 +01:00
|
|
|
next unless d.directory?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
d.find do |path|
|
|
|
|
if path.symlink? && !path.resolved_path_exists?
|
|
|
|
broken_symlinks << path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return if broken_symlinks.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
inject_file_list broken_symlinks, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Broken symlinks were found. Remove them with `brew prune`:
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-09-09 13:08:02 +01:00
|
|
|
def check_tmpdir_sticky_bit
|
|
|
|
world_writable = HOMEBREW_TEMP.stat.mode & 0777 == 0777
|
|
|
|
return if !world_writable || HOMEBREW_TEMP.sticky?
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-09-09 13:08:02 +01:00
|
|
|
#{HOMEBREW_TEMP} is world-writable but does not have the sticky bit set.
|
|
|
|
Please execute `sudo chmod +t #{HOMEBREW_TEMP}` in your Terminal.
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2018-09-06 18:38:43 +01:00
|
|
|
def check_exist_directories
|
|
|
|
not_exist_dirs = Keg::MUST_EXIST_DIRECTORIES.reject(&:exist?)
|
|
|
|
return if not_exist_dirs.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2018-09-06 18:38:43 +01:00
|
|
|
The following directories do not exist:
|
|
|
|
#{not_exist_dirs.join("\n")}
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2018-09-06 18:38:43 +01:00
|
|
|
You should create these directories and change their ownership to your account.
|
|
|
|
sudo mkdir -p #{not_exist_dirs.join(" ")}
|
|
|
|
sudo chown -R $(whoami) #{not_exist_dirs.join(" ")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2018-09-06 18:38:43 +01:00
|
|
|
def check_access_directories
|
|
|
|
not_writable_dirs =
|
|
|
|
Keg::MUST_BE_WRITABLE_DIRECTORIES.select(&:exist?)
|
|
|
|
.reject(&:writable_real?)
|
2016-09-09 08:06:37 +01:00
|
|
|
return if not_writable_dirs.empty?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2018-09-06 18:38:43 +01:00
|
|
|
The following directories are not writable by your user:
|
2016-09-09 08:06:37 +01:00
|
|
|
#{not_writable_dirs.join("\n")}
|
|
|
|
|
2018-09-06 18:38:43 +01:00
|
|
|
You should change the ownership of these directories to your user.
|
2016-09-09 08:06:37 +01:00
|
|
|
sudo chown -R $(whoami) #{not_writable_dirs.join(" ")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-12-13 00:19:46 +00:00
|
|
|
def check_multiple_cellars
|
|
|
|
return if HOMEBREW_PREFIX.to_s == HOMEBREW_REPOSITORY.to_s
|
|
|
|
return unless (HOMEBREW_REPOSITORY/"Cellar").exist?
|
|
|
|
return unless (HOMEBREW_PREFIX/"Cellar").exist?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-12-13 00:19:46 +00:00
|
|
|
You have multiple Cellars.
|
|
|
|
You should delete #{HOMEBREW_REPOSITORY}/Cellar:
|
|
|
|
rm -rf #{HOMEBREW_REPOSITORY}/Cellar
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
def check_user_path_1
|
2017-10-07 00:31:28 +02:00
|
|
|
@seen_prefix_bin = false
|
|
|
|
@seen_prefix_sbin = false
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
message = ""
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2017-11-17 17:41:58 +00:00
|
|
|
paths.each do |p|
|
2016-01-04 23:14:58 +01:00
|
|
|
case p
|
|
|
|
when "/usr/bin"
|
2017-10-07 00:31:28 +02:00
|
|
|
unless @seen_prefix_bin
|
2016-01-04 23:14:58 +01:00
|
|
|
# only show the doctor message if there are any conflicts
|
|
|
|
# rationale: a default install should not trigger any brew doctor messages
|
2016-09-17 15:17:27 +01:00
|
|
|
conflicts = Dir["#{HOMEBREW_PREFIX}/bin/*"]
|
|
|
|
.map { |fn| File.basename fn }
|
|
|
|
.select { |bn| File.exist? "/usr/bin/#{bn}" }
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-09-17 15:17:27 +01:00
|
|
|
unless conflicts.empty?
|
2017-10-15 02:28:32 +02:00
|
|
|
message = inject_file_list conflicts, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
/usr/bin occurs before #{HOMEBREW_PREFIX}/bin
|
|
|
|
This means that system-provided programs will be used instead of those
|
|
|
|
provided by Homebrew. The following tools exist at both paths:
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
message += <<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Consider setting your PATH so that #{HOMEBREW_PREFIX}/bin
|
|
|
|
occurs before /usr/bin. Here is a one-liner:
|
2017-04-22 16:28:07 +01:00
|
|
|
#{Utils::Shell.prepend_path_in_profile("#{HOMEBREW_PREFIX}/bin")}
|
2016-04-06 05:08:53 +02:00
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
when "#{HOMEBREW_PREFIX}/bin"
|
2017-10-07 00:31:28 +02:00
|
|
|
@seen_prefix_bin = true
|
2016-01-04 23:14:58 +01:00
|
|
|
when "#{HOMEBREW_PREFIX}/sbin"
|
2017-10-07 00:31:28 +02:00
|
|
|
@seen_prefix_sbin = true
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
end
|
2016-04-06 05:08:53 +02:00
|
|
|
|
|
|
|
message unless message.empty?
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_user_path_2
|
2017-10-07 00:31:28 +02:00
|
|
|
return if @seen_prefix_bin
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
Homebrew's bin was not found in your PATH.
|
|
|
|
Consider setting the PATH for example like so
|
2017-04-22 16:28:07 +01:00
|
|
|
#{Utils::Shell.prepend_path_in_profile("#{HOMEBREW_PREFIX}/bin")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_user_path_3
|
2017-10-07 00:31:28 +02:00
|
|
|
return if @seen_prefix_sbin
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
# Don't complain about sbin not being in the path if it doesn't exist
|
2017-06-01 16:06:51 +02:00
|
|
|
sbin = HOMEBREW_PREFIX/"sbin"
|
2016-09-17 15:17:27 +01:00
|
|
|
return unless sbin.directory? && !sbin.children.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Homebrew's sbin was not found in your PATH but you have installed
|
|
|
|
formulae that put executables in #{HOMEBREW_PREFIX}/sbin.
|
|
|
|
Consider setting the PATH for example like so
|
2017-04-22 16:28:07 +01:00
|
|
|
#{Utils::Shell.prepend_path_in_profile("#{HOMEBREW_PREFIX}/sbin")}
|
2016-04-06 05:08:53 +02:00
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_config_scripts
|
|
|
|
return unless HOMEBREW_CELLAR.exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
real_cellar = HOMEBREW_CELLAR.realpath
|
|
|
|
|
|
|
|
scripts = []
|
|
|
|
|
|
|
|
whitelist = %W[
|
|
|
|
/usr/bin /usr/sbin
|
|
|
|
/usr/X11/bin /usr/X11R6/bin /opt/X11/bin
|
|
|
|
#{HOMEBREW_PREFIX}/bin #{HOMEBREW_PREFIX}/sbin
|
|
|
|
/Applications/Server.app/Contents/ServerRoot/usr/bin
|
|
|
|
/Applications/Server.app/Contents/ServerRoot/usr/sbin
|
|
|
|
].map(&:downcase)
|
|
|
|
|
2017-11-17 17:41:58 +00:00
|
|
|
paths.each do |p|
|
2016-01-04 23:14:58 +01:00
|
|
|
next if whitelist.include?(p.downcase) || !File.directory?(p)
|
|
|
|
|
|
|
|
realpath = Pathname.new(p).realpath.to_s
|
|
|
|
next if realpath.start_with?(real_cellar.to_s, HOMEBREW_CELLAR.to_s)
|
|
|
|
|
|
|
|
scripts += Dir.chdir(p) { Dir["*-config"] }.map { |c| File.join(p, c) }
|
|
|
|
end
|
|
|
|
|
|
|
|
return if scripts.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
inject_file_list scripts, <<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
"config" scripts exist outside your system or Homebrew directories.
|
|
|
|
`./configure` scripts often look for *-config scripts to determine if
|
|
|
|
software packages are installed, and what additional flags to use when
|
|
|
|
compiling and linking.
|
|
|
|
|
|
|
|
Having additional scripts in your path can confuse software installed via
|
|
|
|
Homebrew if the config script overrides a system or Homebrew provided
|
|
|
|
script of the same name. We found the following "config" scripts:
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
def check_ld_vars
|
|
|
|
ld_vars = ENV.keys.grep(/^(|DY)LD_/)
|
|
|
|
return if ld_vars.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
values = ld_vars.map { |var| "#{var}: #{ENV.fetch(var)}" }
|
2017-10-15 02:28:32 +02:00
|
|
|
message = inject_file_list values, <<~EOS
|
2018-05-12 11:47:12 -05:00
|
|
|
Setting DYLD_* or LD_* variables can break dynamic linking.
|
2016-01-04 23:14:58 +01:00
|
|
|
Set variables:
|
|
|
|
EOS
|
|
|
|
|
2018-05-12 11:47:12 -05:00
|
|
|
if ld_vars.include? "DYLD_INSERT_LIBRARIES"
|
2017-10-15 02:28:32 +02:00
|
|
|
message += <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
|
|
|
|
Setting DYLD_INSERT_LIBRARIES can cause Go builds to fail.
|
|
|
|
Having this set is common if you use this software:
|
2017-03-12 19:44:01 +00:00
|
|
|
#{Formatter.url("https://asepsis.binaryage.com/")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
2016-04-06 05:08:53 +02:00
|
|
|
|
|
|
|
message
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_symlinked_cellar
|
|
|
|
return unless HOMEBREW_CELLAR.exist?
|
2016-04-06 05:08:53 +02:00
|
|
|
return unless HOMEBREW_CELLAR.symlink?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
Symlinked Cellars can cause problems.
|
|
|
|
Your Homebrew Cellar is a symlink: #{HOMEBREW_CELLAR}
|
|
|
|
which resolves to: #{HOMEBREW_CELLAR.realpath}
|
|
|
|
|
|
|
|
The recommended Homebrew installations are either:
|
|
|
|
(A) Have Cellar be a real directory inside of your HOMEBREW_PREFIX
|
|
|
|
(B) Symlink "bin/brew" into your prefix, but don't symlink "Cellar".
|
|
|
|
|
|
|
|
Older installations of Homebrew may have created a symlinked Cellar, but this can
|
|
|
|
cause problems when two formula install to locations that are mapped on top of each
|
|
|
|
other during the linking step.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-06-13 02:57:35 +02:00
|
|
|
def check_git_version
|
2018-10-27 20:44:13 -04:00
|
|
|
minimum_version = ENV["HOMEBREW_MINIMUM_GIT_VERSION"].freeze
|
2016-06-13 02:57:35 +02:00
|
|
|
return unless Utils.git_available?
|
2018-09-06 12:38:20 +01:00
|
|
|
return if Version.create(Utils.git_version) >= Version.create(minimum_version)
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
git = Formula["git"]
|
|
|
|
git_upgrade_cmd = git.any_version_installed? ? "upgrade" : "install"
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-06-13 02:57:35 +02:00
|
|
|
An outdated version (#{Utils.git_version}) of Git was detected in your PATH.
|
2018-09-06 12:38:20 +01:00
|
|
|
Git #{minimum_version} or newer is required for Homebrew.
|
2016-04-06 05:08:53 +02:00
|
|
|
Please upgrade:
|
|
|
|
brew #{git_upgrade_cmd} git
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_git
|
2016-06-13 02:57:35 +02:00
|
|
|
return if Utils.git_available?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-06-13 02:57:35 +02:00
|
|
|
Git could not be found in your PATH.
|
|
|
|
Homebrew uses Git for several internal functions, and some formulae use Git
|
|
|
|
checkouts instead of stable tarballs. You may want to install Git:
|
|
|
|
brew install git
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_git_newline_settings
|
|
|
|
return unless Utils.git_available?
|
|
|
|
|
2016-02-26 13:35:36 -05:00
|
|
|
autocrlf = HOMEBREW_REPOSITORY.cd { `git config --get core.autocrlf`.chomp }
|
2016-04-06 05:08:53 +02:00
|
|
|
return unless autocrlf == "true"
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Suspicious Git newline settings found.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
The detected Git newline settings will cause checkout problems:
|
|
|
|
core.autocrlf = #{autocrlf}
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
If you are not routinely dealing with Windows-based projects,
|
|
|
|
consider removing these by running:
|
|
|
|
git config --global core.autocrlf input
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2017-03-26 20:28:11 +01:00
|
|
|
def check_brew_git_origin
|
2016-01-04 23:14:58 +01:00
|
|
|
return if !Utils.git_available? || !(HOMEBREW_REPOSITORY/".git").exist?
|
|
|
|
|
2016-07-02 09:44:48 +02:00
|
|
|
origin = HOMEBREW_REPOSITORY.git_origin
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
if origin.nil?
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-03-26 20:28:11 +01:00
|
|
|
Missing Homebrew/brew git origin remote.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Without a correctly configured origin, Homebrew won't update
|
|
|
|
properly. You can solve this by adding the Homebrew remote:
|
2017-03-26 20:28:11 +01:00
|
|
|
git -C "#{HOMEBREW_REPOSITORY}" remote add origin #{Formatter.url("https://github.com/Homebrew/brew.git")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
2017-03-28 19:44:30 +01:00
|
|
|
elsif origin !~ %r{Homebrew/brew(\.git|/)?$}
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-03-26 20:28:11 +01:00
|
|
|
Suspicious Homebrew/brew git origin remote found.
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
With a non-standard origin, Homebrew won't pull updates from
|
|
|
|
the main repository. The current git origin is:
|
|
|
|
#{origin}
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
Unless you have compelling reasons, consider setting the
|
2017-03-26 20:28:11 +01:00
|
|
|
origin remote to point at the main repository by running:
|
2017-06-14 17:26:35 +02:00
|
|
|
git -C "#{HOMEBREW_REPOSITORY}" remote set-url origin #{Formatter.url("https://github.com/Homebrew/brew.git")}
|
2017-03-26 20:28:11 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-08-26 10:15:35 -07:00
|
|
|
def check_coretap_git_origin
|
2017-03-26 20:28:11 +01:00
|
|
|
coretap_path = CoreTap.instance.path
|
|
|
|
return if !Utils.git_available? || !(coretap_path/".git").exist?
|
|
|
|
|
|
|
|
origin = coretap_path.git_origin
|
|
|
|
|
|
|
|
if origin.nil?
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-03-26 20:28:11 +01:00
|
|
|
Missing #{CoreTap.instance} git origin remote.
|
|
|
|
|
|
|
|
Without a correctly configured origin, Homebrew won't update
|
|
|
|
properly. You can solve this by adding the Homebrew remote:
|
|
|
|
git -C "#{coretap_path}" remote add origin #{Formatter.url("https://github.com/Homebrew/homebrew-core.git")}
|
|
|
|
EOS
|
2017-03-28 19:44:30 +01:00
|
|
|
elsif origin !~ %r{Homebrew/homebrew-core(\.git|/)?$}
|
2017-06-17 14:01:42 +01:00
|
|
|
return if ENV["CI"] && origin.include?("Homebrew/homebrew-test-bot")
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-03-26 20:28:11 +01:00
|
|
|
Suspicious #{CoreTap.instance} git origin remote found.
|
|
|
|
|
|
|
|
With a non-standard origin, Homebrew won't pull updates from
|
|
|
|
the main repository. The current git origin is:
|
|
|
|
#{origin}
|
|
|
|
|
|
|
|
Unless you have compelling reasons, consider setting the
|
|
|
|
origin remote to point at the main repository by running:
|
2017-06-14 17:26:35 +02:00
|
|
|
git -C "#{coretap_path}" remote set-url origin #{Formatter.url("https://github.com/Homebrew/homebrew-core.git")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
2017-09-27 16:32:13 -04:00
|
|
|
|
2018-02-12 16:38:10 +00:00
|
|
|
return if ENV["CI"]
|
2017-09-27 16:32:13 -04:00
|
|
|
|
|
|
|
branch = coretap_path.git_branch
|
2017-09-28 20:10:06 +01:00
|
|
|
return if branch.nil? || branch =~ /master/
|
2017-09-27 16:32:13 -04:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-09-27 16:32:13 -04:00
|
|
|
Homebrew/homebrew-core is not on the master branch
|
|
|
|
|
|
|
|
Check out the master branch by running:
|
|
|
|
git -C "$(brew --repo homebrew/core)" checkout master
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def __check_linked_brew(f)
|
|
|
|
f.installed_prefixes.each do |prefix|
|
|
|
|
prefix.find do |src|
|
|
|
|
next if src == prefix
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
dst = HOMEBREW_PREFIX + src.relative_path_from(prefix)
|
|
|
|
return true if dst.symlink? && src == dst.resolved_path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
false
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_other_frameworks
|
|
|
|
# Other frameworks that are known to cause problems when present
|
2016-04-06 05:08:53 +02:00
|
|
|
frameworks_to_check = %w[
|
|
|
|
expat.framework
|
|
|
|
libexpat.framework
|
|
|
|
libcurl.framework
|
|
|
|
]
|
2016-09-17 15:17:27 +01:00
|
|
|
frameworks_found = frameworks_to_check
|
|
|
|
.map { |framework| "/Library/Frameworks/#{framework}" }
|
|
|
|
.select { |framework| File.exist? framework }
|
2016-04-06 05:08:53 +02:00
|
|
|
return if frameworks_found.empty?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
inject_file_list frameworks_found, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
Some frameworks can be picked up by CMake's build system and likely
|
|
|
|
cause the build to fail. To compile CMake, you may wish to move these
|
|
|
|
out of the way:
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_tmpdir
|
|
|
|
tmpdir = ENV["TMPDIR"]
|
2016-04-06 05:08:53 +02:00
|
|
|
return if tmpdir.nil? || File.directory?(tmpdir)
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
TMPDIR #{tmpdir.inspect} doesn't exist.
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_missing_deps
|
|
|
|
return unless HOMEBREW_CELLAR.exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
missing = Set.new
|
|
|
|
Homebrew::Diagnostic.missing_deps(Formula.installed).each_value do |deps|
|
|
|
|
missing.merge(deps)
|
|
|
|
end
|
2016-04-06 05:08:53 +02:00
|
|
|
return if missing.empty?
|
2016-01-04 23:14:58 +01:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2018-02-07 09:50:01 +01:00
|
|
|
Some installed formulae are missing dependencies.
|
2016-01-04 23:14:58 +01:00
|
|
|
You should `brew install` the missing dependencies:
|
2016-04-06 05:08:53 +02:00
|
|
|
brew install #{missing.sort_by(&:full_name) * " "}
|
2016-01-04 23:14:58 +01:00
|
|
|
|
|
|
|
Run `brew missing` for more details.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_git_status
|
|
|
|
return unless Utils.git_available?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
HOMEBREW_REPOSITORY.cd do
|
2016-04-06 05:08:53 +02:00
|
|
|
return if `git status --untracked-files=all --porcelain -- Library/Homebrew/ 2>/dev/null`.chomp.empty?
|
|
|
|
end
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
You have uncommitted modifications to Homebrew
|
|
|
|
If this is a surprise to you, then you should stash these modifications.
|
|
|
|
Stashing returns Homebrew to a pristine state but can be undone
|
|
|
|
should you later need to do so for some reason.
|
2016-04-06 05:08:53 +02:00
|
|
|
cd #{HOMEBREW_LIBRARY} && git stash && git clean -d -f
|
|
|
|
EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_bad_python_symlink
|
|
|
|
return unless which "python"
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
`python -V 2>&1` =~ /Python (\d+)\./
|
|
|
|
# This won't be the right warning if we matched nothing at all
|
2017-06-10 20:23:20 +03:00
|
|
|
return if Regexp.last_match(1).nil?
|
|
|
|
return if Regexp.last_match(1) == "2"
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2017-06-10 20:23:20 +03:00
|
|
|
python is symlinked to python#{Regexp.last_match(1)}
|
2016-04-06 05:08:53 +02:00
|
|
|
This will confuse build scripts and in general lead to subtle breakage.
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_non_prefixed_coreutils
|
2016-01-27 00:54:46 +01:00
|
|
|
coreutils = Formula["coreutils"]
|
|
|
|
return unless coreutils.any_version_installed?
|
|
|
|
|
|
|
|
gnubin = %W[#{coreutils.opt_libexec}/gnubin #{coreutils.libexec}/gnubin]
|
|
|
|
return if (paths & gnubin).empty?
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
Putting non-prefixed coreutils in your path can cause gmp builds to fail.
|
2016-01-27 00:54:46 +01:00
|
|
|
EOS
|
2016-04-25 17:58:50 +01:00
|
|
|
rescue FormulaUnavailableError
|
2018-03-06 09:36:49 +00:00
|
|
|
nil
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_pydistutils_cfg_in_home
|
2016-04-06 05:08:53 +02:00
|
|
|
return unless File.exist? "#{ENV["HOME"]}/.pydistutils.cfg"
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
A .pydistutils.cfg file was found in $HOME, which may cause Python
|
|
|
|
builds to fail. See:
|
2016-09-17 03:21:51 +02:00
|
|
|
#{Formatter.url("https://bugs.python.org/issue6138")}
|
|
|
|
#{Formatter.url("https://bugs.python.org/issue4655")}
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_unlinked_but_not_keg_only
|
|
|
|
unlinked = Formula.racks.reject do |rack|
|
2016-09-15 18:28:42 +01:00
|
|
|
if !(HOMEBREW_LINKED_KEGS/rack.basename).directory?
|
2016-01-04 23:14:58 +01:00
|
|
|
begin
|
|
|
|
Formulary.from_rack(rack).keg_only?
|
|
|
|
rescue FormulaUnavailableError, TapFormulaAmbiguityError, TapFormulaWithOldnameAmbiguityError
|
|
|
|
false
|
|
|
|
end
|
|
|
|
else
|
|
|
|
true
|
|
|
|
end
|
|
|
|
end.map(&:basename)
|
|
|
|
return if unlinked.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
inject_file_list unlinked, <<~EOS
|
2016-04-06 05:08:53 +02:00
|
|
|
You have unlinked kegs in your Cellar
|
|
|
|
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
|
|
|
|
those kegs to fail to run properly once built. Run `brew link` on these:
|
2016-01-04 23:14:58 +01:00
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
|
|
|
def check_for_external_cmd_name_conflict
|
2017-11-17 17:41:58 +00:00
|
|
|
cmds = Tap.cmd_directories.flat_map { |p| Dir["#{p}/brew-*"] }.uniq
|
2016-01-04 23:14:58 +01:00
|
|
|
cmds = cmds.select { |cmd| File.file?(cmd) && File.executable?(cmd) }
|
|
|
|
cmd_map = {}
|
|
|
|
cmds.each do |cmd|
|
|
|
|
cmd_name = File.basename(cmd, ".rb")
|
|
|
|
cmd_map[cmd_name] ||= []
|
|
|
|
cmd_map[cmd_name] << cmd
|
|
|
|
end
|
|
|
|
cmd_map.reject! { |_cmd_name, cmd_paths| cmd_paths.size == 1 }
|
|
|
|
return if cmd_map.empty?
|
2016-04-06 05:08:53 +02:00
|
|
|
|
2017-06-17 14:01:42 +01:00
|
|
|
if ENV["CI"] && cmd_map.keys.length == 1 &&
|
|
|
|
cmd_map.keys.first == "brew-test-bot"
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2016-04-06 05:08:53 +02:00
|
|
|
message = "You have external commands with conflicting names.\n"
|
2016-01-04 23:14:58 +01:00
|
|
|
cmd_map.each do |cmd_name, cmd_paths|
|
2017-10-15 02:28:32 +02:00
|
|
|
message += inject_file_list cmd_paths, <<~EOS
|
2016-01-04 23:14:58 +01:00
|
|
|
Found command `#{cmd_name}` in following places:
|
|
|
|
EOS
|
|
|
|
end
|
2016-04-06 05:08:53 +02:00
|
|
|
|
|
|
|
message
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
|
2016-12-13 01:53:05 +00:00
|
|
|
def check_for_tap_ruby_files_locations
|
|
|
|
bad_tap_files = {}
|
|
|
|
Tap.each do |tap|
|
|
|
|
unused_formula_dirs = tap.potential_formula_dirs - [tap.formula_dir]
|
|
|
|
unused_formula_dirs.each do |dir|
|
|
|
|
next unless dir.exist?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-13 01:53:05 +00:00
|
|
|
dir.children.each do |path|
|
|
|
|
next unless path.extname == ".rb"
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-13 01:53:05 +00:00
|
|
|
bad_tap_files[tap] ||= []
|
|
|
|
bad_tap_files[tap] << path
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return if bad_tap_files.empty?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-12-13 01:53:05 +00:00
|
|
|
bad_tap_files.keys.map do |tap|
|
2017-10-15 02:28:32 +02:00
|
|
|
<<~EOS
|
2016-12-13 01:53:05 +00:00
|
|
|
Found Ruby file outside #{tap} tap formula directory
|
|
|
|
(#{tap.formula_dir}):
|
|
|
|
#{bad_tap_files[tap].join("\n ")}
|
|
|
|
EOS
|
|
|
|
end.join("\n")
|
|
|
|
end
|
|
|
|
|
2019-01-01 18:11:59 -08:00
|
|
|
def check_homebrew_prefix
|
|
|
|
return if HOMEBREW_PREFIX.to_s == Homebrew::DEFAULT_PREFIX
|
|
|
|
|
|
|
|
<<~EOS
|
|
|
|
Your Homebrew's prefix is not #{Homebrew::DEFAULT_PREFIX}.
|
|
|
|
You can install Homebrew anywhere you want but some bottles (binary packages)
|
|
|
|
can only be used with a standard prefix and some formulae (packages)
|
|
|
|
may not build correctly with a non-standard prefix.
|
|
|
|
EOS
|
|
|
|
end
|
|
|
|
|
2016-01-04 23:14:58 +01:00
|
|
|
def all
|
|
|
|
methods.map(&:to_s).grep(/^check_/)
|
|
|
|
end
|
2017-10-21 19:52:43 +02:00
|
|
|
end
|
2016-01-04 23:14:58 +01:00
|
|
|
end
|
|
|
|
end
|
2016-04-25 17:58:50 +01:00
|
|
|
|
|
|
|
require "extend/os/diagnostic"
|