69
70
def _parse_revision_str(revstr):
70
71
"""This handles a revision string -> revno.
72
This always returns a list. The list will have one element for
74
It supports integers directly, but everything else it
75
defers for passing to Branch.get_revision_info()
73
This always returns a list. The list will have one element for
74
each revision specifier supplied.
77
76
>>> _parse_revision_str('234')
77
[<RevisionSpec_int 234>]
79
78
>>> _parse_revision_str('234..567')
79
[<RevisionSpec_int 234>, <RevisionSpec_int 567>]
81
80
>>> _parse_revision_str('..')
81
[<RevisionSpec None>, <RevisionSpec None>]
83
82
>>> _parse_revision_str('..234')
83
[<RevisionSpec None>, <RevisionSpec_int 234>]
85
84
>>> _parse_revision_str('234..')
85
[<RevisionSpec_int 234>, <RevisionSpec None>]
87
86
>>> _parse_revision_str('234..456..789') # Maybe this should be an error
89
>>> _parse_revision_str('234....789') # Error?
87
[<RevisionSpec_int 234>, <RevisionSpec_int 456>, <RevisionSpec_int 789>]
88
>>> _parse_revision_str('234....789') #Error ?
89
[<RevisionSpec_int 234>, <RevisionSpec None>, <RevisionSpec_int 789>]
91
90
>>> _parse_revision_str('revid:test@other.com-234234')
92
['revid:test@other.com-234234']
91
[<RevisionSpec_revid revid:test@other.com-234234>]
93
92
>>> _parse_revision_str('revid:test@other.com-234234..revid:test@other.com-234235')
94
['revid:test@other.com-234234', 'revid:test@other.com-234235']
93
[<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_revid revid:test@other.com-234235>]
95
94
>>> _parse_revision_str('revid:test@other.com-234234..23')
96
['revid:test@other.com-234234', 23]
95
[<RevisionSpec_revid revid:test@other.com-234234>, <RevisionSpec_int 23>]
97
96
>>> _parse_revision_str('date:2005-04-12')
97
[<RevisionSpec_date date:2005-04-12>]
99
98
>>> _parse_revision_str('date:2005-04-12 12:24:33')
100
['date:2005-04-12 12:24:33']
99
[<RevisionSpec_date date:2005-04-12 12:24:33>]
101
100
>>> _parse_revision_str('date:2005-04-12T12:24:33')
102
['date:2005-04-12T12:24:33']
101
[<RevisionSpec_date date:2005-04-12T12:24:33>]
103
102
>>> _parse_revision_str('date:2005-04-12,12:24:33')
104
['date:2005-04-12,12:24:33']
103
[<RevisionSpec_date date:2005-04-12,12:24:33>]
105
104
>>> _parse_revision_str('-5..23')
105
[<RevisionSpec_int -5>, <RevisionSpec_int 23>]
107
106
>>> _parse_revision_str('-5')
107
[<RevisionSpec_int -5>]
109
108
>>> _parse_revision_str('123a')
109
Traceback (most recent call last):
111
BzrError: No namespace registered for string: '123a'
111
112
>>> _parse_revision_str('abc')
113
Traceback (most recent call last):
115
BzrError: No namespace registered for string: 'abc'
116
>>> _parse_revision_str('branch:../branch2')
117
[<RevisionSpec_branch branch:../branch2>]
115
120
old_format_re = re.compile('\d*:\d*')
116
121
m = old_format_re.match(revstr)
118
124
warning('Colon separator for revision numbers is deprecated.'
119
125
' Use .. instead')
121
126
for rev in revstr.split(':'):
123
revs.append(int(rev))
128
for x in revstr.split('..'):
128
revs.append(RevisionSpec(int(rev)))
130
revs.append(RevisionSpec(None))
133
for x in revstr.split('..'):
135
revs.append(RevisionSpec(None))
137
# looks like a namespace:.. has happened
138
next_prefix = x + '..'
140
if next_prefix is not None:
142
revs.append(RevisionSpec(x))
144
if next_prefix is not None:
145
revs.append(RevisionSpec(next_prefix))
139
def get_merge_type(typestring):
140
"""Attempt to find the merge class/factory associated with a string."""
141
from merge import merge_types
143
return merge_types[typestring][0]
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)
153
def get_merge_type(typestring):
154
"""Attempt to find the merge class/factory associated with a string."""
155
from merge import merge_types
157
return merge_types[typestring][0]
159
templ = '%s%%7s: %%s' % (' '*12)
160
lines = [templ % (f[0], f[1][1]) for f in merge_types.iteritems()]
161
type_list = '\n'.join(lines)
162
msg = "No known merge type %s. Supported types are:\n%s" %\
163
(typestring, type_list)
164
raise BzrCommandError(msg)
167
149
def _builtin_commands():
168
150
import bzrlib.builtins
417
400
>>> parse_args('commit --message=biter'.split())
418
401
(['commit'], {'message': u'biter'})
419
402
>>> parse_args('log -r 500'.split())
420
(['log'], {'revision': [500]})
403
(['log'], {'revision': [<RevisionSpec_int 500>]})
421
404
>>> parse_args('log -r500..600'.split())
422
(['log'], {'revision': [500, 600]})
405
(['log'], {'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
423
406
>>> parse_args('log -vr500..600'.split())
424
(['log'], {'verbose': True, 'revision': [500, 600]})
425
>>> parse_args('log -rv500..600'.split()) #the r takes an argument
426
(['log'], {'revision': ['v500', 600]})
407
(['log'], {'verbose': True, 'revision': [<RevisionSpec_int 500>, <RevisionSpec_int 600>]})
408
>>> parse_args('log -rrevno:500..600'.split()) #the r takes an argument
409
(['log'], {'revision': [<RevisionSpec_revno revno:500>, <RevisionSpec_int 600>]})