~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/option.py

  • Committer: Martin Pool
  • Date: 2009-03-24 05:21:02 UTC
  • mfrom: (4192 +trunk)
  • mto: This revision was merged to the branch mainline in revision 4202.
  • Revision ID: mbp@sourcefrog.net-20090324052102-8kk087b32tep3d9h
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
""")
30
30
 
31
31
from bzrlib import (
32
 
    log,
33
 
    registry,
 
32
    registry as _mod_registry,
34
33
    )
35
34
 
 
35
 
36
36
def _parse_revision_str(revstr):
37
37
    """This handles a revision string -> revno.
38
38
 
136
136
 
137
137
class Option(object):
138
138
    """Description of a command line option
139
 
    
 
139
 
140
140
    :ivar _short_name: If this option has a single-letter name, this is it.
141
141
    Otherwise None.
142
142
    """
154
154
        """Make a new command option.
155
155
 
156
156
        :param name: regular name of the command, used in the double-dash
157
 
            form and also as the parameter to the command's run() 
 
157
            form and also as the parameter to the command's run()
158
158
            method (unless param_name is specified).
159
159
 
160
160
        :param help: help message displayed in command help
161
161
 
162
 
        :param type: function called to parse the option argument, or 
 
162
        :param type: function called to parse the option argument, or
163
163
            None (default) if this option doesn't take an argument.
164
164
 
165
165
        :param argname: name of option argument, if any
185
185
            argname = 'ARG'
186
186
        self.argname = argname
187
187
        if param_name is None:
188
 
            self._param_name = self.name
 
188
            self._param_name = self.name.replace('-', '_')
189
189
        else:
190
190
            self._param_name = param_name
191
191
        self.custom_callback = custom_callback
210
210
            option_strings.append('-%s' % short_name)
211
211
        optargfn = self.type
212
212
        if optargfn is None:
213
 
            parser.add_option(action='callback', 
214
 
                              callback=self._optparse_bool_callback, 
 
213
            parser.add_option(action='callback',
 
214
                              callback=self._optparse_bool_callback,
215
215
                              callback_args=(True,),
216
216
                              help=self.help,
217
217
                              *option_strings)
218
218
            negation_strings = ['--%s' % self.get_negation_name()]
219
 
            parser.add_option(action='callback', 
220
 
                              callback=self._optparse_bool_callback, 
 
219
            parser.add_option(action='callback',
 
220
                              callback=self._optparse_bool_callback,
221
221
                              callback_args=(False,),
222
222
                              help=optparse.SUPPRESS_HELP, *negation_strings)
223
223
        else:
224
 
            parser.add_option(action='callback', 
225
 
                              callback=self._optparse_callback, 
 
224
            parser.add_option(action='callback',
 
225
                              callback=self._optparse_callback,
226
226
                              type='string', metavar=self.argname.upper(),
227
227
                              help=self.help,
228
 
                              default=OptionParser.DEFAULT_VALUE, 
 
228
                              default=OptionParser.DEFAULT_VALUE,
229
229
                              *option_strings)
230
230
 
231
231
    def _optparse_bool_callback(self, option, opt_str, value, parser, bool_v):
241
241
 
242
242
    def iter_switches(self):
243
243
        """Iterate through the list of switches provided by the option
244
 
        
 
244
 
245
245
        :return: an iterator of (name, short_name, argname, help)
246
246
        """
247
247
        argname =  self.argname
306
306
        else:
307
307
            return self.converter(value)
308
308
 
309
 
    def __init__(self, name, help, registry, converter=None,
310
 
        value_switches=False, title=None, enum_switch=True):
 
309
    def __init__(self, name, help, registry=None, converter=None,
 
310
        value_switches=False, title=None, enum_switch=True,
 
311
        lazy_registry=None):
311
312
        """
312
313
        Constructor.
313
314
 
321
322
            '--knit' can be used interchangeably.
322
323
        :param enum_switch: If true, a switch is provided with the option name,
323
324
            which takes a value.
 
325
        :param lazy_registry: A tuple of (module name, attribute name) for a
 
326
            registry to be lazily loaded.
