| 
									
										
										
										
											2022-10-11 00:52:32 +01:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-30 18:58:30 +00:00
										 |  |  | require "language/python" | 
					
						
							| 
									
										
										
										
											2017-10-21 20:01:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-17 02:53:57 +02:00
										 |  |  | # A formula's caveats. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @api private | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | class Caveats | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   extend Forwardable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-12 13:08:29 -06:00
										 |  |  |   attr_reader :f | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-12 13:08:29 -06:00
										 |  |  |   def initialize(f) | 
					
						
							|  |  |  |     @f = f | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def caveats | 
					
						
							|  |  |  |     caveats = [] | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2016-09-17 15:17:27 +01:00
										 |  |  |       build = f.build | 
					
						
							|  |  |  |       f.build = Tab.for_formula(f) | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |       s = f.caveats.to_s | 
					
						
							| 
									
										
										
										
											2020-08-19 17:12:32 +01:00
										 |  |  |       caveats << "#{s.chomp}\n" unless s.empty? | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |     ensure | 
					
						
							|  |  |  |       f.build = build | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  |     caveats << keg_only_text | 
					
						
							| 
									
										
										
										
											2020-11-26 16:08:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     valid_shells = [:bash, :zsh, :fish].freeze | 
					
						
							|  |  |  |     current_shell = Utils::Shell.preferred || Utils::Shell.parent | 
					
						
							|  |  |  |     shells = if current_shell.present? && | 
					
						
							|  |  |  |                 (shell_sym = current_shell.to_sym) && | 
					
						
							|  |  |  |                 valid_shells.include?(shell_sym) | 
					
						
							|  |  |  |       [shell_sym] | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       valid_shells | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     shells.each do |shell| | 
					
						
							|  |  |  |       caveats << function_completion_caveats(shell) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     caveats << service_caveats | 
					
						
							| 
									
										
										
										
											2015-07-05 14:45:26 -07:00
										 |  |  |     caveats << elisp_caveats | 
					
						
							| 
									
										
										
										
											2013-01-12 13:08:29 -06:00
										 |  |  |     caveats.compact.join("\n") | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-26 07:30:28 +02:00
										 |  |  |   delegate [:empty?, :to_s] => :caveats | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |   def keg_only_text(skip_reason: false) | 
					
						
							| 
									
										
										
										
											2015-07-25 15:07:10 +08:00
										 |  |  |     return unless f.keg_only? | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |     s = if skip_reason | 
					
						
							|  |  |  |       "" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       <<~EOS | 
					
						
							|  |  |  |         #{f.name} is keg-only, which means it was not symlinked into #{HOMEBREW_PREFIX}, | 
					
						
							|  |  |  |         because #{f.keg_only_reason.to_s.chomp}. | 
					
						
							|  |  |  |       EOS | 
					
						
							| 
									
										
										
										
											2019-04-20 14:07:29 +09:00
										 |  |  |     end.dup | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 08:25:16 +00:00
										 |  |  |     if f.bin.directory? || f.sbin.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-26 15:21:24 -05:00
										 |  |  |         If you need to have #{f.name} first in your PATH, run: | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       EOS | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |       s << "  #{Utils::Shell.prepend_path_in_profile(f.opt_bin.to_s)}\n" if f.bin.directory? | 
					
						
							|  |  |  |       s << "  #{Utils::Shell.prepend_path_in_profile(f.opt_sbin.to_s)}\n" if f.sbin.directory? | 
					
						
							| 
									
										
										
										
											2017-01-25 08:25:16 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 08:25:16 +00:00
										 |  |  |     if f.lib.directory? || f.include.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         For compilers to find #{f.name} you may need to set: | 
					
						
							|  |  |  |       EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |       s << "  #{Utils::Shell.export_value("LDFLAGS", "-L#{f.opt_lib}")}\n" if f.lib.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-19 13:11:32 +00:00
										 |  |  |       s << "  #{Utils::Shell.export_value("CPPFLAGS", "-I#{f.opt_include}")}\n" if f.include.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-15 05:40:43 +01:00
										 |  |  |       if which("pkg-config", ORIGINAL_PATHS) && | 
					
						
							| 
									
										
										
										
											2017-01-25 08:25:16 +00:00
										 |  |  |          ((f.lib/"pkgconfig").directory? || (f.share/"pkgconfig").directory?) | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |         s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           For pkg-config to find #{f.name} you may need to set: | 
					
						
							|  |  |  |         EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (f.lib/"pkgconfig").directory? | 
					
						
							|  |  |  |           s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{f.opt_lib}/pkgconfig")}\n" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (f.share/"pkgconfig").directory? | 
					
						
							|  |  |  |           s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{f.opt_share}/pkgconfig")}\n" | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-11 04:49:09 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |     s << "\n" | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def keg | 
					
						
							|  |  |  |     @keg ||= [f.prefix, f.opt_prefix, f.linked_keg].map do |d| | 
					
						
							| 
									
										
										
										
											2019-10-13 10:03:26 +01:00
										 |  |  |       Keg.new(d.resolved_path) | 
					
						
							|  |  |  |     rescue | 
					
						
							|  |  |  |       nil | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |     end.compact.first | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |   def function_completion_caveats(shell) | 
					
						
							| 
									
										
										
										
											2016-09-22 20:12:28 +02:00
										 |  |  |     return unless keg | 
					
						
							| 
									
										
										
										
											2022-06-15 05:40:43 +01:00
										 |  |  |     return unless which(shell.to_s, ORIGINAL_PATHS) | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     completion_installed = keg.completion_installed?(shell) | 
					
						
							|  |  |  |     functions_installed = keg.functions_installed?(shell) | 
					
						
							| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  |     return if !completion_installed && !functions_installed | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     installed = [] | 
					
						
							|  |  |  |     installed << "completions" if completion_installed | 
					
						
							|  |  |  |     installed << "functions" if functions_installed | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-24 07:59:17 +00:00
										 |  |  |     root_dir = f.keg_only? ? f.opt_prefix : HOMEBREW_PREFIX | 
					
						
							| 
									
										
										
										
											2017-12-21 00:30:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |     case shell | 
					
						
							|  |  |  |     when :bash | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |       <<~EOS | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |         Bash completion has been installed to: | 
					
						
							| 
									
										
										
										
											2017-12-21 00:30:06 +00:00
										 |  |  |           #{root_dir}/etc/bash_completion.d | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |       EOS | 
					
						
							|  |  |  |     when :zsh | 
					
						
							| 
									
										
										
										
											2020-12-09 11:47:48 +00:00
										 |  |  |       <<~EOS | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |         zsh #{installed.join(" and ")} have been installed to: | 
					
						
							| 
									
										
										
										
											2020-12-09 11:47:48 +00:00
										 |  |  |           #{root_dir}/share/zsh/site-functions | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |       EOS | 
					
						
							|  |  |  |     when :fish | 
					
						
							| 
									
										
										
										
											2019-04-20 14:07:29 +09:00
										 |  |  |       fish_caveats = +"fish #{installed.join(" and ")} have been installed to:" | 
					
						
							| 
									
										
										
										
											2017-12-21 00:30:06 +00:00
										 |  |  |       fish_caveats << "\n  #{root_dir}/share/fish/vendor_completions.d" if completion_installed | 
					
						
							|  |  |  |       fish_caveats << "\n  #{root_dir}/share/fish/vendor_functions.d" if functions_installed | 
					
						
							| 
									
										
										
										
											2019-04-20 14:07:29 +09:00
										 |  |  |       fish_caveats.freeze | 
					
						
							| 
									
										
										
										
											2017-03-07 10:36:57 -08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-12-03 11:36:49 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-05 14:45:26 -07:00
										 |  |  |   def elisp_caveats | 
					
						
							| 
									
										
										
										
											2015-08-11 20:25:33 -07:00
										 |  |  |     return if f.keg_only? | 
					
						
							| 
									
										
										
										
											2016-09-22 20:12:28 +02:00
										 |  |  |     return unless keg | 
					
						
							|  |  |  |     return unless keg.elisp_installed? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-15 02:28:32 +02:00
										 |  |  |     <<~EOS | 
					
						
							| 
									
										
										
										
											2016-09-22 20:12:28 +02:00
										 |  |  |       Emacs Lisp files have been installed to: | 
					
						
							|  |  |  |         #{HOMEBREW_PREFIX}/share/emacs/site-lisp/#{f.name} | 
					
						
							|  |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2015-07-05 14:45:26 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |   def service_caveats | 
					
						
							|  |  |  |     return if !f.plist && !f.service? && !keg&.plist_installed? | 
					
						
							| 
									
										
										
										
											2023-01-13 14:40:03 +01:00
										 |  |  |     return if f.service? && f.service.command.blank? | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s = [] | 
					
						
							| 
									
										
										
										
											2021-05-01 16:05:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     command = if f.service? | 
					
						
							| 
									
										
										
										
											2021-05-22 10:59:28 +02:00
										 |  |  |       f.service.manual_command | 
					
						
							| 
									
										
										
										
											2021-05-01 16:05:25 +02:00
										 |  |  |     else | 
					
						
							|  |  |  |       f.plist_manual | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2019-03-11 13:59:34 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     return <<~EOS if !which("launchctl") && f.plist | 
					
						
							| 
									
										
										
										
											2019-03-13 08:56:16 +00:00
										 |  |  |       #{Formatter.warning("Warning:")} #{f.name} provides a launchd plist which can only be used on macOS! | 
					
						
							|  |  |  |       You can manually execute the service instead with: | 
					
						
							| 
									
										
										
										
											2021-05-01 16:05:25 +02:00
										 |  |  |         #{command} | 
					
						
							| 
									
										
										
										
											2019-03-11 13:59:34 -06:00
										 |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     # Brew services only works with these two tools | 
					
						
							|  |  |  |     return <<~EOS if !which("systemctl") && !which("launchctl") && f.service? | 
					
						
							|  |  |  |       #{Formatter.warning("Warning:")} #{f.name} provides a service which can only be used on macOS or systemd! | 
					
						
							|  |  |  |       You can manually execute the service instead with: | 
					
						
							|  |  |  |         #{command} | 
					
						
							|  |  |  |     EOS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     is_running_service = f.service? && quiet_system("ps aux | grep #{f.service.command&.first}") | 
					
						
							| 
									
										
										
										
											2022-12-05 12:12:38 +01:00
										 |  |  |     startup = f.service&.requires_root? || f.plist_startup | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     if is_running_service || (f.plist && quiet_system("/bin/launchctl list #{f.plist_name} &>/dev/null")) | 
					
						
							|  |  |  |       s << "To restart #{f.full_name} after an upgrade:" | 
					
						
							| 
									
										
										
										
											2022-12-05 12:12:38 +01:00
										 |  |  |       s << "  #{startup ? "sudo " : ""}brew services restart #{f.full_name}" | 
					
						
							|  |  |  |     elsif startup | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |       s << "To start #{f.full_name} now and restart at startup:" | 
					
						
							|  |  |  |       s << "  sudo brew services start #{f.full_name}" | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |       s << "To start #{f.full_name} now and restart at login:" | 
					
						
							|  |  |  |       s << "  brew services start #{f.full_name}" | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     if f.plist_manual || f.service? | 
					
						
							|  |  |  |       s << "Or, if you don't want/need a background service you can just run:" | 
					
						
							|  |  |  |       s << "  #{command}" | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     # pbpaste is the system clipboard tool on macOS and fails with `tmux` by default | 
					
						
							|  |  |  |     # check if this is being run under `tmux` to avoid failing | 
					
						
							|  |  |  |     if ENV["HOMEBREW_TMUX"] && !quiet_system("/usr/bin/pbpaste") | 
					
						
							|  |  |  |       s << "" << "WARNING: brew services will fail when run under tmux." | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     "#{s.join("\n")}\n" unless s.empty? | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | end |