~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-09-22 13:32:02 UTC
  • Revision ID: mbp@sourcefrog.net-20050922133202-347cfd35d2941dd5
- simple weave-based annotate code (not complete)

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
# would help with validation and shell completion.
26
26
 
27
27
 
28
 
# TODO: Help messages for options.
29
 
 
30
 
# TODO: Define arguments by objects, rather than just using names.
31
 
# Those objects can specify the expected type of the argument, which
32
 
# would help with validation and shell completion.
33
 
 
34
 
 
35
28
 
36
29
import sys
37
30
import os
41
34
import bzrlib
42
35
import bzrlib.trace
43
36
from bzrlib.trace import mutter, note, log_error, warning
44
 
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError, NotBranchError
45
 
from bzrlib.revisionspec import RevisionSpec
 
37
from bzrlib.errors import BzrError, BzrCheckError, BzrCommandError
 
38
from bzrlib.branch import find_branch
46
39
from bzrlib import BZRDIR
47
40
 
48
41
plugin_cmds = {}
76
69
def _parse_revision_str(revstr):
77
70
    """This handles a revision string -> revno.
78
71
 
79
 
    This always returns a list.  The list will have one element for
80
 
    each revision.
 
72
    This always returns a list.  The list will have one element for 
 
73
 
 
74
    It supports integers directly, but everything else it
 
75
    defers for passing to Branch.get_revision_info()
81
76
 
82
77
    >>> _parse_revision_str('234')
83
 
    [<RevisionSpec_int 234>]
 
78
    [234]
84
79
    >>> _parse_revision_str('234..567')
85
 
    [<RevisionSpec_int 234>, <RevisionSpec_int 567>]
 
80
    [234, 567]
86
81
    >>> _parse_revision_str('..')
87
 
    [<RevisionSpec None>, <RevisionSpec None>]
 
82
    [None, None]
88
83
    >>> _parse_revision_str('..234')
89
 
    [<RevisionSpec None>, <RevisionSpec_int 234>]
 
84
    [None, 234]
90
85
    >>> _parse_revision_str('234..')
91
 
    [<RevisionSpec_int 234>, <RevisionSpec None>]
 
86
    [234, None]
92
87
    >>> _parse_revision_str('234..456..789') # Maybe this should be an error
93
 
    [<RevisionSpec_int 234>, <RevisionSpec_int 456>, <RevisionSpec_int 789>]
 
88
    [234, 456, 789]
94
89
    >>> _parse_revision_str('234....789') # Error?
95
 
    [<RevisionSpec_int 234>, <RevisionSpec None>, <RevisionSpec_int 789>]
 
90
    [234, None, 789]
96
91
    >>> _parse_revision_str('revid:test@other.com-234234')
97
 
    [<RevisionSpec_revid revid:test@other.com-234234>]
 
92
    ['revid:test@other.com-234234']
98
93
    >>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
99
 
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_revid revid:test@other.com-234235>]
 
94
    ['revid:test@other.com-234234', 'revid:test@other.com-234235']
100
95
    >>> _parse_revision_str('revid:test@other.com-234234..23')
101
 
    [<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_int 23>]
 
96
    ['revid:test@other.com-234234', 23]
102
97
    >>> _parse_revision_str('date:2005-04-12')
103
 
    [<RevisionSpec_date date:2005-04-12>]
 
98
    ['date:2005-04-12']
104
99
    >>> _parse_revision_str('date:2005-04-12 12:24:33')
105
 
    [<RevisionSpec_date date:2005-04-12 12:24:33>]
 
100
    ['date:2005-04-12 12:24:33']
106
101
    >>> _parse_revision_str('date:2005-04-12T12:24:33')
107
 
    [<RevisionSpec_date date:2005-04-12T12:24:33>]
 
102
    ['date:2005-04-12T12:24:33']
108
103
    >>> _parse_revision_str('date:2005-04-12,12:24:33')
109
 
    [<RevisionSpec_date date:2005-04-12,12:24:33>]
 
104
    ['date:2005-04-12,12:24:33']
110
105
    >>> _parse_revision_str('-5..23')
111
 
    [<RevisionSpec_int -5>, <RevisionSpec_int 23>]
 
106
    [-5, 23]
112
107
    >>> _parse_revision_str('-5')
113
 
    [<RevisionSpec_int -5>]
 
108
    [-5]
114
109
    >>> _parse_revision_str('123a')
115
 
    Traceback (most recent call last):
116
 
      ...
117
 
    BzrError: No namespace registered for string: '123a'
 
110
    ['123a']
118
111
    >>> _parse_revision_str('abc')
119
 
    Traceback (most recent call last):
120
 
      ...
121
 
    BzrError: No namespace registered for string: 'abc'
 
112
    ['abc']
122
113
    """
