
Deprecate more methods. Internal APIs have been verified to be unused elsewhere and removed. External APIs have had deprecation methods added. Existing deprecations have been either upgraded to produce warnings or no longer deprecated and the reasoning documented.
217 lines
7.0 KiB
Ruby
217 lines
7.0 KiB
Ruby
class Caveats
|
|
attr_reader :f
|
|
|
|
def initialize(f)
|
|
@f = f
|
|
end
|
|
|
|
def caveats
|
|
caveats = []
|
|
begin
|
|
build = f.build
|
|
f.build = Tab.for_formula(f)
|
|
s = f.caveats.to_s
|
|
caveats << s.chomp + "\n" unless s.empty?
|
|
ensure
|
|
f.build = build
|
|
end
|
|
caveats << keg_only_text
|
|
caveats << function_completion_caveats(:bash)
|
|
caveats << function_completion_caveats(:zsh)
|
|
caveats << function_completion_caveats(:fish)
|
|
caveats << plist_caveats
|
|
caveats << python_caveats
|
|
caveats << elisp_caveats
|
|
caveats.compact.join("\n")
|
|
end
|
|
|
|
def empty?
|
|
caveats.empty?
|
|
end
|
|
|
|
private
|
|
|
|
def keg
|
|
@keg ||= [f.prefix, f.opt_prefix, f.linked_keg].map do |d|
|
|
begin
|
|
Keg.new(d.resolved_path)
|
|
rescue
|
|
nil
|
|
end
|
|
end.compact.first
|
|
end
|
|
|
|
def keg_only_text
|
|
return unless f.keg_only?
|
|
|
|
s = "This formula is keg-only, which means it was not symlinked into #{HOMEBREW_PREFIX}."
|
|
s << "\n\n#{f.keg_only_reason}\n"
|
|
if f.bin.directory? || f.sbin.directory?
|
|
s << "\nIf you need to have this software first in your PATH run:\n"
|
|
if f.bin.directory?
|
|
s << " #{Utils::Shell.prepend_path_in_profile(f.opt_bin.to_s)}\n"
|
|
end
|
|
if f.sbin.directory?
|
|
s << " #{Utils::Shell.prepend_path_in_profile(f.opt_sbin.to_s)}\n"
|
|
end
|
|
end
|
|
|
|
if f.lib.directory? || f.include.directory?
|
|
s << "\nFor compilers to find this software you may need to set:\n"
|
|
s << " LDFLAGS: -L#{f.opt_lib}\n" if f.lib.directory?
|
|
s << " CPPFLAGS: -I#{f.opt_include}\n" if f.include.directory?
|
|
if which("pkg-config") &&
|
|
((f.lib/"pkgconfig").directory? || (f.share/"pkgconfig").directory?)
|
|
s << "For pkg-config to find this software you may need to set:\n"
|
|
s << " PKG_CONFIG_PATH: #{f.opt_lib}/pkgconfig\n" if (f.lib/"pkgconfig").directory?
|
|
s << " PKG_CONFIG_PATH: #{f.opt_share}/pkgconfig\n" if (f.share/"pkgconfig").directory?
|
|
end
|
|
end
|
|
s << "\n"
|
|
end
|
|
|
|
def function_completion_caveats(shell)
|
|
return unless keg
|
|
return unless which(shell.to_s)
|
|
|
|
completion_installed = keg.completion_installed?(shell)
|
|
functions_installed = keg.functions_installed?(shell)
|
|
return unless completion_installed || functions_installed
|
|
|
|
installed = []
|
|
installed << "completions" if completion_installed
|
|
installed << "functions" if functions_installed
|
|
|
|
case shell
|
|
when :bash
|
|
<<-EOS.undent
|
|
Bash completion has been installed to:
|
|
#{HOMEBREW_PREFIX}/etc/bash_completion.d
|
|
EOS
|
|
when :zsh
|
|
<<-EOS.undent
|
|
zsh #{installed.join(" and ")} have been installed to:
|
|
#{HOMEBREW_PREFIX}/share/zsh/site-functions
|
|
EOS
|
|
when :fish
|
|
fish_caveats = "fish #{installed.join(" and ")} have been installed to:"
|
|
fish_caveats << "\n #{HOMEBREW_PREFIX}/share/fish/vendor_completions.d" if completion_installed
|
|
fish_caveats << "\n #{HOMEBREW_PREFIX}/share/fish/vendor_functions.d" if functions_installed
|
|
fish_caveats
|
|
end
|
|
end
|
|
|
|
def python_caveats
|
|
return unless keg
|
|
return unless keg.python_site_packages_installed?
|
|
|
|
s = nil
|
|
homebrew_site_packages = Language::Python.homebrew_site_packages
|
|
user_site_packages = Language::Python.user_site_packages "python"
|
|
pth_file = user_site_packages/"homebrew.pth"
|
|
instructions = <<-EOS.undent.gsub(/^/, " ")
|
|
mkdir -p #{user_site_packages}
|
|
echo 'import site; site.addsitedir("#{homebrew_site_packages}")' >> #{pth_file}
|
|
EOS
|
|
|
|
if f.keg_only?
|
|
keg_site_packages = f.opt_prefix/"lib/python2.7/site-packages"
|
|
unless Language::Python.in_sys_path?("python", keg_site_packages)
|
|
s = <<-EOS.undent
|
|
If you need Python to find bindings for this keg-only formula, run:
|
|
echo #{keg_site_packages} >> #{homebrew_site_packages/f.name}.pth
|
|
EOS
|
|
s += instructions unless Language::Python.reads_brewed_pth_files?("python")
|
|
end
|
|
return s
|
|
end
|
|
|
|
return if Language::Python.reads_brewed_pth_files?("python")
|
|
|
|
if !Language::Python.in_sys_path?("python", homebrew_site_packages)
|
|
s = <<-EOS.undent
|
|
Python modules have been installed and Homebrew's site-packages is not
|
|
in your Python sys.path, so you will not be able to import the modules
|
|
this formula installed. If you plan to develop with these modules,
|
|
please run:
|
|
EOS
|
|
s += instructions
|
|
elsif keg.python_pth_files_installed?
|
|
s = <<-EOS.undent
|
|
This formula installed .pth files to Homebrew's site-packages and your
|
|
Python isn't configured to process them, so you will not be able to
|
|
import the modules this formula installed. If you plan to develop
|
|
with these modules, please run:
|
|
EOS
|
|
s += instructions
|
|
end
|
|
s
|
|
end
|
|
|
|
def elisp_caveats
|
|
return if f.keg_only?
|
|
return unless keg
|
|
return unless keg.elisp_installed?
|
|
|
|
<<-EOS.undent
|
|
Emacs Lisp files have been installed to:
|
|
#{HOMEBREW_PREFIX}/share/emacs/site-lisp/#{f.name}
|
|
EOS
|
|
end
|
|
|
|
def plist_caveats
|
|
s = []
|
|
if f.plist || (keg && keg.plist_installed?)
|
|
destination = if f.plist_startup
|
|
"/Library/LaunchDaemons"
|
|
else
|
|
"~/Library/LaunchAgents"
|
|
end
|
|
|
|
plist_filename = if f.plist
|
|
f.plist_path.basename
|
|
else
|
|
File.basename Dir["#{keg}/*.plist"].first
|
|
end
|
|
plist_domain = f.plist_path.basename(".plist")
|
|
destination_path = Pathname.new File.expand_path destination
|
|
plist_path = destination_path/plist_filename
|
|
|
|
# we readlink because this path probably doesn't exist since caveats
|
|
# occurs before the link step of installation
|
|
# Yosemite security measures mildly tighter rules:
|
|
# https://github.com/Homebrew/legacy-homebrew/issues/33815
|
|
if !plist_path.file? || !plist_path.symlink?
|
|
if f.plist_startup
|
|
s << "To have launchd start #{f.full_name} now and restart at startup:"
|
|
s << " sudo brew services start #{f.full_name}"
|
|
else
|
|
s << "To have launchd start #{f.full_name} now and restart at login:"
|
|
s << " brew services start #{f.full_name}"
|
|
end
|
|
# For startup plists, we cannot tell whether it's running on launchd,
|
|
# as it requires for `sudo launchctl list` to get real result.
|
|
elsif f.plist_startup
|
|
s << "To restart #{f.full_name} after an upgrade:"
|
|
s << " sudo brew services restart #{f.full_name}"
|
|
elsif Kernel.system "/bin/launchctl list #{plist_domain} &>/dev/null"
|
|
s << "To restart #{f.full_name} after an upgrade:"
|
|
s << " brew services restart #{f.full_name}"
|
|
else
|
|
s << "To start #{f.full_name}:"
|
|
s << " brew services start #{f.full_name}"
|
|
end
|
|
|
|
if f.plist_manual
|
|
s << "Or, if you don't want/need a background service you can just run:"
|
|
s << " #{f.plist_manual}"
|
|
end
|
|
|
|
if ENV["TMUX"] && !quiet_system("/usr/bin/pbpaste")
|
|
s << "" << "WARNING: brew services will fail when run under tmux."
|
|
end
|
|
end
|
|
s.join("\n") + "\n" unless s.empty?
|
|
end
|
|
end
|