| 
									
										
										
										
											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" | 
					
						
							| 
									
										
										
										
											2023-04-13 23:33:31 -07:00
										 |  |  | require "utils/service" | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |   attr_reader :formula | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |   def initialize(formula) | 
					
						
							|  |  |  |     @formula = formula | 
					
						
							| 
									
										
										
										
											2013-01-12 13:08:29 -06:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def caveats | 
					
						
							|  |  |  |     caveats = [] | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |     begin | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       build = formula.build | 
					
						
							|  |  |  |       formula.build = Tab.for_formula(formula) | 
					
						
							|  |  |  |       string = formula.caveats.to_s | 
					
						
							|  |  |  |       caveats << "#{string.chomp}\n" unless string.empty? | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |     ensure | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       formula.build = build | 
					
						
							| 
									
										
										
										
											2015-10-09 19:43:31 +08:00
										 |  |  |     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) | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |     return unless formula.keg_only? | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |     s = if skip_reason | 
					
						
							|  |  |  |       "" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       <<~EOS | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         #{formula.name} is keg-only, which means it was not symlinked into #{HOMEBREW_PREFIX}, | 
					
						
							|  |  |  |         because #{formula.keg_only_reason.to_s.chomp}. | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       EOS | 
					
						
							| 
									
										
										
										
											2019-04-20 14:07:29 +09:00
										 |  |  |     end.dup | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |     if formula.bin.directory? || formula.sbin.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         If you need to have #{formula.name} first in your PATH, run: | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       EOS | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "  #{Utils::Shell.prepend_path_in_profile(formula.opt_bin.to_s)}\n" if formula.bin.directory? | 
					
						
							|  |  |  |       s << "  #{Utils::Shell.prepend_path_in_profile(formula.opt_sbin.to_s)}\n" if formula.sbin.directory? | 
					
						
							| 
									
										
										
										
											2017-01-25 08:25:16 +00:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |     if formula.lib.directory? || formula.include.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         For compilers to find #{formula.name} you may need to set: | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |       EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "  #{Utils::Shell.export_value("LDFLAGS", "-L#{formula.opt_lib}")}\n" if formula.lib.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "  #{Utils::Shell.export_value("CPPFLAGS", "-I#{formula.opt_include}")}\n" if formula.include.directory? | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-15 05:40:43 +01:00
										 |  |  |       if which("pkg-config", ORIGINAL_PATHS) && | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |          ((formula.lib/"pkgconfig").directory? || (formula.share/"pkgconfig").directory?) | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |         s << <<~EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |           For pkg-config to find #{formula.name} you may need to set: | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |         EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         if (formula.lib/"pkgconfig").directory? | 
					
						
							|  |  |  |           s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{formula.opt_lib}/pkgconfig")}\n" | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         if (formula.share/"pkgconfig").directory? | 
					
						
							|  |  |  |           s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{formula.opt_share}/pkgconfig")}\n" | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-09-11 04:49:09 +01:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2023-03-19 18:25:56 +00:00
										 |  |  |     s << "\n" unless s.end_with?("\n") | 
					
						
							| 
									
										
										
										
											2023-03-18 12:12:08 +00:00
										 |  |  |     s | 
					
						
							| 
									
										
										
										
											2015-06-14 19:22:03 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def keg | 
					
						
							| 
									
										
										
										
											2024-02-22 23:29:55 +00:00
										 |  |  |     @keg ||= [formula.prefix, formula.opt_prefix, formula.linked_keg].filter_map do |d| | 
					
						
							| 
									
										
										
										
											2019-10-13 10:03:26 +01:00
										 |  |  |       Keg.new(d.resolved_path) | 
					
						
							|  |  |  |     rescue | 
					
						
							|  |  |  |       nil | 
					
						
							| 
									
										
										
										
											2024-02-22 23:29:55 +00:00
										 |  |  |     end.first | 
					
						
							| 
									
										
										
										
											2018-07-26 10:49:07 +01:00
										 |  |  |   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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |     root_dir = formula.keg_only? ? formula.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 :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 | 
					
						
							| 
									
										
										
										
											2024-02-13 18:46:58 +01:00
										 |  |  |     when :zsh | 
					
						
							|  |  |  |       <<~EOS | 
					
						
							|  |  |  |         zsh #{installed.join(" and ")} have been installed to: | 
					
						
							|  |  |  |           #{root_dir}/share/zsh/site-functions | 
					
						
							|  |  |  |       EOS | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |     return if formula.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: | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |         #{HOMEBREW_PREFIX}/share/emacs/site-lisp/#{formula.name} | 
					
						
							| 
									
										
										
										
											2016-09-22 20:12:28 +02:00
										 |  |  |     EOS | 
					
						
							| 
									
										
										
										
											2015-07-05 14:45:26 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |   def service_caveats | 
					
						
							| 
									
										
										
										
											2023-04-13 23:33:31 -07:00
										 |  |  |     return if !formula.plist && !formula.service? && !Utils::Service.installed?(formula) && !keg&.plist_installed? | 
					
						
							|  |  |  |     return if formula.service? && !formula.service.command? && !Utils::Service.installed?(formula) | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     s = [] | 
					
						
							| 
									
										
										
										
											2021-05-01 16:05:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-13 23:33:31 -07:00
										 |  |  |     return <<~EOS if !Utils::Service.launchctl? && formula.plist | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       #{Formatter.warning("Warning:")} #{formula.name} provides a launchd plist which can only be used on macOS! | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2023-04-13 23:33:31 -07:00
										 |  |  |     return <<~EOS if !Utils::Service.systemctl? && !Utils::Service.launchctl? && formula.service.command? | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       #{Formatter.warning("Warning:")} #{formula.name} provides a service which can only be used on macOS or systemd! | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |       You can manually execute the service instead with: | 
					
						
							| 
									
										
										
										
											2023-12-07 22:58:54 +00:00
										 |  |  |         #{formula.service.manual_command} | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |     EOS | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-07 22:58:54 +00:00
										 |  |  |     startup = formula.service.requires_root? | 
					
						
							| 
									
										
										
										
											2023-04-13 23:33:31 -07:00
										 |  |  |     if Utils::Service.running?(formula) | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "To restart #{formula.full_name} after an upgrade:" | 
					
						
							|  |  |  |       s << "  #{startup ? "sudo " : ""}brew services restart #{formula.full_name}" | 
					
						
							| 
									
										
										
										
											2022-12-05 12:12:38 +01:00
										 |  |  |     elsif startup | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "To start #{formula.full_name} now and restart at startup:" | 
					
						
							|  |  |  |       s << "  sudo brew services start #{formula.full_name}" | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2023-03-10 23:46:07 +00:00
										 |  |  |       s << "To start #{formula.full_name} now and restart at login:" | 
					
						
							|  |  |  |       s << "  brew services start #{formula.full_name}" | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-07 22:58:54 +00:00
										 |  |  |     if formula.service.command? | 
					
						
							| 
									
										
										
										
											2021-08-23 22:52:36 +02:00
										 |  |  |       s << "Or, if you don't want/need a background service you can just run:" | 
					
						
							| 
									
										
										
										
											2023-12-07 22:58:54 +00:00
										 |  |  |       s << "  #{formula.service.manual_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 |