summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHemant Kumar <gethemant@gmail.com>2013-07-26 00:43:15 +0530
committerHemant Kumar <gethemant@gmail.com>2013-07-26 00:43:15 +0530
commitff269383b8572e9403a522a66e4be0837636f8ae (patch)
tree5e09b93451451c3fc14c099ac909e0a981d8feff
parent1a493004fd0646d53633eadcb02de17b206289b9 (diff)
downloadbundler-ff269383b8572e9403a522a66e4be0837636f8ae.tar.gz
Raise user friendly errors in case of Cyclic Dependency
Fixes #2506
-rw-r--r--lib/bundler.rb31
-rw-r--r--lib/bundler/spec_set.rb7
-rw-r--r--spec/resolver/basic_spec.rb10
-rw-r--r--spec/support/indexes.rb17
4 files changed, 49 insertions, 16 deletions
diff --git a/lib/bundler.rb b/lib/bundler.rb
index ea5673a32a..b0cf21a49d 100644
--- a/lib/bundler.rb
+++ b/lib/bundler.rb
@@ -50,21 +50,22 @@ module Bundler
end
end
- class GemfileNotFound < BundlerError; status_code(10) ; end
- class GemNotFound < BundlerError; status_code(7) ; end
- class GemfileError < BundlerError; status_code(4) ; end
- class InstallError < BundlerError; status_code(5) ; end
- class InstallHookError < BundlerError; status_code(6) ; end
- class PathError < BundlerError; status_code(13) ; end
- class GitError < BundlerError; status_code(11) ; end
- class DeprecatedError < BundlerError; status_code(12) ; end
- class GemspecError < BundlerError; status_code(14) ; end
- class InvalidOption < BundlerError; status_code(15) ; end
- class ProductionError < BundlerError; status_code(16) ; end
- class HTTPError < BundlerError; status_code(17) ; end
- class RubyVersionMismatch < BundlerError; status_code(18) ; end
- class SecurityError < BundlerError; status_code(19) ; end
- class LockfileError < BundlerError; status_code(20) ; end
+ class GemfileNotFound < BundlerError; status_code(10) ; end
+ class GemNotFound < BundlerError; status_code(7) ; end
+ class GemfileError < BundlerError; status_code(4) ; end
+ class InstallError < BundlerError; status_code(5) ; end
+ class InstallHookError < BundlerError; status_code(6) ; end
+ class PathError < BundlerError; status_code(13) ; end
+ class GitError < BundlerError; status_code(11) ; end
+ class DeprecatedError < BundlerError; status_code(12) ; end
+ class GemspecError < BundlerError; status_code(14) ; end
+ class InvalidOption < BundlerError; status_code(15) ; end
+ class ProductionError < BundlerError; status_code(16) ; end
+ class HTTPError < BundlerError; status_code(17) ; end
+ class RubyVersionMismatch < BundlerError; status_code(18) ; end
+ class SecurityError < BundlerError; status_code(19) ; end
+ class LockfileError < BundlerError; status_code(20) ; end
+ class CyclicDependencyError < BundlerError; status_code(21) ; end
# Internal errors, should be rescued
class VersionConflict < BundlerError
diff --git a/lib/bundler/spec_set.rb b/lib/bundler/spec_set.rb
index 2cdffdc83f..202993e441 100644
--- a/lib/bundler/spec_set.rb
+++ b/lib/bundler/spec_set.rb
@@ -109,7 +109,12 @@ module Bundler
def sorted
rake = @specs.find { |s| s.name == 'rake' }
- @sorted ||= ([rake] + tsort).compact.uniq
+ begin
+ @sorted ||= ([rake] + tsort).compact.uniq
+ rescue TSort::Cyclic
+ raise CyclicDependencyError.new("Bundler has detected cyclic dependencies and can't" +
+ " proceed, update your Gemfile by removing cyclic dependency and rerun bundler.")
+ end
end
def lookup
diff --git a/spec/resolver/basic_spec.rb b/spec/resolver/basic_spec.rb
index d675f4435f..ce72eead87 100644
--- a/spec/resolver/basic_spec.rb
+++ b/spec/resolver/basic_spec.rb
@@ -23,4 +23,14 @@ describe "Resolving" do
dep "my_app"
should_resolve_as %w(activemodel-3.2.11 builder-3.0.4 grape-0.2.6 my_app-1.0.0)
end
+
+ it "should throw error in case of circular dependencies" do
+ @index = a_circular_index
+ dep "circular_app"
+
+ got = resolve
+ expect {
+ got = got.map { |s| s.full_name }.sort
+ }.to raise_error(Bundler::CyclicDependencyError)
+ end
end
diff --git a/spec/support/indexes.rb b/spec/support/indexes.rb
index 2ca67a637a..d49f576768 100644
--- a/spec/support/indexes.rb
+++ b/spec/support/indexes.rb
@@ -130,5 +130,22 @@ module Spec
end
end
end
+
+ def a_circular_index
+ build_index do
+ gem("foo", '0.2.6') do
+ dep "bar", ">= 0"
+ end
+
+ gem("bar", "1.0.0") do
+ dep "foo", ">= 0"
+ end
+
+ gem("circular_app", '1.0.0') do
+ dep "foo", ">= 0"
+ dep "bar", ">= 0"
+ end
+ end
+ end
end
end