17
17
"""Exceptions for bzr, and reporting of them.
19
There are 3 different classes of error:
21
* KeyboardInterrupt, and OSError with EPIPE - the program terminates
22
with an appropriate short message
24
* User errors, indicating a problem caused by the user such as a bad URL.
25
These are printed in a short form.
27
* Internal unexpected errors, including most Python builtin errors
28
and some raised from inside bzr. These are printed with a full
29
traceback and an invitation to report the bug.
19
31
Exceptions are caught at a high level to report errors to the user, and
20
32
might also be caught inside the program. Therefore it needs to be
21
33
possible to convert them to a meaningful string, and also for them to be
46
58
* create a new exception class for any class of error that can be
47
usefully distinguished.
49
* the printable form of an exception is generated by the base class
52
Exception strings should start with a capital letter and not have a final
59
usefully distinguished. If no callers are likely to want to catch
60
one but not another, don't worry about them.
62
* the __str__ method should generate something useful; BzrError provides
63
a good default implementation
65
Exception strings should start with a capital letter and should not have a
56
69
from warnings import warn
119
135
class BzrCheckError(BzrNewError):
120
136
"""Internal check failed: %(message)s"""
138
is_user_error = False
122
140
def __init__(self, message):
123
141
BzrNewError.__init__(self)
124
142
self.message = message
127
145
class InvalidEntryName(BzrNewError):
128
146
"""Invalid entry name: %(name)s"""
148
is_user_error = False
129
150
def __init__(self, name):
130
151
BzrNewError.__init__(self)
166
class BzrCommandError(BzrError):
167
# Error from malformed user command
168
# This is being misused as a generic exception
169
# please subclass. RBC 20051030
187
class BzrCommandError(BzrNewError):
188
"""Error from user command"""
192
# Error from malformed user command; please avoid raising this as a
193
# generic exception not caused by user input.
171
195
# I think it's a waste of effort to differentiate between errors that
172
196
# are not intended to be caught anyway. UI code need not subclass
173
197
# BzrCommandError, and non-UI code should not throw a subclass of
174
198
# BzrCommandError. ADHB 20051211
199
def __init__(self, msg):
175
202
def __str__(self):
179
206
class BzrOptionError(BzrCommandError):
180
"""Some missing or otherwise incorrect option was supplied."""
207
"""Error in command line options"""
183
class StrictCommitFailed(Exception):
184
"""Commit refused because there are unknowns in the tree."""
210
class StrictCommitFailed(BzrNewError):
211
"""Commit refused because there are unknown files in the tree"""
187
214
# XXX: Should be unified with TransportError; they seem to represent the
234
261
class PathNotChild(BzrNewError):
235
262
"""Path %(path)r is not a child of path %(base)r%(extra)s"""
264
is_user_error = False
236
266
def __init__(self, path, base, extra=None):
237
267
BzrNewError.__init__(self)
283
class UnsupportedFormatError(BzrError):
284
"""Specified path is a bzr branch that we recognize but cannot read."""
286
return 'unsupported branch format: %s' % self.args[0]
289
class UnknownFormatError(BzrError):
290
"""Specified path is a bzr branch whose format we do not recognize."""
292
return 'unknown branch format: %s' % self.args[0]
313
class UnsupportedFormatError(BzrNewError):
314
"""Unsupported branch format: %(format)s"""
317
class UnknownFormatError(BzrNewError):
318
"""Unknown branch format: %(format)r"""
295
321
class IncompatibleFormat(BzrNewError):
333
359
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
336
class BadFileKindError(BzrError):
337
"""Specified file is of a kind that cannot be added.
339
(For example a symlink or device file.)"""
342
class ForbiddenFileError(BzrError):
343
"""Cannot operate on a file because it is a control file."""
362
class BadFileKindError(BzrNewError):
363
"""Cannot operate on %(filename)s of unsupported kind %(kind)s"""
366
class ForbiddenControlFileError(BzrNewError):
367
"""Cannot operate on %(filename)s because it is a control file"""
346
370
class LockError(BzrNewError):
379
403
class ObjectNotLocked(LockError):
380
404
"""%(obj)r is not locked"""
406
is_user_error = False
381
408
# this can indicate that any particular object is not locked; see also
382
409
# LockNotHeld which means that a particular *lock* object is not held by
383
410
# the caller -- perhaps they should be unified.
445
472
"""Commit refused because there are unknowns in the tree."""
448
class NoSuchRevision(BzrError):
475
class NoSuchRevision(BzrNewError):
476
"""Branch %(branch)s has no revision %(revision)s"""
478
is_user_error = False
449
480
def __init__(self, branch, revision):
450
481
self.branch = branch
451
482
self.revision = revision
452
msg = "Branch %s has no revision %s" % (branch, revision)
453
BzrError.__init__(self, msg)
456
485
class HistoryMissing(BzrError):
461
490
% (branch, object_type, object_id))
464
class DivergedBranches(BzrError):
493
class DivergedBranches(BzrNewError):
494
"These branches have diverged. Use the merge command to reconcile them."""
466
498
def __init__(self, branch1, branch2):
467
BzrError.__init__(self, "These branches have diverged. Try merge.")
468
499
self.branch1 = branch1
469
500
self.branch2 = branch2
472
class UnrelatedBranches(BzrCommandError):
474
msg = "Branches have no common ancestor, and no base revision"\
476
BzrCommandError.__init__(self, msg)
479
class NoCommonAncestor(BzrError):
503
class UnrelatedBranches(BzrNewError):
504
"Branches have no common ancestor, and no merge base revision was specified."
509
class NoCommonAncestor(BzrNewError):
510
"Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
480
512
def __init__(self, revision_a, revision_b):
481
msg = "Revisions have no common ancestor: %s %s." \
482
% (revision_a, revision_b)
483
BzrError.__init__(self, msg)
513
self.revision_a = revision_a
514
self.revision_b = revision_b
486
517
class NoCommonRoot(BzrError):