class Bundler::CLI

Constants

AUTO_INSTALL_CMDS
PARSEABLE_COMMANDS

Public Class Methods

deprecated_option(*args, &blk) click to toggle source
# File lib/bundler/cli.rb, line 64
def self.deprecated_option(*args, &blk)
  return if Bundler.feature_flag.forget_cli_options?
  method_option(*args, &blk)
end
dispatch(*) click to toggle source
Calls superclass method
# File lib/bundler/cli.rb, line 26
def self.dispatch(*)
  super do |i|
    i.send(:print_command)
    i.send(:warn_on_outdated_bundler)
  end
end
handle_no_command_error(command, has_namespace = $thor_runner) click to toggle source
Calls superclass method
# File lib/bundler/cli.rb, line 129
def self.handle_no_command_error(command, has_namespace = $thor_runner)
  if Bundler.feature_flag.plugins? && Bundler::Plugin.command?(command)
    return Bundler::Plugin.exec_command(command, ARGV[1..-1])
  end

  return super unless command_path = Bundler.which("bundler-#{command}")

  Kernel.exec(command_path, *ARGV[1..-1])
end
new(*args) click to toggle source
Calls superclass method Bundler::Thor::Actions::new
# File lib/bundler/cli.rb, line 33
def initialize(*args)
  super

  custom_gemfile = options[:gemfile] || Bundler.settings[:gemfile]
  if custom_gemfile && !custom_gemfile.empty?
    Bundler::SharedHelpers.set_env "BUNDLE_GEMFILE", File.expand_path(custom_gemfile)
    Bundler.reset_paths!
  end

  Bundler.settings.set_command_option_if_given :retry, options[:retry]

  current_cmd = args.last[:current_command].name
  auto_install if AUTO_INSTALL_CMDS.include?(current_cmd)
rescue UnknownArgumentError => e
  raise InvalidOption, e.message
ensure
  self.options ||= {}
  unprinted_warnings = Bundler.ui.unprinted_warnings
  Bundler.ui = UI::Shell.new(options)
  Bundler.ui.level = "debug" if options["verbose"]
  unprinted_warnings.each {|w| Bundler.ui.warn(w) }

  if ENV["RUBYGEMS_GEMDEPS"] && !ENV["RUBYGEMS_GEMDEPS"].empty?
    Bundler.ui.warn(
      "The RUBYGEMS_GEMDEPS environment variable is set. This enables RubyGems' " \
      "experimental Gemfile mode, which may conflict with Bundler and cause unexpected errors. " \
      "To remove this warning, unset RUBYGEMS_GEMDEPS.", :wrap => true
    )
  end
end
reformatted_help_args(args) click to toggle source

Reformat the arguments passed to bundle that include a –help flag into the corresponding `bundle help #{command}` call

# File lib/bundler/cli.rb, line 691
def self.reformatted_help_args(args)
  bundler_commands = all_commands.keys
  help_flags = %w[--help -h]
  exec_commands = %w[e ex exe exec]
  help_used = args.index {|a| help_flags.include? a }
  exec_used = args.index {|a| exec_commands.include? a }
  command = args.find {|a| bundler_commands.include? a }
  if exec_used && help_used
    if exec_used + help_used == 1
      %w[help exec]
    else
      args
    end
  elsif help_used
    args = args.dup
    args.delete_at(help_used)
    ["help", command || args].flatten.compact
  else
    args
  end
end
source_root() click to toggle source
# File lib/bundler/cli.rb, line 583
def self.source_root
  File.expand_path(File.join(File.dirname(__FILE__), "templates"))
end
start(*) click to toggle source
Calls superclass method
# File lib/bundler/cli.rb, line 17
def self.start(*)
  super
rescue Exception => e
  Bundler.ui = UI::Shell.new
  raise e
ensure
  Bundler::SharedHelpers.print_major_deprecations!
end

Public Instance Methods

add(*gems) click to toggle source
# File lib/bundler/cli.rb, line 368
def add(*gems)
  require "bundler/cli/add"
  Add.new(options.dup, gems).run
end
binstubs(*gems) click to toggle source
# File lib/bundler/cli.rb, line 352
def binstubs(*gems)
  require "bundler/cli/binstubs"
  Binstubs.new(options, gems).run
end
cache() click to toggle source
# File lib/bundler/cli.rb, line 418
def cache
  require "bundler/cli/cache"
  Cache.new(options).run
end
check() click to toggle source
# File lib/bundler/cli.rb, line 164
def check
  require "bundler/cli/check"
  Check.new(options).run
end
clean() click to toggle source
# File lib/bundler/cli.rb, line 592
def clean
  require "bundler/cli/clean"
  Clean.new(options.dup).run
