diff options
-rw-r--r-- | lib/bundler/cli/update.rb | 3 | ||||
-rw-r--r-- | lib/bundler/definition.rb | 4 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 27 | ||||
-rw-r--r-- | spec/commands/update_spec.rb | 2 |
4 files changed, 18 insertions, 18 deletions
diff --git a/lib/bundler/cli/update.rb b/lib/bundler/cli/update.rb index aae08a73..5e2d6b33 100644 --- a/lib/bundler/cli/update.rb +++ b/lib/bundler/cli/update.rb @@ -39,7 +39,8 @@ module Bundler Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby]) end - Bundler.definition.update_opts.level = [:major, :minor, :patch].detect { |v| options.keys.include?(v) } + patch_level = [:major, :minor, :patch].detect { |v| options.keys.include?(v.to_s) } + Bundler.definition.update_opts.level = patch_level Bundler::Fetcher.disable_endpoint = options["full-index"] diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb index f5c31ada..d1ed4e0a 100644 --- a/lib/bundler/definition.rb +++ b/lib/bundler/definition.rb @@ -83,8 +83,6 @@ module Bundler @locked_sources = [] end - @update_opts = Resolver::UpdateOptions.new(@locked_specs) - @unlock[:gems] ||= [] @unlock[:sources] ||= [] @unlock[:ruby] ||= if @ruby_version && @locked_ruby_version @@ -96,6 +94,8 @@ module Bundler end @unlocking ||= @unlock[:ruby] ||= (!@locked_ruby_version ^ !@ruby_version) + @update_opts = Resolver::UpdateOptions.new(@locked_specs, @unlock[:gems]) + current_platform = Bundler.rubygems.platforms.map {|p| generic(p) }.compact.last add_platform(current_platform) diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb index 79611401..08d4fd04 100644 --- a/lib/bundler/resolver.rb +++ b/lib/bundler/resolver.rb @@ -372,12 +372,17 @@ module Bundler class UpdateOptions attr_accessor :level, :strict, :minimal - def initialize(locked_specs) + def initialize(locked_specs=SpecSet.new([]), unlock_gems=[]) @level_default = :major @level = @level_default @strict = false @minimal = false @locked_specs = locked_specs + @unlock_gems = unlock_gems + end + + def unlocking_gem?(gem_name) + @unlock_gems.empty? || @unlock_gems.include?(gem_name) end def level=(value) @@ -414,7 +419,7 @@ module Bundler def debug_format_result(dep, res) a = [dep.to_s, res.map { |sg| [sg.version, sg.dependencies_for_activated_platforms.map { |dp| [dp.name, dp.requirement.to_s] }] }] - [a.first, a.last.map { |sg_data| [sg_data.first.version, sg_data.last.map { |aa| aa.join(' ') }] }] + [a.first, a.last.map { |sg_data| [sg_data.first.version, sg_data.last.map { |aa| aa.join(' ') }] }, @level] end def filter_dep_specs(specs, locked_spec) @@ -440,6 +445,8 @@ module Bundler end # reminder: sort still filters anything older than locked version + # :major bundle update behavior can move a gem to an older version + # in order to satisfy the dependency tree. def sort_dep_specs(specs, locked_spec) return specs unless locked_spec gem_name = locked_spec.name @@ -450,29 +457,21 @@ module Bundler filtered.sort do |a, b| a_ver = a.first.version b_ver = b.first.version - gem_patch = @gems_to_update.gem_patch_for(gem_name) - new_version = gem_patch ? gem_patch.new_version : nil case when a_ver.segments[0] != b_ver.segments[0] b_ver <=> a_ver when !@level == :minor && (a_ver.segments[1] != b_ver.segments[1]) b_ver <=> a_ver - when @minimal && !@gems_to_update.unlocking_gem?(gem_name) + when @minimal && !unlocking_gem?(gem_name) b_ver <=> a_ver - when @minimal && @gems_to_update.unlocking_gem?(gem_name) && - (![a_ver, b_ver].include?(locked_version) && - (!new_version || (new_version && a_ver >= new_version && b_ver >= new_version))) + when @minimal && unlocking_gem?(gem_name) && + (![a_ver, b_ver].include?(locked_version)) # MODO: revisit this case b_ver <=> a_ver else a_ver <=> b_ver end end.tap do |result| - if @gems_to_update.unlocking_gem?(gem_name) - gem_patch = @gems_to_update.gem_patch_for(gem_name) - if gem_patch && gem_patch.new_version && @minimal - move_version_to_end(specs, gem_patch.new_version, result) - end - else + unless unlocking_gem?(gem_name) move_version_to_end(specs, locked_version, result) end end diff --git a/spec/commands/update_spec.rb b/spec/commands/update_spec.rb index 566aaaa5..303f58ba 100644 --- a/spec/commands/update_spec.rb +++ b/spec/commands/update_spec.rb @@ -443,7 +443,7 @@ describe "bundle update conservative" do gem 'foo' G - bundle "update --patch" + bundle "update --patch foo", {:env => {'DEBUG_PATCH_RESOLVER' => true}} should_be_installed "foo 1.0.1" end |