In Files

  • bundler/cli/doctor.rb

Class/Module Index [+]

Quicksearch

Bundler::CLI::Doctor

Attributes

options[R]

Public Class Methods

new(options) click to toggle source
 
               # File bundler/cli/doctor.rb, line 12
def initialize(options)
  @options = options
end
            

Public Instance Methods

bundles_for_gem(spec) click to toggle source
 
               # File bundler/cli/doctor.rb, line 54
def bundles_for_gem(spec)
  Dir.glob("#{spec.full_gem_path}/**/*.bundle")
end
            
check!() click to toggle source
 
               # File bundler/cli/doctor.rb, line 58
def check!
  require_relative "check"
  Bundler::CLI::Check.new({}).run
end
            
dylibs(path) click to toggle source
 
               # File bundler/cli/doctor.rb, line 40
def dylibs(path)
  case RbConfig::CONFIG["host_os"]
  when /darwin/
    return [] unless otool_available?
    dylibs_darwin(path)
  when /(linux|solaris|bsd)/
    return [] unless ldd_available?
    dylibs_ldd(path)
  else # Windows, etc.
    Bundler.ui.warn("Dynamic library check not supported on this platform.")
    []
  end
end
            
dylibs_darwin(path) click to toggle source
 
               # File bundler/cli/doctor.rb, line 24
def dylibs_darwin(path)
  output = `/usr/bin/otool -L "#{path}"`.chomp
  dylibs = output.split("\n")[1..-1].map {|l| l.match(DARWIN_REGEX).captures[0] }.uniq
  # ignore @rpath and friends
  dylibs.reject {|dylib| dylib.start_with? "@" }
end
            
dylibs_ldd(path) click to toggle source
 
               # File bundler/cli/doctor.rb, line 31
def dylibs_ldd(path)
  output = `/usr/bin/ldd "#{path}"`.chomp
  output.split("\n").map do |l|
    match = l.match(LDD_REGEX)
    next if match.nil?
    match.captures[0]
  end.compact
end
            
ldd_available?() click to toggle source
 
               # File bundler/cli/doctor.rb, line 20
def ldd_available?
  Bundler.which("ldd")
end
            
otool_available?() click to toggle source
 
               # File bundler/cli/doctor.rb, line 16
def otool_available?
  Bundler.which("otool")
end
            
run() click to toggle source
 
               # File bundler/cli/doctor.rb, line 63
def run
  Bundler.ui.level = "error" if options[:quiet]
  Bundler.settings.validate!
  check!

  definition = Bundler.definition
  broken_links = {}

  definition.specs.each do |spec|
    bundles_for_gem(spec).each do |bundle|
      bad_paths = dylibs(bundle).select {|f| !File.exist?(f) }
      if bad_paths.any?
        broken_links[spec] ||= []
        broken_links[spec].concat(bad_paths)
      end
    end
  end

  permissions_valid = check_home_permissions

  if broken_links.any?
    message = "The following gems are missing OS dependencies:"
    broken_links.map do |spec, paths|
      paths.uniq.map do |path|
        "\n * #{spec.name}: #{path}"
      end
    end.flatten.sort.each {|m| message += m }
    raise ProductionError, message
  elsif !permissions_valid
    Bundler.ui.info "No issues found with the installed bundle"
  end
end