diff options
author | Joshua Hull <joshbuddy@gmail.com> | 2010-08-04 17:32:34 -0700 |
---|---|---|
committer | Joshua Hull <joshbuddy@gmail.com> | 2010-08-04 17:32:34 -0700 |
commit | 93e19e22d9c87e847566f2f4ffb314b10cdb6fe1 (patch) | |
tree | 9d974d997ad9917871e9dc731e242acc42d543d3 | |
parent | 3a5cf4b5c23094a0a09babf7418aa31441d06c55 (diff) | |
parent | 0d52ee6026b134ae9c667bc6332cef7cffee3f23 (diff) | |
download | bundler-93e19e22d9c87e847566f2f4ffb314b10cdb6fe1.tar.gz |
Merge branch 'master' of github.com:carlhuda/bundler
-rw-r--r-- | lib/bundler/definition.rb | 36 | ||||
-rw-r--r-- | spec/other/gem_helper_spec.rb | 2 | ||||
-rw-r--r-- | spec/update/gems_spec.rb | 24 |
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 |