class Bundler::CLI

def self.aliases_for(command_name)

def self.aliases_for(command_name)
  COMMAND_ALIASES.select {|k, _| k == command_name }.invert
end

def self.all_aliases

def self.all_aliases
  @all_aliases ||= begin
                     command_aliases = {}
                     COMMAND_ALIASES.each do |name, aliases|
                       Array(aliases).each do |one_alias|
                         command_aliases[one_alias] = name
                       end
                     end
                     command_aliases
                   end
end

def self.dispatch(*)

def self.dispatch(*)
  super do |i|
    i.send(:print_command)
    i.send(:warn_on_outdated_bundler)
  end
end

def self.handle_no_command_error(command, has_namespace = $thor_runner)

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

def self.reformatted_help_args(args)

into the corresponding `bundle help #{command}` call
Reformat the arguments passed to bundle that include a --help flag
def self.reformatted_help_args(args)
  bundler_commands = (COMMAND_ALIASES.keys + COMMAND_ALIASES.values).flatten
  help_flags = %w[--help -h]
  exec_commands = ["exec"] + COMMAND_ALIASES["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 }
  command = all_aliases[command] if all_aliases[command]
  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

def self.source_root

def self.source_root
  File.expand_path("templates", __dir__)
end

def self.start(*)

def self.start(*)
  super
ensure
  Bundler::SharedHelpers.print_major_deprecations!
end

def add(*gems)

def add(*gems)
  require_relative "cli/add"
  Add.new(options.dup, gems).run
end

def auto_install

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

`bundle config set --global auto_install 1`.
Bundler.settings[:auto_install] exists. This is set through config cmd
Automatically invoke `bundle install` and resume if
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

def binstubs(*gems)

def binstubs(*gems)
  require_relative "cli/binstubs"
  Binstubs.new(options, gems).run
end

def cache

def cache
  SharedHelpers.major_deprecation 2,
    "The `--all` flag is deprecated because it relies on being " \
    "remembered across bundler invocations, which bundler will no longer " \
    "do in future versions. Instead please use `bundle config set cache_all true`, " \
    "and stop using this flag" if ARGV.include?("--all")
  SharedHelpers.major_deprecation 2,
    "The `--path` flag is deprecated because its semantics are unclear. " \
    "Use `bundle config cache_path` to configure the path of your cache of gems, " \
    "and `bundle config path` to configure the path where your gems are installed, " \
    "and stop using this flag" if ARGV.include?("--path")
  require_relative "cli/cache"
  Cache.new(options).run
end

def check

def check
  remembered_flag_deprecation("path")
  require_relative "cli/check"
  Check.new(options).run
end

def clean

def clean
  require_relative "cli/clean"
  Clean.new(options.dup).run
end

def cli_help

def cli_help
  version
  Bundler.ui.info "\n"
  primary_commands = ["install", "update", "cache", "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

def console(group = nil)

def console(group = nil)
  require_relative "cli/console"
  Console.new(options, group).run
end

def current_command

def current_command
  _, _, config = @_initializer
  config[:current_command]
end

def doctor

def doctor
  require_relative "cli/doctor"
  Doctor.new(options).run
end

def env

def env
  Env.write($stdout)
end

def exec(*args)

def exec(*args)
  if ARGV.include?("--no-keep-file-descriptors")
    SharedHelpers.major_deprecation(2, "The `--no-keep-file-descriptors` has been deprecated. `bundle exec` no longer mess with your file descriptors. Close them in the exec'd script if you need to")
  end
  require_relative "cli/exec"
  Exec.new(options, args).run
end

def flag_deprecation(name, flag_name, option)

def flag_deprecation(name, flag_name, option)
  name_index = ARGV.find {|arg| flag_name == arg.split("=")[0] }
  return unless name_index
  value = options[name]
  value = value.join(" ").to_s if option.type == :array
  Bundler::SharedHelpers.major_deprecation 2,
    "The `#{flag_name}` flag is deprecated because it relies on being " \
    "remembered across bundler invocations, which bundler will no longer " \
    "do in future versions. Instead please use `bundle config set --local #{name.tr("-", "_")} " \
    "'#{value}'`, and stop using this flag"
end

def fund

def fund
  require_relative "cli/fund"
  Fund.new(options).run
end

def gem(name)

def gem(name)
end

def help(cli = nil)

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", __dir__)
  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)
    man_page = man_pages[command]
    if Bundler.which("man") && man_path !~ %r{^file:/.+!/META-INF/jruby.home/.+}
      Kernel.exec "man #{man_page}"
    else
      puts File.read("#{man_path}/#{File.basename(man_page)}.ronn")
    end
  elsif command_path = Bundler.which("bundler-#{cli}")
    Kernel.exec(command_path, "--help")
  else
    super
  end
end

def info(gem_name)

def info(gem_name)
  require_relative "cli/info"
  Info.new(options, gem_name).run
end

def init

def init
  require_relative "cli/init"
  Init.new(options.dup).run
end

def initialize(*args)

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_settings_and_root!
  end
  Bundler.self_manager.restart_with_locked_bundler_if_needed
  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) }