end
cli_help() click to toggle source
# File lib/bundler/cli.rb, line 73
def cli_help
  version
  Bundler.ui.info "\n"

  primary_commands = ["install", "update",
                      Bundler.feature_flag.cache_command_is_package? ? "cache" : "package",
                      "exec", "config", "help"]

  list = self.class.printable_commands(true)
  by_name = list.group_by {|name, _message| name.match(/^bundle (\w+)/)[1] }
  utilities = by_name.keys.sort - primary_commands
  primary_commands.map! {|name| (by_name[name] || raise("no primary command #{name}")).first }
  utilities.map! {|name| by_name[name].first }

  shell.say "Bundler commands:\n\n"

  shell.say "  Primary commands:\n"
  shell.print_table(primary_commands, :indent => 4, :truncate => true)
  shell.say
  shell.say "  Utilities:\n"
  shell.print_table(utilities, :indent => 4, :truncate => true)
  shell.say
  self.class.send(:class_options_help, shell)
end
config(*args) click to toggle source
# File lib/bundler/cli.rb, line 479
def config(*args)
  require "bundler/cli/config"
  Config.new(options, args, self).run
end
console(group = nil) click to toggle source
# File lib/bundler/cli.rb, line 492
def console(group = nil)
  require "bundler/cli/console"
  Console.new(options, group).run
end
doctor() click to toggle source
# File lib/bundler/cli.rb, line 661
def doctor
  require "bundler/cli/doctor"
  Doctor.new(options).run
end
env() click to toggle source
# File lib/bundler/cli.rb, line 647
def env
  Env.write($stdout)
end
exec(*args) click to toggle source
# File lib/bundler/cli.rb, line 461
def exec(*args)
  require "bundler/cli/exec"
  Exec.new(options, args).run
end
help(cli = nil) click to toggle source
Calls superclass method
# File lib/bundler/cli.rb, line 104
def help(cli = nil)
  case cli
  when "gemfile" then command = "gemfile"
  when nil       then command = "bundle"
  else command = "bundle-#{cli}"
  end

  man_path  = File.expand_path("../../../man", __FILE__)
  man_pages = Hash[Dir.glob(File.join(man_path, "*")).grep(/.*\.\d*\Z/).collect do |f|
    [File.basename(f, ".*"), f]
  end]

  if man_pages.include?(command)
    if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+}
      Kernel.exec "man #{man_pages[command]}"
    else
      puts File.read("#{man_path}/#{File.basename(man_pages[command])}.txt")
    end
  elsif command_path = Bundler.which("bundler-#{cli}")
    Kernel.exec(command_path, "--help")
  else
    super
  end
end
info(gem_name) click to toggle source
# File lib/bundler/cli.rb, line 331
def info(gem_name)
  require "bundler/cli/info"
  Info.new(options, gem_name).run
end
init() click to toggle source
# File lib/bundler/cli.rb, line 146
def init
  require "bundler/cli/init"
  Init.new(options.dup).run
end
inject(name, version) click to toggle source
# File lib/bundler/cli.rb, line 610
def inject(name, version)
  SharedHelpers.major_deprecation 3, "The `inject` command has been replaced by the `add` command"
  require "bundler/cli/inject"
  Inject.new(options.dup, name, version).run
