129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| module Hbc
 | |
|   class CLI
 | |
|     class Doctor < AbstractCommand
 | |
|       def initialize(*)
 | |
|         super
 | |
|         return if args.empty?
 | |
|         raise ArgumentError, "#{self.class.command_name} does not take arguments."
 | |
|       end
 | |
| 
 | |
|       def run
 | |
|         ohai "Homebrew-Cask Version", Hbc.full_version
 | |
|         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
 | |
|         ohai "Homebrew-Cask Taps:"
 | |
|         puts self.class.render_taps(Hbc.default_tap, *self.class.alt_taps)
 | |
|         ohai "Contents of $LOAD_PATH", self.class.render_load_path($LOAD_PATH)
 | |
|         ohai "Environment Variables"
 | |
| 
 | |
|         environment_variables = %w[
 | |
|           RUBYLIB
 | |
|           RUBYOPT
 | |
|           RUBYPATH
 | |
|           RBENV_VERSION
 | |
|           CHRUBY_VERSION
 | |
|           GEM_HOME
 | |
|           GEM_PATH
 | |
|           BUNDLE_PATH
 | |
|           PATH
 | |
|           SHELL
 | |
|         ]
 | |
| 
 | |
|         (self.class.locale_variables + environment_variables).sort.each(&self.class.method(:render_env_var))
 | |
|       end
 | |
| 
 | |
|       def self.locale_variables
 | |
|         ENV.keys.grep(/^(?:LC_\S+|LANG|LANGUAGE)\Z/).sort
 | |
|       end
 | |
| 
 | |
|       def self.none_string
 | |
|         "<NONE>"
 | |
|       end
 | |
| 
 | |
|       def self.error_string(string = "Error")
 | |
|         Formatter.error("(#{string})")
 | |
|       end
 | |
| 
 | |
|       def self.render_with_none(string)
 | |
|         return string if !string.nil? && string.respond_to?(:to_s) && !string.to_s.empty?
 | |
|         none_string
 | |
|       end
 | |
| 
 | |
|       def self.alt_taps
 | |
|         Tap.select { |t| t.cask_dir.exist? && t != Hbc.default_tap }
 | |
|       end
 | |
| 
 | |
|       def self.cask_count_for_tap(tap)
 | |
|         Formatter.pluralize(tap.cask_files.count, "cask")
 | |
|       rescue StandardError
 | |
|         "0 #{error_string "error reading #{tap.path}"}"
 | |
|       end
 | |
| 
 | |
|       def self.render_taps(*taps)
 | |
|         taps.collect do |tap|
 | |
|           if tap.path.nil? || tap.path.to_s.empty?
 | |
|             none_string
 | |
|           else
 | |
|             "#{tap.path} (#{cask_count_for_tap(tap)})"
 | |
|           end
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def self.render_env_var(var)
 | |
|         return unless ENV.key?(var)
 | |
|         var = %Q(#{var}="#{ENV[var]}")
 | |
|         puts user_tilde(var)
 | |
|       end
 | |
| 
 | |
|       def self.user_tilde(path)
 | |
|         path.gsub(ENV["HOME"], "~")
 | |
|       end
 | |
| 
 | |
|       # 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
 | |
|         locations = Dir.glob(HOMEBREW_CELLAR.join("brew-cask", "*")).reverse
 | |
|         if locations.empty?
 | |
|           none_string
 | |
|         else
 | |
|           locations.collect do |l|
 | |
|             "#{l} #{error_string 'error: legacy install. Run "brew uninstall --force brew-cask".'}"
 | |
|           end
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def self.render_staging_location(path)
 | |
|         path = Pathname.new(user_tilde(path.to_s))
 | |
|         if !path.exist?
 | |
|           "#{path} #{error_string "error: path does not exist"}"
 | |
|         elsif !path.writable?
 | |
|           "#{path} #{error_string "error: not writable by current user"}"
 | |
|         else
 | |
|           path
 | |
|         end
 | |
|       end
 | |
| 
 | |
|       def self.render_load_path(paths)
 | |
|         paths.map(&method(:user_tilde))
 | |
|         return "#{none_string} #{error_string}" if [*paths].empty?
 | |
|         paths
 | |
|       end
 | |
| 
 | |
|       def self.render_cached_downloads
 | |
|         cleanup = CLI::Cleanup.new
 | |
|         count = cleanup.cache_files.count
 | |
|         size = cleanup.disk_cleanup_size
 | |
|         msg = user_tilde(Hbc.cache.to_s)
 | |
|         msg << " (#{number_readable(count)} files, #{disk_usage_readable(size)})" unless count.zero?
 | |
|         msg
 | |
|       end
 | |
| 
 | |
|       def self.help
 | |
|         "checks for configuration issues"
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 | 
