aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/bundler/cli/update.rb3
-rw-r--r--lib/bundler/definition.rb4
-rw-r--r--lib/bundler/resolver.rb27
-rw-r--r--spec/commands/update_spec.rb2
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