Class: Bundler::CLI::Doctor
Relationships & Source Files | |
Inherits: | Object |
Defined in: | lib/bundler/cli/doctor.rb |
Constant Summary
-
DARWIN_REGEX =
# File 'lib/bundler/cli/doctor.rb', line 7/\s(.) \(compatibility /
-
LDD_REGEX =
# File 'lib/bundler/cli/doctor.rb', line 8/\t\S+ => (\S+) \(\S+\)/
Class Method Summary
- .new(options) ⇒ Doctor constructor
Instance Attribute Summary
- #ldd_available? ⇒ Boolean readonly
- #options readonly
- #otool_available? ⇒ Boolean readonly
Instance Method Summary
Constructor Details
.new(options) ⇒ Doctor
# File 'lib/bundler/cli/doctor.rb', line 12
def initialize( ) @options = end
Instance Attribute Details
#ldd_available? ⇒ Boolean
(readonly)
[ GitHub ]
#options (readonly)
[ GitHub ]# File 'lib/bundler/cli/doctor.rb', line 10
attr_reader :
#otool_available? ⇒ Boolean
(readonly)
[ GitHub ]
Instance Method Details
#bundles_for_gem(spec)
[ GitHub ]# File 'lib/bundler/cli/doctor.rb', line 54
def bundles_for_gem(spec) Dir.glob("#{spec.full_gem_path}/**/*.bundle") end
#check!
[ GitHub ]#check_home_permissions (private)
[ GitHub ]# File 'lib/bundler/cli/doctor.rb', line 98
def require "find" files_not_readable_or_writable = [] files_not_rw_and_owned_by_different_user = [] files_not_owned_by_current_user_but_still_rw = [] Find.find(Bundler.home.to_s).each do |f| if !File.writable?(f) || !File.readable?(f) if File.stat(f).uid != Process.uid files_not_rw_and_owned_by_different_user << f else files_not_readable_or_writable << f end elsif File.stat(f).uid != Process.uid files_not_owned_by_current_user_but_still_rw << f end end ok = true if files_not_owned_by_current_user_but_still_rw.any? Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \ "user, but are still readable/writable. These files are:\n - #{files_not_owned_by_current_user_but_still_rw.join("\n - ")}" ok = false end if files_not_rw_and_owned_by_different_user.any? Bundler.ui.warn "Files exist in the Bundler home that are owned by another " \ "user, and are not readable/writable. These files are:\n - #{files_not_rw_and_owned_by_different_user.join("\n - ")}" ok = false end if files_not_readable_or_writable.any? Bundler.ui.warn "Files exist in the Bundler home that are not " \ "readable/writable by the current user. These files are:\n - #{files_not_readable_or_writable.join("\n - ")}" ok = false end ok end
#dylibs(path)
[ GitHub ]# File 'lib/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)
[ GitHub ]# File 'lib/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)
[ GitHub ]# File 'lib/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
#run
[ GitHub ]# File 'lib/bundler/cli/doctor.rb', line 63
def run Bundler.ui.level = "error" if [: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 = if broken_links.any? = "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| += m } raise ProductionError, elsif ! Bundler.ui.info "No issues found with the installed bundle" end end