summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Giddins <segiddins@segiddins.me>2017-02-22 10:24:36 +1100
committerSamuel Giddins <segiddins@segiddins.me>2017-02-22 10:27:15 +1100
commitc011e6b1afeba920ba259870296b23f0dd74770f (patch)
tree1f58d3ebc196b4268283500027864923d121975a
parentd8e009d483b0a077600aefbde85afd8c55995399 (diff)
downloadbundler-seg-bundler-plugin-source-api-const-undefined.tar.gz
Avoid undefined Bundler::Plugin::API::Source exceptionseg-bundler-plugin-source-api-const-undefined
-rw-r--r--lib/bundler/plugin/api/source.rb6
-rw-r--r--lib/bundler/rubygems_ext.rb6
-rw-r--r--spec/install/gemfile/gemspec_spec.rb20
3 files changed, 31 insertions, 1 deletions
diff --git a/lib/bundler/plugin/api/source.rb b/lib/bundler/plugin/api/source.rb
index 04173b4ee9..5d3f58df92 100644
--- a/lib/bundler/plugin/api/source.rb
+++ b/lib/bundler/plugin/api/source.rb
@@ -287,6 +287,12 @@ module Bundler
def root
Bundler.root
end
+
+ # @private
+ # Returns true
+ def bundler_plugin_api_source?
+ true
+ end
end
end
end
diff --git a/lib/bundler/rubygems_ext.rb b/lib/bundler/rubygems_ext.rb
index 53a153e560..7293e7cfc7 100644
--- a/lib/bundler/rubygems_ext.rb
+++ b/lib/bundler/rubygems_ext.rb
@@ -42,7 +42,11 @@ module Gem
attr_writer :full_gem_path unless instance_methods.include?(:full_gem_path=)
def full_gem_path
- if source.respond_to?(:path) || source.is_a?(Bundler::Plugin::API::Source)
+ # this cannot check source.is_a?(Bundler::Plugin::API::Source)
+ # because that _could_ trip the autoload, and if there are unresolved
+ # gems at that time, this method could be called inside another require,
+ # thus raising with that constant being undefined. Better to check a method
+ if source.respond_to?(:path) || (source.respond_to?(:bundler_plugin_api_source?) && source.bundler_plugin_api_source?)
Pathname.new(loaded_from).dirname.expand_path(source.root).to_s.untaint
else
rg_full_gem_path
diff --git a/spec/install/gemfile/gemspec_spec.rb b/spec/install/gemfile/gemspec_spec.rb
index 541a7e4008..e2534be1ad 100644
--- a/spec/install/gemfile/gemspec_spec.rb
+++ b/spec/install/gemfile/gemspec_spec.rb
@@ -192,6 +192,26 @@ RSpec.describe "bundle install from an existing gemspec" do
expect(@err).not_to match(/ahh/)
end
+ it "allows the gemspec to activate other gems" do
+ # see https://github.com/bundler/bundler/issues/5409
+ #
+ # issue was caused by rubygems having an unresolved gem during a require,
+ # so emulate that
+ system_gems %w(rack-1.0.0 rack-0.9.1 rack-obama-1.0)
+
+ build_lib("foo", :path => bundled_app)
+ gemspec = bundled_app("foo.gemspec").read
+ bundled_app("foo.gemspec").open("w") do |f|
+ f.write "#{gemspec.strip}.tap { gem 'rack-obama'; require 'rack-obama' }"
+ end
+
+ install_gemfile! <<-G
+ gemspec
+ G
+
+ expect(the_bundle).to include_gem "foo 1.0"
+ end
+
it "allows conflicts" do
build_lib("foo", :path => tmp.join("foo")) do |s|
s.version = "1.0.0"