~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2004, 2005, 2006 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
17
# TODO: For things like --diff-prefix, we want a way to customize the display
18
# of the option argument.
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
19
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
20
import re
21
22
from bzrlib.lazy_import import lazy_import
23
lazy_import(globals(), """
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
24
import optparse
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
25
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
26
from bzrlib import (
27
    errors,
28
    revisionspec,
29
    )
30
""")
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
31
from bzrlib.trace import warning
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
32
33
34
def _parse_revision_str(revstr):
35
    """This handles a revision string -> revno.
36
37
    This always returns a list.  The list will have one element for
38
    each revision specifier supplied.
39
40
    >>> _parse_revision_str('234')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
41
    [<RevisionSpec_revno 234>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
42
    >>> _parse_revision_str('234..567')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
43
    [<RevisionSpec_revno 234>, <RevisionSpec_revno 567>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
44
    >>> _parse_revision_str('..')
45
    [<RevisionSpec None>, <RevisionSpec None>]
46
    >>> _parse_revision_str('..234')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
47
    [<RevisionSpec None>, <RevisionSpec_revno 234>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
48
    >>> _parse_revision_str('234..')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
49
    [<RevisionSpec_revno 234>, <RevisionSpec None>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
50
    >>> _parse_revision_str('234..456..789') # Maybe this should be an error
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
51
    [<RevisionSpec_revno 234>, <RevisionSpec_revno 456>, <RevisionSpec_revno 789>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
52
    >>> _parse_revision_str('234....789') #Error ?
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
53
    [<RevisionSpec_revno 234>, <RevisionSpec None>, <RevisionSpec_revno 789>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
54
    >>> _parse_revision_str('revid:test@other.com-234234')
55
    [<RevisionSpec_revid revid:test@other.com-234234>]
56
    >>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
57
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_revid revid:test@other.com-234235>]
58
    >>> _parse_revision_str('revid:test@other.com-234234..23')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
59
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_revno 23>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
60
    >>> _parse_revision_str('date:2005-04-12')
61
    [<RevisionSpec_date date:2005-04-12>]
62
    >>> _parse_revision_str('date:2005-04-12 12:24:33')
63
    [<RevisionSpec_date date:2005-04-12 12:24:33>]
64
    >>> _parse_revision_str('date:2005-04-12T12:24:33')
65
    [<RevisionSpec_date date:2005-04-12T12:24:33>]
66
    >>> _parse_revision_str('date:2005-04-12,12:24:33')
67
    [<RevisionSpec_date date:2005-04-12,12:24:33>]
68
    >>> _parse_revision_str('-5..23')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
69
    [<RevisionSpec_revno -5>, <RevisionSpec_revno 23>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
70
    >>> _parse_revision_str('-5')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
71
    [<RevisionSpec_revno -5>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
72
    >>> _parse_revision_str('123a')
73
    Traceback (most recent call last):
74
      ...
1948.4.32 by John Arbash Meinel
Clean up __repr__, as well as add tests that we can handle -r12:branch/
75
    NoSuchRevisionSpec: No namespace registered for string: '123a'
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
76
    >>> _parse_revision_str('abc')
77
    Traceback (most recent call last):
78
      ...
1948.4.32 by John Arbash Meinel
Clean up __repr__, as well as add tests that we can handle -r12:branch/
79
    NoSuchRevisionSpec: No namespace registered for string: 'abc'
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
80
    >>> _parse_revision_str('branch:../branch2')
81
    [<RevisionSpec_branch branch:../branch2>]
1545.1.1 by Denys Duchier
distinguish ../ as path to branch and .. as revspec separator
82
    >>> _parse_revision_str('branch:../../branch2')
83
    [<RevisionSpec_branch branch:../../branch2>]
84
    >>> _parse_revision_str('branch:../../branch2..23')
1948.4.31 by John Arbash Meinel
fix bugs in the test_annonate.py suite, which was passing '-r 3' as n argument not '-r3' or '-r', '3'
85
    [<RevisionSpec_branch branch:../../branch2>, <RevisionSpec_revno 23>]
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
86
    """
87
    # TODO: Maybe move this into revisionspec.py
88
    revs = []
1988.4.5 by Robert Collins
revisions can now be specified using dotted-decimal revision numbers.
89
    # split on the first .. that is not followed by a / ?
1948.4.28 by John Arbash Meinel
Remove some places that were directly instantiating a RevisionSpec object. Also get rid of support for --revision 1:2, it has been deprecated for a long time
90
    sep = re.compile("\\.\\.(?!/)")
