| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: false | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-12 13:08:29 -06:00
										 |  |  |     caveats << plist_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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-11 06:26:56 +00:00
										 |  |  |       if which("pkg-config", ENV["HOMEBREW_PATH"]) && | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2017-12-11 09:16:39 +00:00
										 |  |  |     return unless which(shell.to_s, ENV["HOMEBREW_PATH"]) | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-11 13:59:34 -06:00
										 |  |  |   def plist_caveats | 
					
						
							| 
									
										
										
										
											2021-05-01 16:05:25 +02:00
										 |  |  |     return if !f.plist_manual && !f.service? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-13 08:56:16 +00:00
										 |  |  |     # Default to brew services not being supported. macOS overrides this behavior. | 
					
						
							| 
									
										
										
										
											2019-03-11 13:59:34 -06:00
										 |  |  |     <<~EOS | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 06:38:45 +05:30
										 |  |  |   def plist_path | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2017-07-21 06:38:45 +05:30
										 |  |  |     destination_path = Pathname.new(File.expand_path(destination)) | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-21 06:38:45 +05:30
										 |  |  |     destination_path/plist_filename | 
					
						
							| 
									
										
										
										
											2017-07-20 03:47:02 +05:30
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2013-01-01 17:26:50 +00:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2017-10-16 11:15:54 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | require "extend/os/caveats" |