From 338357dcec93a26e8b499b5413bbe4b9e997bf43 Mon Sep 17 00:00:00 2001 From: Kohei Suzuki Date: Fri, 10 Jan 2014 16:51:29 +0900 Subject: [PATCH] Fix #2813: Ignore self dependency --- lib/bundler/installer.rb | 12 ++++++++---- spec/realworld/parallel_install_spec.rb | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/bundler/installer.rb b/lib/bundler/installer.rb index b6a2a06a73e..b6a201fb790 100644 --- a/lib/bundler/installer.rb +++ b/lib/bundler/installer.rb @@ -285,8 +285,7 @@ def install_in_parallel(size, standalone) { :name => spec.name, :post_install => message } } specs.each do |spec| - deps = spec.dependencies.select { |dep| dep.type != :development } - if deps.empty? + if ready_to_install?(spec, remains) worker_pool.enq spec.name enqueued[spec.name] = true end @@ -301,8 +300,7 @@ def install_in_parallel(size, standalone) remains.keys.each do |name| next if enqueued[name] spec = name2spec[name] - deps = spec.dependencies.select { |dep| remains[dep.name] and dep.type != :development } - if deps.empty? + if ready_to_install?(spec, remains) worker_pool.enq name enqueued[name] = true end @@ -312,5 +310,11 @@ def install_in_parallel(size, standalone) ensure worker_pool && worker_pool.stop end + + def ready_to_install?(spec, remains) + spec.dependencies.none? do |dep| + remains[dep.name] && dep.type != :development && dep.name != spec.name + end + end end end diff --git a/spec/realworld/parallel_install_spec.rb b/spec/realworld/parallel_install_spec.rb index ca92ca016b6..a1b9bce5ac7 100644 --- a/spec/realworld/parallel_install_spec.rb +++ b/spec/realworld/parallel_install_spec.rb @@ -12,7 +12,7 @@ (0..1).each {|i| expect(out).to include("#{i}: ") } bundle "show activesupport" - expect(out).to match(/activesupport/) + expect(out).to match(%r{gems/activesupport}) bundle "show faker" expect(out).to match(/faker/) @@ -20,4 +20,17 @@ bundle "config jobs" expect(out).to match(/: "2"/) end + + it 'installs even with circular dependency' do + gemfile <<-G + source 'https://rubygems.org' + gem 'mongoid_auto_increment', "0.1.1" + G + + bundle :install, :jobs => 2, :env => {"DEBUG" => "1"} + (0..1).each {|i| expect(out).to include("#{i}: ") } + + bundle "show mongoid_auto_increment" + expect(out).to match(%r{gems/mongoid_auto_increment}) + end end