end

def inject(name, version)

def inject(name, version)
  SharedHelpers.major_deprecation 2, "The `inject` command has been replaced by the `add` command"
  require_relative "cli/inject"
  Inject.new(options.dup, name, version).run
end

def install

def install
  SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
  %w[clean deployment frozen no-prune path shebang system without with].each do |option|
    remembered_flag_deprecation(option)
  end
  remembered_negative_flag_deprecation("no-deployment")
  require_relative "cli/install"
  Bundler.settings.temporary(:no_install => false) do
    Install.new(options.dup).run
  end
end

def issue

def issue
  require_relative "cli/issue"
  Issue.new.run
end

def licenses

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

def list

def list
  require_relative "cli/list"
  List.new(options).run
end

def lock

def lock
  require_relative "cli/lock"
  Lock.new(options).run
end

def open(name)

def open(name)
  require_relative "cli/open"
  Open.new(options, name).run
end

def outdated(*gems)

def outdated(*gems)
  require_relative "cli/outdated"
  Outdated.new(options, gems).run
end

def platform

def platform
  require_relative "cli/platform"
  Platform.new(options).run
end

def print_command

def print_command
  return unless Bundler.ui.debug?
  cmd = current_command
  command_name = cmd.name
  return if PARSEABLE_COMMANDS.include?(command_name)
  command = ["bundle", command_name] + args
  options_to_print = options.dup
  options_to_print.delete_if do |k, v|
    next unless o = cmd.options[k]
    o.default == v
  end
  command << Thor::Options.to_switches(options_to_print.sort_by(&:first)).strip
  command.reject!(&:empty?)
  Bundler.ui.info "Running `#{command * " "}` with bundler #{Bundler::VERSION}"
end

def pristine(*gems)

def pristine(*gems)
  require_relative "cli/pristine"
  Pristine.new(gems).run
end

def remembered_flag_deprecation(name)

def remembered_flag_deprecation(name)
  option = current_command.options[name]
  flag_name = option.switch_name
  flag_deprecation(name, flag_name, option)
end

def remembered_negative_flag_deprecation(name)

def remembered_negative_flag_deprecation(name)
  positive_name = name.gsub(/\Ano-/, "")
  option = current_command.options[positive_name]
  flag_name = "--no-" + option.switch_name.gsub(/\A--/, "")
  flag_deprecation(positive_name, flag_name, option)
end

def remove(*gems)

def remove(*gems)
  SharedHelpers.major_deprecation(2, "The `--install` flag has been deprecated. `bundle install` is triggered by default.") if ARGV.include?("--install")
  require_relative "cli/remove"
  Remove.new(gems, options).run
end

def show(gem_name = nil)

def show(gem_name = nil)
  SharedHelpers.major_deprecation(2, "the `--outdated` flag to `bundle show` was undocumented and will be removed without replacement") if ARGV.include?("--outdated")
  require_relative "cli/show"
  Show.new(options, gem_name).run
end

def update(*gems)

def update(*gems)
  SharedHelpers.major_deprecation(2, "The `--force` option has been renamed to `--redownload`") if ARGV.include?("--force")
  require_relative "cli/update"
  Bundler.settings.temporary(:no_install => false) do
    Update.new(options, gems).run
  end
end

def version

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

def viz

def viz
  SharedHelpers.major_deprecation 2, "The `viz` command has been renamed to `graph` and moved to a plugin. See https://github.com/rubygems/bundler-graph"
  require_relative "cli/viz"
  Viz.new(options.dup).run
end

def warn_on_outdated_bundler

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(Bundler::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
  Bundler.ui.warn \
    "The latest bundler is #{latest}, but you are currently running #{current}.\n" \
    "To update to the most recent version, run `bundle update --bundler`"
rescue RuntimeError
  nil
end