91
    for x in sep.split(revstr):
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
92
        revs.append(revisionspec.RevisionSpec.from_string(x or None))
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
93
    return revs
94
95
96
def _parse_merge_type(typestring):
1185.12.62 by Aaron Bentley
Restored merge-type selection
97
    return get_merge_type(typestring)
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
98
1185.12.62 by Aaron Bentley
Restored merge-type selection
99
def get_merge_type(typestring):
100
    """Attempt to find the merge class/factory associated with a string."""
101
    from merge import merge_types
102
    try:
103
        return merge_types[typestring][0]
104
    except KeyError:
105
        templ = '%s%%7s: %%s' % (' '*12)
106
        lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
107
        type_list = '\n'.join(lines)
108
        msg = "No known merge type %s. Supported types are:\n%s" %\
109
            (typestring, type_list)
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
110
        raise errors.BzrCommandError(msg)
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
111
112
class Option(object):
2190.2.1 by Martin Pool
remove global registration of short options
113
    """Description of a command line option
114
    
115
    :ivar short_name: If this option has a single-letter name, this is it.
116
    Otherwise None.
117
    """
118
1185.16.45 by Martin Pool
- refactor handling of short option names
119
    # TODO: Some way to show in help a description of the option argument
120
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
121
    OPTIONS = {}
122
2190.2.1 by Martin Pool
remove global registration of short options
123
    def __init__(self, name, help='', type=None, argname=None,
124
                 short_name=None):
1185.16.45 by Martin Pool
- refactor handling of short option names
125
        """Make a new command option.
126
127
        name -- regular name of the command, used in the double-dash
128
            form and also as the parameter to the command's run() 
129
            method.
130
131
        help -- help message displayed in command help
132
133
        type -- function called to parse the option argument, or 
134
            None (default) if this option doesn't take an argument.
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
135
136
        argname -- name of option argument, if any
1185.16.45 by Martin Pool
- refactor handling of short option names
137
        """
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
138
        self.name = name
139
        self.help = help
140
        self.type = type
2190.2.1 by Martin Pool
remove global registration of short options
141
        self.short_name = short_name
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
142
        if type is None:
143
            assert argname is None
144
        elif argname is None:
145
            argname = 'ARG'
146
        self.argname = argname
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
147
1857.1.9 by Aaron Bentley
Add hidden negation options
148
    def get_negation_name(self):
149
        if self.name.startswith('no-'):
150
            return self.name[3:]
151
        else:
152
            return 'no-' + self.name
153
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
154
    def add_option(self, parser, short_name):
155
        """Add this option to an Optparse parser"""
156
        option_strings = ['--%s' % self.name]
157
        if short_name is not None:
158
            option_strings.append('-%s' % short_name)
159
        optargfn = self.type
160
        if optargfn is None:
161
            parser.add_option(action='store_true', dest=self.name, 
162
                              help=self.help,
163
                              default=OptionParser.DEFAULT_VALUE,
164
                              *option_strings)
1857.1.9 by Aaron Bentley
Add hidden negation options
165
            negation_strings = ['--%s' % self.get_negation_name()]
1857.1.22 by Aaron Bentley
Negations set value to False, instead of Optparser.DEFAULT_VALUE
166
            parser.add_option(action='store_false', dest=self.name, 
167
                              help=optparse.SUPPRESS_HELP, *negation_strings)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
168
        else:
169
            parser.add_option(action='callback', 
170
                              callback=self._optparse_callback, 
1857.1.12 by Aaron Bentley
Fix a bunch of test cases that assumed --merge-type or log-format
171
                              type='string', metavar=self.argname.upper(),
1857.1.4 by Aaron Bentley
Set metavar according to option
172
                              help=self.help,
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
173
                              default=OptionParser.DEFAULT_VALUE, 
174
                              *option_strings)
175
176
    def _optparse_callback(self, option, opt, value, parser):
177
        setattr(parser.values, self.name, self.type(value))
178
1857.1.14 by Aaron Bentley
Fix man page generation
179
    def iter_switches(self):
180
        """Iterate through the list of switches provided by the option
181
        
182
        :return: an iterator of (name, short_name, argname, help)
183
        """
184
        argname =  self.argname
185
        if argname is not None:
186
            argname = argname.upper()
2190.2.1 by Martin Pool
remove global registration of short options
187
        yield self.name, self.short_name, argname, self.help
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
188
1857.1.15 by Aaron Bentley
Add tests for generating an option parser
189
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
190
class OptionParser(optparse.OptionParser):
191
    """OptionParser that raises exceptions instead of exiting"""
