~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):
1185.16.45 by Martin Pool
- refactor handling of short option names
113
    """Description of a command line option"""
114
    # TODO: Some way to show in help a description of the option argument
115
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
116
    OPTIONS = {}
117
    SHORT_OPTIONS = {}
118
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
119
    def __init__(self, name, help='', type=None, argname=None):
1185.16.45 by Martin Pool
- refactor handling of short option names
120
        """Make a new command option.
121
122
        name -- regular name of the command, used in the double-dash
123
            form and also as the parameter to the command's run() 
124
            method.
125
126
        help -- help message displayed in command help
127
128
        type -- function called to parse the option argument, or 
129
            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
130
131
        argname -- name of option argument, if any
1185.16.45 by Martin Pool
- refactor handling of short option names
132
        """
133
        # TODO: perhaps a subclass that automatically does 
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
134
        # --option, --no-option for reversible booleans
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
135
        self.name = name
136
        self.help = help
137
        self.type = type
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
138
        if type is None:
139
            assert argname is None
140
        elif argname is None:
141
            argname = 'ARG'
142
        self.argname = argname
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
143
1185.16.45 by Martin Pool
- refactor handling of short option names
144
    def short_name(self):
145
        """Return the single character option for this command, if any.
146
147
        Short options are globally registered.
148
        """
1185.25.3 by Aaron Bentley
Restored short options in help
149
        for short, option in Option.SHORT_OPTIONS.iteritems():
150
            if option is self:
151
                return short
1185.16.45 by Martin Pool
- refactor handling of short option names
152
1857.1.9 by Aaron Bentley
Add hidden negation options
153
    def get_negation_name(self):
154
        if self.name.startswith('no-'):
155
            return self.name[3:]
156
        else:
157
            return 'no-' + self.name
158
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
159
    def add_option(self, parser, short_name):
160
        """Add this option to an Optparse parser"""
161
        option_strings = ['--%s' % self.name]
162
        if short_name is not None:
163
            option_strings.append('-%s' % short_name)
164
        optargfn = self.type
165
        if optargfn is None:
166
            parser.add_option(action='store_true', dest=self.name, 
167
                              help=self.help,
168
                              default=OptionParser.DEFAULT_VALUE,
169
                              *option_strings)
1857.1.9 by Aaron Bentley
Add hidden negation options
170
            negation_strings = ['--%s' % self.get_negation_name()]
1857.1.22 by Aaron Bentley
Negations set value to False, instead of Optparser.DEFAULT_VALUE
171
            parser.add_option(action='store_false', dest=self.name, 
172
                              help=optparse.SUPPRESS_HELP, *negation_strings)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
173
        else:
174
            parser.add_option(action='callback', 
175
                              callback=self._optparse_callback, 
1857.1.12 by Aaron Bentley
Fix a bunch of test cases that assumed --merge-type or log-format
176
                              type='string', metavar=self.argname.upper(),
1857.1.4 by Aaron Bentley
Set metavar according to option
177
                              help=self.help,
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
178
                              default=OptionParser.DEFAULT_VALUE, 
179
                              *option_strings)
180
181
    def _optparse_callback(self, option, opt, value, parser):
182
        setattr(parser.values, self.name, self.type(value))
183
1857.1.14 by Aaron Bentley
Fix man page generation
184
    def iter_switches(self):
185
        """Iterate through the list of switches provided by the option
186
        
187
        :return: an iterator of (name, short_name, argname, help)
188
        """
189
        argname =  self.argname
190
        if argname is not None:
191
            argname = argname.upper()
192
        yield self.name, self.short_name(), argname, self.help
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
193
1857.1.15 by Aaron Bentley
Add tests for generating an option parser
194
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
195
class OptionParser(optparse.OptionParser):
196
    """OptionParser that raises exceptions instead of exiting"""
197
1857.1.6 by Aaron Bentley
Make the DEFAULT_VALUE an object instance
198
    DEFAULT_VALUE = object()
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
199
200
    def error(self, message):
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
201
        raise errors.BzrCommandError(message)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
202
203
204
def get_optparser(options):
205
    """Generate an optparse parser for bzrlib-style options"""
206
207
    parser = OptionParser()
208
    parser.remove_option('--help')
209
    short_options = dict((k.name, v) for v, k in 
210
                         Option.SHORT_OPTIONS.iteritems())
