17
17
"""Exceptions for bzr, and reporting of them.
26
from bzrlib.i18n import gettext
27
from bzrlib.patches import (
36
20
# TODO: is there any value in providing the .args field used by standard
37
21
# python exceptions? A list of values with no names seems less useful
109
93
# __str__() should always return a 'str' object
110
94
# never a 'unicode' object.
112
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
113
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
114
% (self.__class__.__name__,
116
getattr(self, '_fmt', None),
97
pass # just bind to 'e' for formatting below
100
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
101
% (self.__class__.__name__,
103
getattr(self, '_fmt', None),
119
106
def __unicode__(self):
120
107
u = self._format()
143
130
"""Return format string for this exception or None"""
144
131
fmt = getattr(self, '_fmt', None)
145
132
if fmt is not None:
147
unicode_fmt = unicode(fmt) #_fmt strings should be ascii
148
if type(fmt) == unicode:
149
trace.mutter("Unicode strings in error.fmt are deprecated")
150
return gettext(unicode_fmt)
151
fmt = getattr(self, '__doc__', None)
153
symbol_versioning.warn("%s uses its docstring as a format, "
154
"it should use _fmt instead" % self.__class__.__name__,
157
return 'Unprintable exception %s: dict=%r, fmt=%r' \
158
% (self.__class__.__name__,
160
getattr(self, '_fmt', None),
133
from bzrlib.i18n import gettext
134
return gettext(unicode(fmt)) # _fmt strings should be ascii
163
136
def __eq__(self, other):
164
137
if self.__class__ is not other.__class__:
177
150
internal_error = True
180
class BzrNewError(BzrError):
181
"""Deprecated error base class."""
182
# base classes should override the docstring with their human-
183
# readable explanation
185
def __init__(self, *args, **kwds):
186
# XXX: Use the underlying BzrError to always generate the args
187
# attribute if it doesn't exist. We can't use super here, because
188
# exceptions are old-style classes in python2.4 (but new in 2.5).
190
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
191
'please convert %s to use BzrError instead'
192
% self.__class__.__name__,
195
BzrError.__init__(self, *args)
196
for key, value in kwds.items():
197
setattr(self, key, value)
201
# __str__() should always return a 'str' object
202
# never a 'unicode' object.
203
s = self.__doc__ % self.__dict__
204
if isinstance(s, unicode):
205
return s.encode('utf8')
207
except (TypeError, NameError, ValueError, KeyError), e:
208
return 'Unprintable exception %s(%r): %r' \
209
% (self.__class__.__name__,
213
153
class AlreadyBuilding(BzrError):
215
155
_fmt = "The tree builder is already building a tree."
797
737
self.path = bzrdir.transport.clone('..').base
800
class FileInWrongBranch(BzrError):
802
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
804
# use PathNotChild instead
805
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
806
def __init__(self, branch, path):
807
BzrError.__init__(self)
809
self.branch_base = branch.base
813
740
class UnsupportedFormatError(BzrError):
815
742
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
1228
1155
self.extra = ''
1231
class HistoryMissing(BzrError):
1233
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1236
1158
class AppendRevisionsOnlyViolation(BzrError):
1238
1160
_fmt = ('Operation denied because it would change the main history,'
1303
1225
not_ancestor_id=not_ancestor_id)
1306
class AmbiguousBase(BzrError):
1308
def __init__(self, bases):
1309
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1310
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1311
msg = ("The correct base is unclear, because %s are all equally close"
1313
BzrError.__init__(self, msg)
1317
1228
class NoCommits(BranchError):
1319
1230
_fmt = "Branch %(branch)s has no commits."
2085
1997
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2088
class BzrRemoveChangedFilesError(BzrError):
2089
"""Used when user is trying to remove changed files."""
2091
_fmt = ("Can't safely remove modified or unknown files:\n"
2092
"%(changes_as_text)s"
2093
"Use --keep to not delete them, or --force to delete them regardless.")
2095
def __init__(self, tree_delta):
2096
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2097
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2098
BzrError.__init__(self)
2099
self.changes_as_text = tree_delta.get_changes_as_text()
2100
#self.paths_as_string = '\n'.join(changed_files)
2101
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2104
2000
class BzrBadParameterNotString(BzrBadParameter):
2106
2002
_fmt = "Parameter %(param)s is not a string or unicode string."
3107
3003
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3110
class HookFailed(BzrError):
3111
"""Raised when a pre_change_branch_tip hook function fails anything other
3112
than TipChangeRejected.
3114
Note that this exception is no longer raised, and the import is only left
3115
to be nice to code which might catch it in a plugin.
3118
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3119
"%(traceback_text)s%(exc_value)s")
3121
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3123
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3124
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3126
self.hook_stage = hook_stage
3127
self.hook_name = hook_name
3128
self.exc_info = exc_info
3129
self.exc_type = exc_info[0]
3130
self.exc_value = exc_info[1]
3131
self.exc_tb = exc_info[2]
3132
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3135
3006
class TipChangeRejected(BzrError):
3136
3007
"""A pre_change_branch_tip hook function may raise this to cleanly and
3137
3008
explicitly abort a change to a branch tip.
3367
3238
self.from_kind = from_kind
3368
3239
self.to_kind = to_kind
3369
3240
self.format = format
3243
class PatchSyntax(BzrError):
3244
"""Base class for patch syntax errors."""
3247
class BinaryFiles(BzrError):
3249
_fmt = 'Binary files section encountered.'
3251
def __init__(self, orig_name, mod_name):
3252
self.orig_name = orig_name
3253
self.mod_name = mod_name
3256
class MalformedPatchHeader(PatchSyntax):
3258
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3260
def __init__(self, desc, line):
3265
class MalformedHunkHeader(PatchSyntax):
3267
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3269
def __init__(self, desc, line):
3274
class MalformedLine(PatchSyntax):
3276
_fmt = "Malformed line. %(desc)s\n%(line)r"
3278
def __init__(self, desc, line):
3283
class PatchConflict(BzrError):
3285
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3286
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3288
def __init__(self, line_no, orig_line, patch_line):
3289
self.line_no = line_no
3290
self.orig_line = orig_line.rstrip('\n')
3291
self.patch_line = patch_line.rstrip('\n')