end
install() click to toggle source
# File lib/bundler/cli.rb, line 231
def install
  SharedHelpers.major_deprecation(3, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
  require "bundler/cli/install"
  Bundler.settings.temporary(:no_install => false) do
    Install.new(options.dup).run
  end
end
issue() click to toggle source
# File lib/bundler/cli.rb, line 667
def issue
  require "bundler/cli/issue"
  Issue.new.run
end
licenses() click to toggle source
# File lib/bundler/cli.rb, line 514
def licenses
  Bundler.load.specs.sort_by {|s| s.license.to_s }.reverse_each do |s|
    gem_name = s.name
    license  = s.license || s.licenses

    if license.empty?
      Bundler.ui.warn "#{gem_name}: Unknown"
    else
      Bundler.ui.info "#{gem_name}: #{license}"
    end
  end
end
list() click to toggle source
# File lib/bundler/cli.rb, line 319
def list
  require "bundler/cli/list"
  List.new(options).run
end
lock() click to toggle source
# File lib/bundler/cli.rb, line 641
def lock
  require "bundler/cli/lock"
  Lock.new(options).run
end
open(name) click to toggle source
# File lib/bundler/cli.rb, line 485
def open(name)
  require "bundler/cli/open"
  Open.new(options, name).run
end
outdated(*gems) click to toggle source
# File lib/bundler/cli.rb, line 403
def outdated(*gems)
  require "bundler/cli/outdated"
  Outdated.new(options, gems).run
end
package() click to toggle source
# File lib/bundler/cli.rb, line 446
def package
  require "bundler/cli/package"
  Package.new(options).run
end
platform() click to toggle source
# File lib/bundler/cli.rb, line 600
def platform
  require "bundler/cli/platform"
  Platform.new(options).run
end
pristine(*gems) click to toggle source
# File lib/bundler/cli.rb, line 678
def pristine(*gems)
  require "bundler/cli/pristine"
  Pristine.new(gems).run
end
remove(*gems) click to toggle source
# File lib/bundler/cli.rb, line 175
def remove(*gems)
  require "bundler/cli/remove"
  Remove.new(gems, options).run
end
show(gem_name = nil) click to toggle source
# File lib/bundler/cli.rb, line 292
def show(gem_name = nil)
  if ARGV[0] == "show"
    rest = ARGV[1..-1]

    new_command = rest.find {|arg| !arg.start_with?("--") } ? "info" : "list"

    new_arguments = rest.map do |arg|
      next arg if arg != "--paths"
      next "--path" if new_command == "info"
    end

    old_argv = ARGV.join(" ")
    new_argv = [new_command, *new_arguments.compact].join(" ")

    Bundler::SharedHelpers.major_deprecation(3, "use `bundle #{new_argv}` instead of `bundle #{old_argv}`")
  end
  require "bundler/cli/show"
  Show.new(options, gem_name).run
end
update(*gems) click to toggle source
# File lib/bundler/cli.rb, line 277
def update(*gems)
  SharedHelpers.major_deprecation(3, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
  require "bundler/cli/update"
  Update.new(options, gems).run
end
version() click to toggle source
# File lib/bundler/cli.rb, line 499
def version
  cli_help = current_command.name == "cli_help"
  if cli_help || ARGV.include?("version")
    build_info = " (#{BuildMetadata.built_at} commit #{BuildMetadata.git_commit_sha})"
  end

  if !cli_help && Bundler.feature_flag.print_only_version_number?
    Bundler.ui.info "#{Bundler::VERSION}#{build_info}"
  else
    Bundler.ui.info "Bundler version #{Bundler::VERSION}#{build_info}"
  end
end
viz() click to toggle source
# File lib/bundler/cli.rb, line 539
def viz
  SharedHelpers.major_deprecation 3, "The `viz` command has been moved to the `bundle-viz` gem, see https://github.com/bundler/bundler-viz"
  require "bundler/cli/viz"
  Viz.new(options.dup).run
end

Private Instance Methods

auto_install() click to toggle source

Automatically invoke `bundle install` and resume if Bundler.settings exists. This is set through config cmd `bundle config auto_install 1`.

Note that this method `nil`s out the global Definition object, so it should be called first, before you instantiate anything like an `Installer` that'll keep a reference to the old one instead.

# File lib/bundler/cli.rb, line 722
def auto_install
  return unless Bundler.settings[:auto_install]

  begin
    Bundler.definition.specs
  rescue GemNotFound
    Bundler.ui.info "Automatically installing missing gems."
    Bundler.reset!
    invoke :install, []
    Bundler.reset!
  end
end
current_command() click to toggle source
# File lib/bundler/cli.rb, line 735
def current_command
  _, _, config = @_initializer
  config[:current_command]
end
gem(name) click to toggle source
# File lib/bundler/cli.rb, line 558
def gem(name)
end
print_command() click to toggle source
warn_on_outdated_bundler() click to toggle source
# File lib/bundler/cli.rb, line 756
def warn_on_outdated_bundler
  return if Bundler.settings[:disable_version_check]

  command_name = current_command.name
  return if PARSEABLE_COMMANDS.include?(command_name)

  return unless SharedHelpers.md5_available?

  latest = Fetcher::CompactIndex.
           new(nil, Source::Rubygems::Remote.new(URI("https://rubygems.org")), nil).
           send(:compact_index_client).
           instance_variable_get(:@cache).
           dependencies("bundler").
           map {|d| Gem::Version.new(d.first) }.
           max
  return unless latest

  current = Gem::Version.new(VERSION)
  return if current >= latest
  latest_installed = Bundler.rubygems.find_name("bundler").map(&:version).max

  installation = "To install the latest version, run `gem install bundler#{" --pre" if latest.prerelease?}`"
  if latest_installed && latest_installed > current
    suggestion = "To update to the most recent installed version (#{latest_installed}), run `bundle update --bundler`"
    suggestion = "#{installation}\n#{suggestion}" if latest_installed < latest
  else
    suggestion = installation
  end

  Bundler.ui.warn "The latest bundler is #{latest}, but you are currently running #{current}.\n#{suggestion}"
rescue RuntimeError
  nil
end