summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchrismo <chrismo@clabs.org>2016-06-14 09:31:27 -0500
committerchrismo <chrismo@clabs.org>2016-07-08 19:35:57 -0500
commitc821411d5d3a843ad33aadb31c318d635a33564a (patch)
tree0a15531a329a337b2130569a2905d23623d63af8
parentb57b1df28b68a3b3de0246714ceffb2cc8b33a91 (diff)
downloadbundler-c821411d5d3a843ad33aadb31c318d635a33564a.tar.gz
UpdateOptions added and passed thru all_the_things
First shot adding new update CLI options and passing those through Definition into Resolver where they're needed. I opted for three separate options to reduce typing, vs. a --level [patch|minor|major]. It's a little painful merely extending parameter lists in places, but bigger refactorings prolly be more painful.
-rw-r--r--lib/bundler/cli.rb6
-rw-r--r--lib/bundler/cli/update.rb4
-rw-r--r--lib/bundler/definition.rb5
-rw-r--r--lib/bundler/resolver.rb23
-rw-r--r--spec/commands/update_spec.rb14
5 files changed, 34 insertions, 18 deletions
diff --git a/lib/bundler/cli.rb b/lib/bundler/cli.rb
index 03029e0967..3c1521bed1 100644
--- a/lib/bundler/cli.rb
+++ b/lib/bundler/cli.rb
@@ -208,6 +208,12 @@ module Bundler
"Update ruby specified in Gemfile.lock"
method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner =>
"Update the locked version of bundler"
+ method_option "patch", :type => :boolean, :banner =>
+ "Prefer updating only to next patch version"
+ method_option "minor", :type => :boolean, :banner =>
+ "Prefer updating only to next minor version"
+ method_option "major", :type => :boolean, :banner =>
+ "Prefer updating to next major version (default)"
def update(*gems)
require "bundler/cli/update"
Update.new(options, gems).run
diff --git a/lib/bundler/cli/update.rb b/lib/bundler/cli/update.rb
index 080d198f14..aae08a7366 100644
--- a/lib/bundler/cli/update.rb
+++ b/lib/bundler/cli/update.rb
@@ -3,7 +3,7 @@ module Bundler
class CLI::Update
attr_reader :options, :gems
def initialize(options, gems)
- @options = options.tap {|o|p o}
+ @options = options
@gems = gems
end
@@ -39,6 +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) }
+
Bundler::Fetcher.disable_endpoint = options["full-index"]
opts = options.dup
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
index 7932d2d7e2..8891f855f0 100644
--- a/lib/bundler/definition.rb
+++ b/lib/bundler/definition.rb
@@ -7,7 +7,7 @@ module Bundler
class Definition
include GemHelpers
- attr_reader :dependencies, :platforms, :ruby_version, :locked_deps
+ attr_reader :dependencies, :platforms, :ruby_version, :locked_deps, :update_opts
# Given a gemfile and lockfile creates a Bundler definition
#
@@ -57,6 +57,7 @@ module Bundler
@lockfile_contents = String.new
@locked_bundler_version = nil
@locked_ruby_version = nil
+ @update_opts = Resolver::UpdateOptions.new
if lockfile && File.exist?(lockfile)
@lockfile_contents = Bundler.read_file(lockfile)
@@ -221,7 +222,7 @@ module Bundler
else
# Run a resolve against the locally available gems
Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
- last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, ruby_version)
+ last_resolve.merge Resolver.resolve(expanded_dependencies, index, source_requirements, last_resolve, ruby_version, update_opts)
end
end
end
diff --git a/lib/bundler/resolver.rb b/lib/bundler/resolver.rb
index 54b8fa4222..2bfbfcc5c7 100644
--- a/lib/bundler/resolver.rb
+++ b/lib/bundler/resolver.rb
@@ -172,14 +172,14 @@ module Bundler
# ==== Returns
# <GemBundle>,nil:: If the list of dependencies can be resolved, a
# collection of gemspecs is returned. Otherwise, nil is returned.
- def self.resolve(requirements, index, source_requirements = {}, base = [], ruby_version = nil)
+ def self.resolve(requirements, index, source_requirements = {}, base = [], ruby_version = nil, update_opts = UpdateOptions.new)
base = SpecSet.new(base) unless base.is_a?(SpecSet)
- resolver = new(index, source_requirements, base, ruby_version)
+ resolver = new(index, source_requirements, base, ruby_version, update_opts)
result = resolver.start(requirements)
SpecSet.new(result)
end
- def initialize(index, source_requirements, base, ruby_version)
+ def initialize(index, source_requirements, base, ruby_version, update_opts = UpdateOptions.new)
@index = index
@source_requirements = source_requirements
@base = base
@@ -188,6 +188,7 @@ module Bundler
@base_dg = Molinillo::DependencyGraph.new
@base.each {|ls| @base_dg.add_vertex(ls.name, Dependency.new(ls.name, ls.version), true) }
@ruby_version = ruby_version
+ @update_opts = update_opts
end
def start(requirements)
@@ -364,5 +365,21 @@ module Bundler
end
version_platform_strs.join(", ")
end
+
+ class UpdateOptions
+ attr_accessor :level, :strict, :minimal
+
+ def initialize
+ @level_default = :major
+ @level = @level_default
+ @strict = false
+ @minimal = false
+ end
+
+ def level=(value)
+ v = value.to_sym rescue nil
+ @level = [:major, :minor, :patch].include?(v) ? v : @level_default
+ end
+ end
end
end
diff --git a/spec/commands/update_spec.rb b/spec/commands/update_spec.rb
index 631eddbe2e..566aaaa5f6 100644
--- a/spec/commands/update_spec.rb
+++ b/spec/commands/update_spec.rb
@@ -443,18 +443,8 @@ describe "bundle update conservative" do
gem 'foo'
G
- # bundle "update --patch_preferred" # preferred is a bit lengthy
- # bundle "update --patch"
- require_relative '../../lib/bundler/cli'
- require_relative '../../lib/bundler/cli/update'
- #Bundler::CLI::Update.new({patch: true}, [])
- # Bundler.with_clean_env do
- # ENV['BUNDLE_GEMFILE'] = bundled_app.to_s
- # Bundler::CLI::Update.new({}, [])
- # end
- bundle 'update'
-
- # switch i guess is recognized as a gem name, so no update at all occurs
+ bundle "update --patch"
+
should_be_installed "foo 1.0.1"
end
end