class Gem::Commands::HelpCommand

Public Class Methods

new() click to toggle source
Calls superclass method Gem::Command.new
# File lib/rubygems/commands/help_command.rb, line 81
def initialize
  super 'help', "Provide help on the 'gem' command"
end

Public Instance Methods

execute() click to toggle source
# File lib/rubygems/commands/help_command.rb, line 98
def execute
  command_manager = Gem::CommandManager.instance
  arg = options[:args][0]

  if begins? "commands", arg then
    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]

      summary =
        if command then
          command.summary
        else
          "[No command found for #{cmd_name}, bug?]"
        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")

  elsif begins? "options", arg then
    say Gem::Command::HELP

  elsif begins? "examples", arg then
    say EXAMPLES

  elsif begins? "platforms", arg then
    say PLATFORMS

  elsif options[:help] then
    command = command_manager[options[:help]]
    if command
      # help with provided command
      command.invoke("--help")
    else
      alert_error "Unknown command #{options[:help]}.  Try 'gem help commands'"
    end

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

  else
    say Gem::Command::HELP
  end
end