~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Aaron Bentley
  • Date: 2006-07-12 20:09:55 UTC
  • mto: This revision was merged to the branch mainline in revision 1934.
  • Revision ID: abentley@panoramicfeedback.com-20060712200955-4d7865616b95640c
Make option adding depend on Option type

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
import codecs
32
32
import errno
33
 
import optparse
34
33
import os
35
34
from warnings import warn
36
35
import sys
38
37
import bzrlib
39
38
import bzrlib.errors as errors
40
39
from bzrlib.errors import (BzrError,
41
 
                           BzrCommandError,
42
 
                           BzrCheckError,
 
40
                           BzrCommandError, BzrCheckError,
43
41
                           NotBranchError)
 
42
from bzrlib import option
44
43
from bzrlib.option import Option
45
44
import bzrlib.osutils
46
45
from bzrlib.revisionspec import RevisionSpec
342
341
    return parsed
343
342
 
344
343
 
345
 
class OptionParser(optparse.OptionParser):
346
 
    """OptionParser that raises exceptions instead of exiting"""
347
 
 
348
 
    DEFAULT_VALUE = "DEFAULT"
349
 
 
350
 
    def error(self, message):
351
 
        raise BzrCommandError(message)
352
 
 
353
 
 
354
 
def get_optparser(options):
355
 
    """Generate an optparse parser for bzrlib-style options"""
356
 
    def type_callback(option, opt, value, parser, name, optargfn):
357
 
        setattr(parser.values, name, optargfn(value))
358
 
 
359
 
    parser = OptionParser()
360
 
    parser.remove_option('--help')
361
 
    short_options = dict((k.name, (v, k)) for v, k in 
362
 
                         Option.SHORT_OPTIONS.iteritems())
363
 
    for name, option in options.iteritems():
364
 
        option_strings = ['--%s' % name]
365
 
        if name in short_options:
366
 
            short_name, short_option = short_options[name]
367
 
            option_strings.append('-%s' % short_name)
368
 
        optargfn = option.type
369
 
        if optargfn is None:
370
 
            parser.add_option(action='store_true', dest=name, help=option.help,
371
 
                              default=OptionParser.DEFAULT_VALUE, 
372
 
                              *option_strings)
373
 
        else:
374
 
            parser.add_option(action='callback', callback=type_callback, 
375
 
                              type='string', help=option.help,
376
 
                              default=OptionParser.DEFAULT_VALUE, 
377
 
                              callback_args=(name, optargfn), *option_strings)
378
 
    return parser
379
 
 
380
 
 
381
344
def parse_args(command, argv, alias_argv=None):
382
345
    """Parse command line.
383
346
    
387
350
    they take, and which commands will accept them.
388
351
    """
389
352
    # TODO: make it a method of the Command?
390
 
    parser = get_optparser(command.options())
 
353
    parser = option.get_optparser(command.options())
391
354
    argsover = False
392
355
    if alias_argv is not None:
393
356
        args = alias_argv + argv
396
359
 
397
360
    options, args = parser.parse_args(args)
398
361
    opts = dict([(k, v) for k, v in options.__dict__.iteritems() if 
399
 
                 v is not OptionParser.DEFAULT_VALUE])
 
362
                 v is not option.OptionParser.DEFAULT_VALUE])
400
363
    return args, opts
401
364
 
402
365