summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Hull <joshbuddy@gmail.com>2010-08-04 17:32:34 -0700
committerJoshua Hull <joshbuddy@gmail.com>2010-08-04 17:32:34 -0700
commit93e19e22d9c87e847566f2f4ffb314b10cdb6fe1 (patch)
tree9d974d997ad9917871e9dc731e242acc42d543d3
parent3a5cf4b5c23094a0a09babf7418aa31441d06c55 (diff)
parent0d52ee6026b134ae9c667bc6332cef7cffee3f23 (diff)
downloadbundler-93e19e22d9c87e847566f2f4ffb314b10cdb6fe1.tar.gz
Merge branch 'master' of github.com:carlhuda/bundler
-rw-r--r--lib/bundler/definition.rb36
-rw-r--r--spec/other/gem_helper_spec.rb2
-rw-r--r--spec/update/gems_spec.rb24
3 files changed, 49 insertions, 13 deletions
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 9c91c8e963..84ec246170 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -34,8 +34,8 @@ module Bundler
def initialize(lockfile, dependencies, sources, unlock)
@dependencies, @sources, @unlock = dependencies, sources, unlock
- @remote = false
- @specs = nil
+ @remote = false
+ @specs = nil
@lockfile_contents = ""
if lockfile && File.exists?(lockfile)
@@ -45,19 +45,19 @@ module Bundler
if unlock != true
@locked_deps = locked.dependencies
- @last_resolve = SpecSet.new(locked.specs)
+ @locked_specs = SpecSet.new(locked.specs)
@locked_sources = locked.sources
else
@unlock = {}
@locked_deps = []
- @last_resolve = SpecSet.new([])
+ @locked_specs = SpecSet.new([])
@locked_sources = []
end
else
@unlock = {}
@platforms = []
@locked_deps = []
- @last_resolve = SpecSet.new([])
+ @locked_specs = SpecSet.new([])
@locked_sources = []
end
@@ -70,6 +70,9 @@ module Bundler
ensure_equivalent_gemfile_and_lockfile if Bundler.deployment
+ eager_unlock = expand_dependencies(@unlock[:gems])
+ @unlock[:gems] = @locked_specs.for(eager_unlock).map { |s| s.name }
+
converge_sources
converge_dependencies
end
@@ -100,6 +103,14 @@ module Bundler
end
end
+ def new_specs
+ specs - @locked_specs
+ end
+
+ def removed_specs
+ @locked_specs - specs
+ end
+
def new_platform?
@new_platform
end
@@ -130,7 +141,7 @@ module Bundler
def resolve
@resolve ||= begin
- converge_locked_specs
+ last_resolve = converge_locked_specs
source_requirements = {}
dependencies.each do |dep|
next unless dep.source
@@ -138,7 +149,7 @@ module Bundler
end
# Run a resolve against the locally available gems
- @last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, @last_resolve)
+ last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve)
end
end
@@ -304,7 +315,7 @@ module Bundler
if in_locked_deps?(dep, locked_dep) || satisfies_locked_spec?(dep)
deps << dep
elsif dep.source.is_a?(Source::Path) && (!locked_dep || dep.source != locked_dep.source)
- @last_resolve.each do |s|
+ @locked_specs.each do |s|
@unlock[:gems] << s.name if s.source == dep.source
end
@@ -314,7 +325,7 @@ module Bundler
end
converged = []
- @last_resolve.each do |s|
+ @locked_specs.each do |s|
s.source = @sources.find { |src| s.source == src }
# Don't add a spec to the list if its source is expired. For example,
@@ -339,7 +350,7 @@ module Bundler
resolve = SpecSet.new(converged)
resolve = resolve.for(expand_dependencies(deps, true), @unlock[:gems])
- diff = @last_resolve.to_a - resolve.to_a
+ diff = @locked_specs.to_a - resolve.to_a
# Now, we unlock any sources that do not have anymore gems pinned to it
@sources.each do |source|
@@ -350,7 +361,7 @@ module Bundler
end
end
- @last_resolve = resolve
+ resolve
end
def in_locked_deps?(dep, d)
@@ -358,7 +369,7 @@ module Bundler
end
def satisfies_locked_spec?(dep)
- @last_resolve.any? { |s| s.satisfies?(dep) && (!dep.source || s.source == dep.source) }
+ @locked_specs.any? { |s| s.satisfies?(dep) && (!dep.source || s.source == dep.source) }
end
def expanded_dependencies
@@ -368,6 +379,7 @@ module Bundler
def expand_dependencies(dependencies, remote = false)
deps = []
dependencies.each do |dep|
+ dep = Dependency.new(dep, ">= 0") unless dep.respond_to?(:name)
dep.gem_platforms(@platforms).each do |p|
deps << DepProxy.new(dep, p) if remote || p == generic(Gem::Platform.local)
end
diff --git a/spec/other/gem_helper_spec.rb b/spec/other/gem_helper_spec.rb
index 733d6f6df9..b377424b71 100644
--- a/spec/other/gem_helper_spec.rb
+++ b/spec/other/gem_helper_spec.rb
@@ -58,4 +58,4 @@ describe "Bundler::GemHelper tasks" do
@helper.push_gem
end
end
-end \ No newline at end of file
+end
diff --git a/spec/update/gems_spec.rb b/spec/update/gems_spec.rb
index 5233881342..969b6ec945 100644
--- a/spec/update/gems_spec.rb
+++ b/spec/update/gems_spec.rb
@@ -45,6 +45,30 @@ describe "bundle update" do
end
end
+describe "bundle update in more complicated situations" do
+ before :each do
+ build_repo2
+ end
+
+ it "will eagerly unlock dependencies of a specified gem" do
+ install_gemfile <<-G
+ source "file://#{gem_repo2}"
+
+ gem "thin"
+ gem "rack-obama"
+ G
+
+ update_repo2 do
+ build_gem "thin" , '2.0' do |s|
+ s.add_dependency "rack"
+ end
+ end
+
+ bundle "update thin"
+ should_be_installed "thin 2.0", "rack 1.2", "rack-obama 1.0"
+ end
+end
+
describe "bundle update without a Gemfile.lock" do
it "should not explode" do
build_repo2