aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHomu <homu@barosl.com>2016-04-15 05:34:49 +0900
committerHomu <homu@barosl.com>2016-04-15 05:34:49 +0900
commita93306067e347581fabc2dc0bf6fe224757302c4 (patch)
tree6d82f6bdf5dd59e0c276c497bba7d5de60d4e965
parent3a09448d8b060f2688dbc73bfa1eb08e1bd126f3 (diff)
parent762ddfaeb5e050112f5a78b30be4db1819d49670 (diff)
downloadbundler-a93306067e347581fabc2dc0bf6fe224757302c4.tar.gz
Auto merge of #4439 - RochesterinNYC:fix-recursive-bundle-package-loop-with-multiple-gemspecs, r=segiddins
Handle recursive bundle package loop when multiple gemspecs present `root_gem_names` should contain the names of the gems that the gemspecs in the directory are correlated with. Gems are packaged unless they're called `bundler` or their names match with the gems specified in the gemspecs. - Handles multiple gemspecs in directory - Handles case where gemspec file name does not match with the gem name specified in the gemspec - Fixes #4430
-rw-r--r--lib/bundler/runtime.rb10
-rw-r--r--spec/commands/package_spec.rb45
2 files changed, 50 insertions, 5 deletions
diff --git a/lib/bundler/runtime.rb b/lib/bundler/runtime.rb
index d4a78370..a0abb750 100644
--- a/lib/bundler/runtime.rb
+++ b/lib/bundler/runtime.rb
@@ -127,16 +127,16 @@ module Bundler
Bundler.ui.info "Updating files in #{Bundler.settings.app_cache_path}"
- # Do not try to cache specification for the gem described by the .gemspec
- root_gem_name = nil
+ # Do not try to cache specification for the gem described any of the gemspecs
+ root_gem_names = nil
if gemspec_cache_hash = Bundler.instance_variable_get(:@gemspec_cache)
- gemspec = gemspec_cache_hash.values.first
- root_gem_name = gemspec.name unless gemspec.nil?
+ gemspecs = gemspec_cache_hash.values
+ root_gem_names = gemspecs.map(&:name)
end
specs.each do |spec|
next if spec.name == "bundler"
- next if !Dir.glob("*.gemspec").empty? && spec.source.class == Bundler::Source::Path && root_gem_name && spec.name == root_gem_name
+ next if !Dir.glob("*.gemspec").empty? && spec.source.class == Bundler::Source::Path && root_gem_names.include?(spec.name)
spec.source.send(:fetch_gem, spec) if Bundler.settings[:cache_all_platforms] && spec.source.respond_to?(:fetch_gem, true)
spec.source.cache(spec, custom_path) if spec.source.respond_to?(:cache)
end
diff --git a/spec/commands/package_spec.rb b/spec/commands/package_spec.rb
index 8cf6de4c..3e4b6029 100644
--- a/spec/commands/package_spec.rb
+++ b/spec/commands/package_spec.rb
@@ -95,6 +95,51 @@ describe "bundle package" do
end
end
end
+
+ context "with multiple gemspecs" do
+ before do
+ File.open(bundled_app("mygem.gemspec"), "w") do |f|
+ f.write <<-G
+ Gem::Specification.new do |s|
+ s.name = "mygem"
+ s.version = "0.1.1"
+ s.summary = ""
+ s.authors = ["gem author"]
+ s.add_development_dependency "nokogiri", "=1.4.2"
+ end
+ G
+ end
+ File.open(bundled_app("mygem_client.gemspec"), "w") do |f|
+ f.write <<-G
+ Gem::Specification.new do |s|
+ s.name = "mygem_test"
+ s.version = "0.1.1"
+ s.summary = ""
+ s.authors = ["gem author"]
+ s.add_development_dependency "weakling", "=0.0.3"
+ end
+ G
+ end
+ end
+
+ it "caches all dependencies except bundler and the gemspec specified gems" do
+ gemfile <<-D
+ source "file://#{gem_repo1}"
+ gem 'rack'
+ gemspec :name => 'mygem'
+ gemspec :name => 'mygem_client'
+ D
+
+ bundle! "package --all"
+
+ expect(bundled_app("vendor/cache/rack-1.0.0.gem")).to exist
+ expect(bundled_app("vendor/cache/nokogiri-1.4.2.gem")).to exist
+ expect(bundled_app("vendor/cache/weakling-0.0.3.gem")).to exist
+ expect(bundled_app("vendor/cache/mygem-0.1.1.gem")).to_not exist
+ expect(bundled_app("vendor/cache/mygem_test-0.1.1.gem")).to_not exist
+ expect(bundled_app("vendor/cache/bundler-0.9.gem")).to_not exist
+ end
+ end
end
context "with --path" do