324
327
        """
325
328
        Option.__init__(self, name, help, type=self.convert)
326
 
        self.registry = registry
 
329
        self._registry = registry
 
330
        if registry is None:
 
331
            if lazy_registry is None:
 
332
                raise AssertionError(
 
333
                    'One of registry or lazy_registry must be given.')
 
334
            self._lazy_registry = _mod_registry._LazyObjectGetter(
 
335
                *lazy_registry)
 
336
        if registry is not None and lazy_registry is not None:
 
337
            raise AssertionError(
 
338
                'registry and lazy_registry are mutually exclusive')
327
339
        self.name = name
328
340
        self.converter = converter
329
341
        self.value_switches = value_switches
332
344
        if self.title is None:
333
345
            self.title = name
334
346
 
 
347
    @property
 
348
    def registry(self):
 
349
        if self._registry is None:
 
350
            self._registry = self._lazy_registry.get_obj()
 
351
        return self._registry
 
352
 
335
353
    @staticmethod
336
354
    def from_kwargs(name_, help=None, title=None, value_switches=False,
337
355
                    enum_switch=True, **kwargs):
341
359
        RegistryOption constructor.  Any other keyword arguments are treated
342
360
        as values for the option, and they value is treated as the help.
343
361
        """
344
 
        reg = registry.Registry()
 
362
        reg = _mod_registry.Registry()
345
363
        for name, switch_help in kwargs.iteritems():
346
364
            name = name.replace('_', '-')
347
365
            reg.register(name, name, help=switch_help)
 
366
            if not value_switches:
 
367
                help = help + '  "' + name + '": ' + switch_help
 
368
                if not help.endswith("."):
 
369
                    help = help + "."
348
370
        return RegistryOption(name_, help, reg, title=title,
349
371
            value_switches=value_switches, enum_switch=enum_switch)
350
372
 
430
452
    Option.OPTIONS[name] = Option(name, **kwargs)
431
453
 
432
454
 
433
 
def _global_registry_option(name, help, registry, **kwargs):
 
455
def _global_registry_option(name, help, registry=None, **kwargs):
434
456
    Option.OPTIONS[name] = RegistryOption(name, help, registry, **kwargs)
435
457
 
436
458
 
437
 
class MergeTypeRegistry(registry.Registry):
438
 
 
439
 
    pass
440
 
 
441
 
 
442
459
# This is the verbosity level detected during command line parsing.
443
460
# Note that the final value is dependent on the order in which the
444
461
# various flags (verbose, quiet, no-verbose, no-quiet) are given.
467
484
            _verbosity_level = -1
468
485
 
469
486
 
 
487
class MergeTypeRegistry(_mod_registry.Registry):
 
488
 
 
489
    pass
 
490
 
 
491
 
470
492
_merge_type_registry = MergeTypeRegistry()
471
493
_merge_type_registry.register_lazy('merge3', 'bzrlib.merge', 'Merge3Merger',
472
494
                                   "Native diff3-style merge")
480
502
# Declare the standard options
481
503
_standard_option('help', short_name='h',
482
504
                 help='Show help message.')
 
505
_standard_option('usage',
 
506
                 help='Show usage message and options.')
483
507
_standard_option('verbose', short_name='v',
484
508
                 help='Display more information.',
485
509
                 custom_callback=_verbosity_level_callback)
515
539
               help='Select changes introduced by the specified revision. See also "help revisionspec".')
516
540
_global_option('show-ids',
517
541
               help='Show internal object ids.')
518
 
_global_option('timezone', 
 
542
_global_option('timezone',
519
543
               type=str,
520
 
               help='display timezone as local, original, or utc')
 
544
               help='Display timezone as local, original, or utc.')
521
545
_global_option('unbound')
522
546
_global_option('version')
523
547
_global_option('email')
524
548
_global_option('update')
525
549
_global_registry_option('log-format', "Use specified log format.",
526
 
                        log.log_formatter_registry, value_switches=True,
527
 
                        title='Log format')
 
550
                        lazy_registry=('bzrlib.log', 'log_formatter_registry'),
 
551
                        value_switches=True, title='Log format')
528
552
_global_option('long', help='Use detailed log format. Same as --log-format long',
529
553
               short_name='l')
530
554
_global_option('short', help='Use moderately short log format. Same as --log-format short')
542
566
_global_option('dry-run',
543
567
               help="Show what would be done, but don't actually do anything.")
544
568
_global_option('name-from-revision', help='The path name in the old tree.')
 
569
 
 
570
diff_writer_registry = _mod_registry.Registry()
 
571
diff_writer_registry.register('plain', lambda x: x, 'Plaintext diff output.')
 
572
diff_writer_registry.default_key = 'plain'