0001# (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org)
0002# Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php
0003from command import Command, get_commands
0004from command import parser as base_parser
0005
0006class HelpCommand(Command):
0007
0008    summary = "Display help"
0009    usage = '[COMMAND]'
0010
0011    max_args = 1
0012
0013    parser = Command.standard_parser()
0014
0015    def command(self):
0016        if not self.args:
0017            self.generic_help()
0018            return
0019
0020        name = self.args[0]
0021        commands = get_commands()
0022        if name not in commands:
0023            print 'No such command: %s' % name
0024            self.generic_help()
0025            return
0026
0027        command = commands[name].load()
0028        runner = command(name)
0029        runner.run(['-h'])
0030
0031    def generic_help(self):
0032        base_parser.print_help()
0033        print
0034        commands_grouped = {}
0035        commands = get_commands()
0036        longest = max([len(n) for n in commands.keys()])
0037        for name, command in commands.items():
0038            try:
0039                command = command.load()
0040            except Exception, e:
0041                print 'Cannot load command %s: %s' % (name, e)
0042                continue
0043            if getattr(command, 'hidden', False):
0044                continue
0045            commands_grouped.setdefault(
0046                command.group_name, []).append((name, command))
0047        commands_grouped = commands_grouped.items()
0048        commands_grouped.sort()
0049        print 'Commands:'
0050        for group, commands in commands_grouped:
0051            if group:
0052                print group + ':'
0053            commands.sort()
0054            for name, command in commands:
0055                print '  %s  %s' % (self.pad(name, length=longest),
0056                                    command.summary)
0057                #if command.description:
0058                #    print self.indent_block(command.description, 4)
0059            print