# Monkey-patching for RubyGems and Bundler to play nicely with Vagrant
# Fix rubygems 2.2 compatibility
# https://github.com/bundler/bundler/pull/3237
module Bundler
module SharedHelpers
private
def clean_load_path
# handle 1.9 where system gems are always on the load path
if defined?(::Gem)
me = File.expand_path("../../", __FILE__)
# RubyGems 2.2+ can put binary extension into dedicated folders,
# therefore use RubyGems facilities to obtain their load paths.
if Gem::Specification.method_defined? :full_require_paths
loaded_gem_paths = Gem.loaded_specs.map do |n, s|
s.full_require_paths.none? {|path| File.expand_path(path) =~ /^#{Regexp.escape(me)}/} ? s.full_require_paths : []
end
loaded_gem_paths.flatten!
$LOAD_PATH.reject! {|p| loaded_gem_paths.delete(p) }
else
$LOAD_PATH.reject! do |p|
next if File.expand_path(p) =~ /^#{Regexp.escape(me)}/
p != File.dirname(__FILE__) &&
Bundler.rubygems.gem_path.any?{|gp| p =~ /^#{Regexp.escape(gp)}/ }
end
end
$LOAD_PATH.uniq!
end
end
end
end
# Remove useless gem build step.
# https://github.com/bundler/bundler/pull/3238
module Bundler
class Source
class Path < Source
private
def generate_bin(spec, disable_extensions = false)
gem_dir = Pathname.new(spec.full_gem_path)
# Some gem authors put absolute paths in their gemspec
# and we have to save them from themselves
spec.files = spec.files.map do |p|
next if File.directory?(p)
begin
Pathname.new(p).relative_path_from(gem_dir).to_s
rescue ArgumentError
p
end
end.compact
SharedHelpers.chdir(gem_dir) do
installer = Path::Installer.new(spec, :env_shebang => false)
run_hooks(:pre_install, installer)
installer.build_extensions unless disable_extensions
run_hooks(:post_build, installer)
installer.generate_bin
run_hooks(:post_install, installer)
end
rescue Gem::InvalidSpecificationException => e
Bundler.ui.warn "\n#{spec.name} at #{spec.full_gem_path} did not have a valid gemspec.\n" \
"This prevents bundler from installing bins or native extensions, but " \
"that may not affect its functionality."
if !spec.extensions.empty? && !spec.email.empty?
Bundler.ui.warn "If you need to use this package without installing it from a gem " \
"repository, please contact #{spec.email} and ask them " \
"to modify their .gemspec so it can work with `gem build`."
end
Bundler.ui.warn "The validation message from Rubygems was:\n #{e.message}"
end
end
end
end