diff options
author | chrismo <chrismo@clabs.org> | 2016-06-14 09:31:27 -0500 |
---|---|---|
committer | chrismo <chrismo@clabs.org> | 2016-07-08 19:35:57 -0500 |
commit | c821411d5d3a843ad33aadb31c318d635a33564a (patch) | |
tree | 0a15531a329a337b2130569a2905d23623d63af8 | |
parent | b57b1df28b68a3b3de0246714ceffb2cc8b33a91 (diff) | |
download | bundler-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.rb | 6 | ||||
-rw-r--r-- | lib/bundler/cli/update.rb | 4 | ||||
-rw-r--r-- | lib/bundler/definition.rb | 5 | ||||
-rw-r--r-- | lib/bundler/resolver.rb | 23 | ||||
-rw-r--r-- | spec/commands/update_spec.rb | 14 |
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 |