192
1857.1.6 by Aaron Bentley
Make the DEFAULT_VALUE an object instance
193
    DEFAULT_VALUE = object()
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
194
195
    def error(self, message):
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
196
        raise errors.BzrCommandError(message)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
197
198
199
def get_optparser(options):
200
    """Generate an optparse parser for bzrlib-style options"""
201
202
    parser = OptionParser()
203
    parser.remove_option('--help')
204
    for option in options.itervalues():
2190.2.1 by Martin Pool
remove global registration of short options
205
        option.add_option(parser, option.short_name)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
206
    return parser
207
1185.16.45 by Martin Pool
- refactor handling of short option names
208
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
209
def _global_option(name, **kwargs):
210
    """Register o as a global option."""
211
    Option.OPTIONS[name] = Option(name, **kwargs)
212
1185.16.45 by Martin Pool
- refactor handling of short option names
213
_global_option('all')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
214
_global_option('overwrite', help='Ignore differences between branches and '
215
               'overwrite unconditionally')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
216
_global_option('basis', type=str)
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
217
_global_option('bound')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
218
_global_option('diff-options', type=str)
1185.16.55 by mbp at sourcefrog
- more option help
219
_global_option('help',
2190.2.1 by Martin Pool
remove global registration of short options
220
               help='show help message',
221
               short_name='h')
222
_global_option('file', type=unicode, short_name='F')
1185.16.45 by Martin Pool
- refactor handling of short option names
223
_global_option('force')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
224
_global_option('format', type=unicode)
1185.16.45 by Martin Pool
- refactor handling of short option names
225
_global_option('forward')
2190.2.1 by Martin Pool
remove global registration of short options
226
_global_option('message', type=unicode,
227
               short_name='m')
1185.16.45 by Martin Pool
- refactor handling of short option names
228
_global_option('no-recurse')
1185.16.55 by mbp at sourcefrog
- more option help
229
_global_option('profile',
230
               help='show performance profiling information')
2204.2.1 by Wouter van Heyst
Fix merge conflicts.
231
_global_option('revision',
2190.2.1 by Martin Pool
remove global registration of short options
232
               type=_parse_revision_str,
2204.2.1 by Wouter van Heyst
Fix merge conflicts.
233
               short_name='r',
2201.2.1 by Wouter van Heyst
Make mention of the revisionspec topic in the revision option help (#31633).
234
               help='See \'help revisionspec\' for details')
1185.16.47 by Martin Pool
- help for global options
235
_global_option('show-ids', 
236
               help='show internal object ids')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
237
_global_option('timezone', 
238
               type=str,
239
               help='display timezone as local, original, or utc')
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
240
_global_option('unbound')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
241
_global_option('verbose',
2190.2.1 by Martin Pool
remove global registration of short options
242
               help='display more information',
243
               short_name='v')
1185.16.45 by Martin Pool
- refactor handling of short option names
244
_global_option('version')
245
_global_option('email')
246
_global_option('update')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
247
_global_option('log-format', type=str, help="Use this log format")
2190.2.1 by Martin Pool
remove global registration of short options
248
_global_option('long', help='Use detailed log format. Same as --log-format long',
249
               short_name='l')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
250
_global_option('short', help='Use moderately short log format. Same as --log-format short')
251
_global_option('line', help='Use log format with one line per revision. Same as --log-format line')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
252
_global_option('root', type=str)
1185.16.45 by Martin Pool
- refactor handling of short option names
253
_global_option('no-backup')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
254
_global_option('merge-type', type=_parse_merge_type, 
255
               help='Select a particular merge algorithm')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
256
_global_option('pattern', type=str)
2190.2.1 by Martin Pool
remove global registration of short options
257
_global_option('quiet', short_name='q')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
258
_global_option('remember', help='Remember the specified location as a'
259
               ' default.')
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
260
_global_option('reprocess', help='Reprocess to reduce spurious conflicts')
1185.33.33 by Martin Pool
[patch] add 'bzr inventory --kind directory'; remove 'bzr directories'
261
_global_option('kind', type=str)
1185.33.90 by Martin Pool
[merge] add --dry-run option (mpe)
262
_global_option('dry-run',
263
               help="show what would be done, but don't actually do anything")
2073.2.3 by wang
Change option name to --name-from-revision. Always make new tree the
264
_global_option('name-from-revision', help='The path name in the old tree.')