diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index da180ce255..1bb26b6878 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -143,7 +143,7 @@ module Bundler @dependency_changes = converge_dependencies @local_changes = converge_locals - @locked_specs_incomplete_for_platform = !@locked_specs.for(expand_dependencies(requested_dependencies & locked_dependencies), true, true) + @locked_specs_incomplete_for_platform = !@locked_specs.for(requested_dependencies & expand_dependencies(locked_dependencies), true, true) @requires = compute_requires end @@ -239,16 +239,17 @@ module Bundler end def specs_for(groups) - groups = requested_groups if groups.empty? + return specs if groups.empty? deps = dependencies_for(groups) - materialize(expand_dependencies(deps)) + materialize(deps) end def dependencies_for(groups) groups.map!(&:to_sym) - current_dependencies.reject do |d| + deps = current_dependencies.reject do |d| (d.groups & groups).empty? end + expand_dependencies(deps) end # Resolve all the dependencies specified in Gemfile. It ensures that diff --git a/spec/bundler/runtime/setup_spec.rb b/spec/bundler/runtime/setup_spec.rb index b35b7a233c..3cf373fe1c 100644 --- a/spec/bundler/runtime/setup_spec.rb +++ b/spec/bundler/runtime/setup_spec.rb @@ -1468,5 +1468,21 @@ end expect(last_command.stdboth).to eq("true") end + + it "memoizes initial set of specs when requiring bundler/setup, so that even if further code mutates dependencies, Bundler.definition.specs is not affected" do + install_gemfile <<~G + source "#{file_uri_for(gem_repo1)}" + gem "yard" + gem "rack", :group => :test + G + + ruby <<-RUBY, :raise_on_error => false + require "bundler/setup" + Bundler.require(:test).select! {|d| (d.groups & [:test]).any? } + puts Bundler.definition.specs.map(&:name).join(", ") + RUBY + + expect(out).to include("rack, yard") + end end end