~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
    
2227.1.1 by mbp at sourcefrog
Back out previous incompatible change: Option.short_name is now again
115
    :ivar _short_name: If this option has a single-letter name, this is it.
2190.2.1 by Martin Pool
remove global registration of short options
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
2227.1.1 by mbp at sourcefrog
Back out previous incompatible change: Option.short_name is now again
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
2227.1.1 by mbp at sourcefrog
Back out previous incompatible change: Option.short_name is now again
148
    def short_name(self):
149
        return self._short_name
150
1857.1.9 by Aaron Bentley
Add hidden negation options
151
    def get_negation_name(self):
152
        if self.name.startswith('no-'):
153
            return self.name[3:]
154
        else:
155
            return 'no-' + self.name
156
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
157
    def add_option(self, parser, short_name):
158
        """Add this option to an Optparse parser"""
159
        option_strings = ['--%s' % self.name]
160
        if short_name is not None:
161
            option_strings.append('-%s' % short_name)
162
        optargfn = self.type
163
        if optargfn is None:
164
            parser.add_option(action='store_true', dest=self.name, 
165
                              help=self.help,
166
                              default=OptionParser.DEFAULT_VALUE,
167
                              *option_strings)
1857.1.9 by Aaron Bentley
Add hidden negation options
168
            negation_strings = ['--%s' % self.get_negation_name()]
1857.1.22 by Aaron Bentley
Negations set value to False, instead of Optparser.DEFAULT_VALUE
169
            parser.add_option(action='store_false', dest=self.name, 
170
                              help=optparse.SUPPRESS_HELP, *negation_strings)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
171
        else:
172
            parser.add_option(action='callback', 
173
                              callback=self._optparse_callback, 
1857.1.12 by Aaron Bentley
Fix a bunch of test cases that assumed --merge-type or log-format
174
                              type='string', metavar=self.argname.upper(),
1857.1.4 by Aaron Bentley
Set metavar according to option
175
                              help=self.help,
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
176
                              default=OptionParser.DEFAULT_VALUE, 
177
                              *option_strings)
178
179
    def _optparse_callback(self, option, opt, value, parser):
180
        setattr(parser.values, self.name, self.type(value))
181
1857.1.14 by Aaron Bentley
Fix man page generation
182
    def iter_switches(self):
183
        """Iterate through the list of switches provided by the option
184
        
185
        :return: an iterator of (name, short_name, argname, help)
186
        """
187
        argname =  self.argname
188
        if argname is not None:
189
            argname = argname.upper()
2227.1.1 by mbp at sourcefrog
Back out previous incompatible change: Option.short_name is now again
190
        yield self.name, self.short_name(), argname, self.help
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
191
1857.1.15 by Aaron Bentley
Add tests for generating an option parser
192
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
193
class OptionParser(optparse.OptionParser):
194
    """OptionParser that raises exceptions instead of exiting"""
195
1857.1.6 by Aaron Bentley
Make the DEFAULT_VALUE an object instance
196
    DEFAULT_VALUE = object()
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
197
198
    def error(self, message):
1996.3.28 by John Arbash Meinel
lazy import revisionspec and errors for bzrlib.options
199
        raise errors.BzrCommandError(message)
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
200
201
202
def get_optparser(options):
203
    """Generate an optparse parser for bzrlib-style options"""
204
205
    parser = OptionParser()
206
    parser.remove_option('--help')
207
    for option in options.itervalues():
2227.1.1 by mbp at sourcefrog
Back out previous incompatible change: Option.short_name is now again
208
        option.add_option(parser, option.short_name())
1857.1.3 by Aaron Bentley
Make option adding depend on Option type
209
    return parser
210
1185.16.45 by Martin Pool
- refactor handling of short option names
211
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
212
def _global_option(name, **kwargs):
213
    """Register o as a global option."""
214
    Option.OPTIONS[name] = Option(name, **kwargs)
215
1185.16.45 by Martin Pool
- refactor handling of short option names
216
_global_option('all')
1185.12.92 by Aaron Bentley
Fixed pull help, renamed clobber to overwrite
217
_global_option('overwrite', help='Ignore differences between branches and '
218
               'overwrite unconditionally')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
219
_global_option('basis', type=str)
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
220
_global_option('bound')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
221
_global_option('diff-options', type=str)
1185.16.55 by mbp at sourcefrog
- more option help
222
_global_option('help',
2190.2.1 by Martin Pool
remove global registration of short options
223
               help='show help message',
224
               short_name='h')
225
_global_option('file', type=unicode, short_name='F')
1185.16.45 by Martin Pool
- refactor handling of short option names
226
_global_option('force')
1185.16.41 by Martin Pool
[patch] define cli options as objects, not strings
227
_global_option('format', type=unicode)
1185.16.45 by Martin Pool
- refactor handling of short option names
228
_global_option('forward')
2190.2.1 by Martin Pool
remove global registration of short options
229
_global_option('message', type=unicode,
230
               short_name='m')
1185.16.45 by Martin Pool
- refactor handling of short option names
231
_global_option('no-recurse')
1185.16.55 by mbp at sourcefrog
- more option help
232
_global_option('profile',
233
               help='show performance profiling information')
2204.2.1 by Wouter van Heyst
Fix merge conflicts.
234
_global_option('revision',
2190.2.1 by Martin Pool
remove global registration of short options
235
               type=_parse_revision_str,
2204.2.1 by Wouter van Heyst
Fix merge conflicts.
236
               short_name='r',
2201.2.1 by Wouter van Heyst
Make mention of the revisionspec topic in the revision option help (#31633).
237
               help='See \'help revisionspec\' for details')
1185.16.47 by Martin Pool
- help for global options
238
_global_option('show-ids', 
239
               help='show internal object ids')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
240
_global_option('timezone', 
241
               type=str,
242
               help='display timezone as local, original, or utc')
1505.1.2 by John Arbash Meinel
(broken) working on implementing bound branches.
243
_global_option('unbound')
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
244
_global_option('verbose',
2190.2.1 by Martin Pool
remove global registration of short options
245
               help='display more information',
246
               short_name='v')
1185.16.45 by Martin Pool
- refactor handling of short option names
247
_global_option('version')
248
_global_option('email')
249
_global_option('update')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
250
_global_option('log-format', type=str, help="Use this log format")
2190.2.1 by Martin Pool
remove global registration of short options
251
_global_option('long', help='Use detailed log format. Same as --log-format long',
252
               short_name='l')
1857.1.20 by Aaron Bentley
Strip out all the EnumOption stuff
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)
2190.2.1 by Martin Pool
remove global registration of short options
260
_global_option('quiet', short_name='q')
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.')