123
114
    import re
124
115
    old_format_re = re.compile('\d*:\d*')
125
116
    m = old_format_re.match(revstr)
126
 
    revs = []
127
117
    if m:
128
118
        warning('Colon separator for revision numbers is deprecated.'
129
119
                ' Use .. instead')
 
120
        revs = []
130
121
        for rev in revstr.split(':'):
131
122
            if rev:
132
 
                revs.append(RevisionSpec(int(rev)))
133
 
            else:
134
 
                revs.append(RevisionSpec(None))
135
 
    else:
136
 
        for x in revstr.split('..'):
137
 
            if not x:
138
 
                revs.append(RevisionSpec(None))
139
 
            else:
140
 
                revs.append(RevisionSpec(x))
 
123
                revs.append(int(rev))
 
124
            else:
 
125
                revs.append(None)
 
126
        return revs
 
127
    revs = []
 
128
    for x in revstr.split('..'):
 
129
        if not x:
 
130
            revs.append(None)
 
131
        else:
 
132
            try:
 
133
                revs.append(int(x))
 
134
            except ValueError:
 
135
                revs.append(x)
141
136
    return revs
142
137
 
143
138
 
 
139
def get_merge_type(typestring):
 
140
    """Attempt to find the merge class/factory associated with a string."""
 
141
    from merge import merge_types
 
142
    try:
 
143
        return merge_types[typestring][0]
 
144
    except KeyError:
 
145
        templ = '%s%%7s: %%s' % (' '*12)
 
146
        lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
 
147
        type_list = '\n'.join(lines)
 
148
        msg = "No known merge type %s. Supported types are:\n%s" %\
 
149
            (typestring, type_list)
 
150
        raise BzrCommandError(msg)
 
151
    
 
152
 
144
153
def _builtin_commands():
145
154
    import bzrlib.builtins
146
155
    r = {}
333
342
    return parsed
334
343
 
335
344
 
 
345
 
 
346
 
336
347
# list of all available options; the rhs can be either None for an
337
348
# option that takes no argument, or a constructor function that checks
338
349
# the type.
339
350
OPTIONS = {
340
351
    'all':                    None,
341
 
    'basis':                  str,
342
352
    'diff-options':           str,
343
353
    'help':                   None,
344
354
    'file':                   unicode,
360
370
    'long':                   None,
361
371
    'root':                   str,
362
372
    'no-backup':              None,
 
373
    'merge-type':             get_merge_type,
363
374
    'pattern':                str,
364
375
    }
365
376
 
392
403
    >>> parse_args('commit --message=biter'.split())
393
404
    (['commit'], {'message': u'biter'})
394
405
    >>> parse_args('log -r 500'.split())
395
 
    (['log'], {'revision': [<RevisionSpec_int 500>]})
 
406
    (['log'], {'revision': [500]})
396
407
    >>> parse_args('log -r500..600'.split())
397
 
    (['log'], {'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
 
408
    (['log'], {'revision': [500, 600]})
398
409
    >>> parse_args('log -vr500..600'.split())
399
 
    (['log'], {'verbose': True, 'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
400
 
    >>> parse_args('log -rrevno:500..600'.split()) #the r takes an argument
401
 
    (['log'], {'revision': [<RevisionSpec_revno revno:500>, <RevisionSpec_int 600>]})
 
410
    (['log'], {'verbose': True, 'revision': [500, 600]})
 
411
    >>> parse_args('log -rv500..600'.split()) #the r takes an argument
 
412
    (['log'], {'revision': ['v500', 600]})
402
413
    """
403
414
    args = []
404
415
    opts = {}
624
635
    bzrlib.trace.log_startup(argv)
625
636
    bzrlib.ui.ui_factory = bzrlib.ui.TextUIFactory()
626
637
 
627
 
    return run_bzr_catch_errors(argv[1:])
628
 
 
629
 
 
630
 
def run_bzr_catch_errors(argv):
631
638
    try:
632
639
        try:
633
 
            try:
634
 
                return run_bzr(argv)
635
 
            finally:
636
 
                # do this here inside the exception wrappers to catch EPIPE
637
 
                sys.stdout.flush()
638
 
        #wrap common errors as CommandErrors.
639
 
        except (NotBranchError,), e:
640
 
            raise BzrCommandError(str(e))
 
640
            return run_bzr(argv[1:])
 
641
        finally:
 
642
            # do this here inside the exception wrappers to catch EPIPE
 
643
            sys.stdout.flush()
641
644
    except BzrCommandError, e:
642
645
        # command line syntax error, etc
643
646
        log_error(str(e))