211
    for option in options.itervalues():
212
        option.add_option(parser, short_options.get(option.name))
213
    return parser
214
1185.16.45 by Martin Pool
- refactor handling of short option names
215
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
216
def _global_option(name, **kwargs):
217
    """Register o as a global option."""
218
    Option.OPTIONS[name] = Option(name, **kwargs)
219
1185.16.45 by Martin Pool
- refactor handling of short option names
220
_global_option('all')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
221
_global_option('overwrite', help='Ignore differences between branches and '
222
               'overwrite unconditionally')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
223
_global_option('basis', type=str)
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
224
_global_option('bound')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
225
_global_option('diff-options', type=str)
1185.16.55 by mbp at sourcefrog
- more option help
226
_global_option('help',
227
               help='show help message')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
228
_global_option('file', type=unicode)
1185.16.45 by Martin Pool
- refactor handling of short option names
229
_global_option('force')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
230
_global_option('format', type=unicode)
1185.16.45 by Martin Pool
- refactor handling of short option names
231
_global_option('forward')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
232
_global_option('message', type=unicode)
1185.16.45 by Martin Pool
- refactor handling of short option names
233
_global_option('no-recurse')
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
234
_global_option('prefix', type=str, 
235
               help='Set prefixes to added to old and new filenames, as '
236
                    'two values separated by a colon.')
1185.16.55 by mbp at sourcefrog
- more option help
237
_global_option('profile',
238
               help='show performance profiling information')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
239
_global_option('revision', type=_parse_revision_str)
1185.16.47 by Martin Pool
- help for global options
240
_global_option('show-ids', 
241
               help='show internal object ids')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
242
_global_option('timezone', 
243
               type=str,
244
               help='display timezone as local, original, or utc')
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
245
_global_option('unbound')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
246
_global_option('verbose',
247
               help='display more information')
1185.16.45 by Martin Pool
- refactor handling of short option names
248
_global_option('version')
249
_global_option('email')
250
_global_option('update')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
251
_global_option('log-format', type=str, help="Use this log format")
252
_global_option('long', help='Use detailed log format. Same as --log-format long')
253
_global_option('short', help='Use moderately short log format. Same as --log-format short')
254
_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
255
_global_option('root', type=str)
1185.16.45 by Martin Pool
- refactor handling of short option names
256
_global_option('no-backup')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
257
_global_option('merge-type', type=_parse_merge_type, 
258
               help='Select a particular merge algorithm')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
259
_global_option('pattern', type=str)
1185.16.45 by Martin Pool
- refactor handling of short option names
260
_global_option('quiet')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
261
_global_option('remember', help='Remember the specified location as a'
262
               ' default.')
1185.24.3 by Aaron Bentley
Integrated reprocessing into the rest of the merge stuff
263
_global_option('reprocess', help='Reprocess to reduce spurious conflicts')
1185.33.33 by Martin Pool
[patch] add 'bzr inventory --kind directory'; remove 'bzr directories'
264
_global_option('kind', type=str)
1185.33.90 by Martin Pool
[merge] add --dry-run option (mpe)
265
_global_option('dry-run',
266
               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
267
_global_option('name-from-revision', help='The path name in the old tree.')
1185.16.45 by Martin Pool
- refactor handling of short option names
268
269
270
def _global_short(short_name, long_name):
271
    assert short_name not in Option.SHORT_OPTIONS
272
    Option.SHORT_OPTIONS[short_name] = Option.OPTIONS[long_name]
273
    
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
274
275
Option.SHORT_OPTIONS['F'] = Option.OPTIONS['file']
276
Option.SHORT_OPTIONS['h'] = Option.OPTIONS['help']
277
Option.SHORT_OPTIONS['m'] = Option.OPTIONS['message']
278
Option.SHORT_OPTIONS['r'] = Option.OPTIONS['revision']
279
Option.SHORT_OPTIONS['v'] = Option.OPTIONS['verbose']
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
280
Option.SHORT_OPTIONS['l'] = Option.OPTIONS['long']
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
281
Option.SHORT_OPTIONS['q'] = Option.OPTIONS['quiet']
1694.2.3 by Martin Pool
Add -p0, -p1 options for diff.
282
Option.SHORT_OPTIONS['p'] = Option.OPTIONS['prefix']