class Gem::Commands::HelpCommand

def execute

def execute
  arg = options[:args][0]
  _, help = SUBCOMMANDS.find do |command,|
    begins? command, arg
  end
  if help
    if Symbol === help
      send help
    else
      say help
    end
    return
  end
  if options[:help]
    show_help
  elsif arg
    show_command_help arg
  else
    say Gem::Command::HELP
  end
end

def initialize

def initialize
  super 'help', "Provide help on the 'gem' command"
  @command_manager = Gem::CommandManager.instance
end

def show_command_help(command_name) # :nodoc:

:nodoc:
def show_command_help(command_name) # :nodoc:
  command_name = command_name.downcase
  possibilities = @command_manager.find_command_possibilities command_name
  if possibilities.size == 1
    command = @command_manager[possibilities.first]
    command.invoke("--help")
  elsif possibilities.size > 1
    alert_warning "Ambiguous command #{command_name} (#{possibilities.join(', ')})"
  else
    alert_warning "Unknown command #{command_name}. Try: gem help commands"
  end
end

def show_commands # :nodoc:

:nodoc:
def show_commands # :nodoc:
  out = []
  out << "GEM commands are:"
  out << nil
  margin_width = 4
  desc_width = @command_manager.command_names.map {|n| n.size }.max + 4
  summary_width = 80 - margin_width - desc_width
  wrap_indent = ' ' * (margin_width + desc_width)
  format = "#{' ' * margin_width}%-#{desc_width}s%s"
  @command_manager.command_names.each do |cmd_name|
    command = @command_manager[cmd_name]
    next if command.deprecated?
    summary =
      if command
        command.summary
      else
        "[No command found for #{cmd_name}]"
      end
    summary = wrap(summary, summary_width).split "\n"
    out << sprintf(format, cmd_name, summary.shift)
    until summary.empty? do
      out << "#{wrap_indent}#{summary.shift}"
    end
  end
  out << nil
  out << "For help on a particular command, use 'gem help COMMAND'."
  out << nil
  out << "Commands may be abbreviated, so long as they are unambiguous."
  out << "e.g. 'gem i rake' is short for 'gem install rake'."
  say out.join("\n")
end

def usage # :nodoc:

:nodoc:
def usage # :nodoc:
  "#{program_name} ARGUMENT"
end