# Copyright import optparse import sys import libbe import libbe.util.encoding import libbe.util.plugin class UserError(Exception): pass class UnknownCommand(UserError): def __init__(self, cmd): Exception.__init__(self, "Unknown command '%s'" % cmd) self.cmd = cmd def get_command(command_name): """Retrieves the module for a user command >>> try: ... get_command('asdf') ... except UnknownCommand, e: ... print e Unknown command 'asdf' >>> repr(get_command('list')).startswith(">> c = Command() >>> print c.help() usage: be command [options] Options: -h HELP, --help=HELP Print a help message --complete=STRING Print a list of possible completions -r REPO, --repo=REPO Select BE repository (see `be help repo`) rather thanthe current directory. A detailed help message. """ name = 'command' def __init__(self, input_encoding=None, output_encoding=None): self.status = None self.result = None self.input_encoding = None self.output_encoding = None self.options = [ Option(name='help', short_name='h', help='Print a help message', option_callback=self.help), Option(name='complete', type='string', help='Print a list of possible completions', arg=Argument(name='complete', metavar='STRING', optional=True)), ] self.args = [] def run(self, bugdir, options=None, args=None): if options == None: options = {} if args == None: args = [] params = {} for option in self.options: if option.name in options: params[option.name] = options.pop(option.name) elif option.arg != None: params[option.name] = option.arg.default else: # non-arg options are flags, set to default flag value params[option.name] = False if len(options) > 0: raise UserError, 'Invalid options passed to command %s:\n %s' \ % (self.name, '\n '.join(['%s: %s' % (k,v) for k,v in options.items()])) for arg in self.args: pass if params['help'] == True: pass else: params.pop('help') if params['complete'] != None: pass else: params.pop('complete') self._setup_io(self.input_encoding, self.output_encoding) self.status = self._run(bugdir, **params) return self.status def _run(self, bugdir, **kwargs): pass def _setup_io(self, input_encoding=None, output_encoding=None): if input_encoding == None: input_encoding = libbe.util.get_input_encoding() if output_encoding == None: output_encoding = libbe.util.get_output_encoding() self.stdin = codecs.getwriter(input_encoding)(sys.stdin) self.stdin.encoding = input_encoding self.stdout = codecs.getwriter(output_encoding)(sys.stdout) self.stdout.encoding = output_encoding def help(self, *args): return '\n\n'.join([self._usage(), self._option_help(), self._long_help()]) # if cmd != None: # return get_command(cmd).help() # cmdlist = [] # for name in commands(): # module = get_command(name) # cmdlist.append((name, module.__desc__)) # cmdlist.sort() # longest_cmd_len = max([len(name) for name,desc in cmdlist]) # ret = ["Bugs Everywhere - Distributed bug tracking", # "", "Supported commands"] # for name, desc in cmdlist: # numExtraSpaces = longest_cmd_len-len(name) # ret.append("be %s%*s %s" % (name, numExtraSpaces, "", desc)) # ret.extend(["", "Run", " be help [command]", "for more information."]) # longhelp = "\n".join(ret) # if parser == None: # return longhelp # return parser.help_str() + "\n" + longhelp def _usage(self): usage = 'usage: be %s [options]' % self.name num_optional = 0 for arg in self.args: usage += ' ' if arg.optional == True: usage += '[' num_optional += 1 usage += arg.metavar if arg.repeatable == True: usage += ' ...' usage += ']'*num_optional return usage def _option_help(self): o = OptionFormatter(self.options) return o.option_help().strip('\n') def _long_help(self): return "A detailed help message."