summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-08-18 11:35:03 -0700
committerYehuda Katz + Carl Lerche <ykatz+clerche@engineyard.com>2009-08-18 11:35:03 -0700
commitd739dbcf06c0129cf89d92dd6e4df3415ce43238 (patch)
tree3d2136db59bd151ce36d90d331a54b819c7dbb8d
parented2cfc68ee3d99784d937f476390609af9fdf25c (diff)
downloadbundler-d739dbcf06c0129cf89d92dd6e4df3415ce43238.tar.gz
Add error messages when gems are missing during resolve time
-rw-r--r--lib/bundler/cli.rb3
-rw-r--r--lib/bundler/resolver.rb8
-rw-r--r--spec/bundler/cli_spec.rb26
-rw-r--r--spec/bundler/manifest_spec.rb1
-rw-r--r--spec/resolver/engine_spec.rb2
5 files changed, 39 insertions, 1 deletions
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb
index 8208e64177..f5cd16dcf9 100644
--- a/lib/bundler/cli.rb
+++ b/lib/bundler/cli.rb
@@ -16,6 +16,9 @@ module Bundler
rescue VersionConflict => e
Bundler.logger.error e.message
exit
+ rescue GemNotFound => e
+ Bundler.logger.error e.message
+ exit
end
def initialize(options)
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index 309e4ac00d..bbc2ad9017 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -19,6 +19,7 @@ module Gem
end
module Bundler
+ class GemNotFound < StandardError; end
class Resolver
@@ -100,6 +101,13 @@ module Bundler
# TODO: Warn / error when no matching versions are found.
matching_versions = @index.search(current)
+ if matching_versions.empty?
+ if current.required_by.empty?
+ raise GemNotFound, "Could not find gem '#{current}' in any of the sources"
+ end
+ Bundler.logger.warn "Could not find gem '#{current}' (required by '#{current.required_by.last}') in any of the sources"
+ end
+
matching_versions.reverse_each do |spec|
conflict = resolve_requirement(spec, current, reqs.dup, activated.dup)
conflicts << conflict if conflict
diff --git a/spec/bundler/cli_spec.rb b/spec/bundler/cli_spec.rb
index 104d3ed701..2f486729ca 100644
--- a/spec/bundler/cli_spec.rb
+++ b/spec/bundler/cli_spec.rb
@@ -80,10 +80,36 @@ describe "Bundler::CLI" do
end
describe "error cases" do
+ before(:each) do
+ Dir.chdir(tmp_dir)
+ end
+
it "displays a friendly error message when there is no Gemfile" do
out = gem_command :bundle
out.should == "Could not find a Gemfile to use"
end
+
+ it "fails when a root level gem does not exist" do
+ build_manifest <<-Gemfile
+ clear_sources
+ source "file://#{gem_repo1}"
+ gem "monk"
+ Gemfile
+
+ out = gem_command :bundle
+ out.should include("Could not find gem 'monk (>= 0, runtime)' in any of the sources")
+ end
+
+ it "outputs a warning when a child gem dependency is missing dependencies" do
+ build_manifest <<-Gemfile
+ clear_sources
+ source "file://#{gem_repo1}"
+ gem "treetop"
+ Gemfile
+
+ out = gem_command :bundle
+ out.should include("Could not find gem 'polyglot (>= 0.2.5, runtime)' (required by 'treetop (>= 0, runtime)') in any of the sources")
+ end
end
describe "it working while specifying the manifest file name" do
diff --git a/spec/bundler/manifest_spec.rb b/spec/bundler/manifest_spec.rb
index b94fab04c2..0ae6205e10 100644
--- a/spec/bundler/manifest_spec.rb
+++ b/spec/bundler/manifest_spec.rb
@@ -116,6 +116,7 @@ describe "Bundler::Manifest" do
end
it "raises a friendly exception if the manifest doesn't resolve" do
+ pending
build_manifest <<-Gemfile
clear_sources
source "file://#{gem_repo1}"
diff --git a/spec/resolver/engine_spec.rb b/spec/resolver/engine_spec.rb
index e7d0f1953e..f66e97dfe5 100644
--- a/spec/resolver/engine_spec.rb
+++ b/spec/resolver/engine_spec.rb
@@ -115,6 +115,6 @@ describe "Resolving specs" do
build_dep("a", "= 1.1"),
]
- Bundler::Resolver.resolve(deps, index).should be_nil
+ lambda { Bundler::Resolver.resolve(deps, index) }.should raise_error(Bundler::GemNotFound)
end
end