| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | module Hbc | 
					
						
							|  |  |  |   class CLI | 
					
						
							| 
									
										
										
										
											2017-05-20 19:08:03 +02:00
										 |  |  |     class Doctor < AbstractCommand | 
					
						
							| 
									
										
										
										
											2017-05-21 00:15:56 +02:00
										 |  |  |       def initialize(*) | 
					
						
							|  |  |  |         super | 
					
						
							|  |  |  |         return if args.empty? | 
					
						
							|  |  |  |         raise ArgumentError, "#{self.class.command_name} does not take arguments." | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def run | 
					
						
							| 
									
										
										
										
											2017-02-05 06:48:08 +01:00
										 |  |  |         ohai "Homebrew-Cask Version", Hbc.full_version | 
					
						
							| 
									
										
										
										
											2017-05-21 00:15:56 +02:00
										 |  |  |         ohai "Homebrew-Cask Install Location", self.class.render_install_location | 
					
						
							|  |  |  |         ohai "Homebrew-Cask Staging Location", self.class.render_staging_location(Hbc.caskroom) | 
					
						
							|  |  |  |         ohai "Homebrew-Cask Cached Downloads", self.class.render_cached_downloads | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |         ohai "Homebrew-Cask Taps:" | 
					
						
							| 
									
										
										
										
											2017-05-21 00:15:56 +02:00
										 |  |  |         puts self.class.render_taps(Hbc.default_tap, *self.class.alt_taps) | 
					
						
							|  |  |  |         ohai "Contents of $LOAD_PATH", self.class.render_load_path($LOAD_PATH) | 
					
						
							| 
									
										
										
										
											2017-02-05 06:48:08 +01:00
										 |  |  |         ohai "Environment Variables" | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-29 18:24:52 +01:00
										 |  |  |         environment_variables = %w[
 | 
					
						
							|  |  |  |           RUBYLIB | 
					
						
							|  |  |  |           RUBYOPT | 
					
						
							|  |  |  |           RUBYPATH | 
					
						
							|  |  |  |           RBENV_VERSION | 
					
						
							|  |  |  |           CHRUBY_VERSION | 
					
						
							|  |  |  |           GEM_HOME | 
					
						
							|  |  |  |           GEM_PATH | 
					
						
							|  |  |  |           BUNDLE_PATH | 
					
						
							|  |  |  |           PATH | 
					
						
							|  |  |  |           SHELL | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:35 +01:00
										 |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-21 00:15:56 +02:00
										 |  |  |         (self.class.locale_variables + environment_variables).sort.each(&self.class.method(:render_env_var)) | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.locale_variables | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:35 +01:00
										 |  |  |         ENV.keys.grep(/^(?:LC_\S+|LANG|LANGUAGE)\Z/).sort | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.none_string | 
					
						
							|  |  |  |         "<NONE>" | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.error_string(string = "Error") | 
					
						
							| 
									
										
										
										
											2016-08-30 21:38:13 +02:00
										 |  |  |         Formatter.error("(#{string})") | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.render_with_none(string) | 
					
						
							|  |  |  |         return string if !string.nil? && string.respond_to?(:to_s) && !string.to_s.empty? | 
					
						
							|  |  |  |         none_string | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |       def self.alt_taps | 
					
						
							| 
									
										
										
										
											2017-05-21 00:15:56 +02:00
										 |  |  |         Tap.select { |t| t.cask_dir.exist? && t != Hbc.default_tap } | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       def self.cask_count_for_tap(tap) | 
					
						
							| 
									
										
										
										
											2017-05-29 17:50:13 +02:00
										 |  |  |         Formatter.pluralize(tap.cask_files.count, "cask") | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |       rescue StandardError | 
					
						
							|  |  |  |         "0 #{error_string "error reading #{tap.path}"}" | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |       def self.render_taps(*taps) | 
					
						
							|  |  |  |         taps.collect do |tap| | 
					
						
							|  |  |  |           if tap.path.nil? || tap.path.to_s.empty? | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |             none_string | 
					
						
							|  |  |  |           else | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |             "#{tap.path} (#{cask_count_for_tap(tap)})" | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.render_env_var(var) | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:35 +01:00
										 |  |  |         return unless ENV.key?(var) | 
					
						
							|  |  |  |         var = %Q(#{var}="#{ENV[var]}") | 
					
						
							|  |  |  |         puts user_tilde(var) | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-04 21:52:04 +01:00
										 |  |  |       def self.user_tilde(path) | 
					
						
							|  |  |  |         path.gsub(ENV["HOME"], "~") | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       # This could be done by calling into Homebrew, but the situation | 
					
						
							|  |  |  |       # where "doctor" is needed is precisely the situation where such | 
					
						
							|  |  |  |       # things are less dependable. | 
					
						
							|  |  |  |       def self.render_install_location | 
					
						
							| 
									
										
										
										
											2017-01-25 00:36:38 +01:00
										 |  |  |         locations = Dir.glob(HOMEBREW_CELLAR.join("brew-cask", "*")).reverse | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         if locations.empty? | 
					
						
							|  |  |  |           none_string | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           locations.collect do |l| | 
					
						
							|  |  |  |             "#{l} #{error_string 'error: legacy install. Run "brew uninstall --force brew-cask".'}" | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |       end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.render_staging_location(path) | 
					
						
							| 
									
										
										
										
											2017-02-04 21:52:04 +01:00
										 |  |  |         path = Pathname.new(user_tilde(path.to_s)) | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         if !path.exist? | 
					
						
							| 
									
										
										
										
											2017-04-21 00:24:09 +02:00
										 |  |  |           "#{path} #{error_string "error: path does not exist"}" | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         elsif !path.writable? | 
					
						
							|  |  |  |           "#{path} #{error_string "error: not writable by current user"}" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           path | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.render_load_path(paths) | 
					
						
							| 
									
										
										
										
											2017-02-04 21:52:04 +01:00
										 |  |  |         paths.map(&method(:user_tilde)) | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         return "#{none_string} #{error_string}" if [*paths].empty? | 
					
						
							|  |  |  |         paths | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.render_cached_downloads | 
					
						
							| 
									
										
										
										
											2017-05-19 20:27:25 +02:00
										 |  |  |         cleanup = CLI::Cleanup.new | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:02 +01:00
										 |  |  |         count = cleanup.cache_files.count | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |         size = cleanup.disk_cleanup_size | 
					
						
							| 
									
										
										
										
											2017-02-04 21:53:02 +01:00
										 |  |  |         msg = user_tilde(Hbc.cache.to_s) | 
					
						
							|  |  |  |         msg << " (#{number_readable(count)} files, #{disk_usage_readable(size)})" unless count.zero? | 
					
						
							|  |  |  |         msg | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  |       def self.help | 
					
						
							|  |  |  |         "checks for configuration issues" | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2016-08-18 22:11:42 +03:00
										 |  |  |   end | 
					
						
							|  |  |  | end |