82
93
for key, value in kwds.items():
83
94
setattr(self, key, value)
86
97
s = getattr(self, '_preformatted_string', None)
88
# contains a preformatted message
99
# contains a preformatted message; must be cast to plain str
91
102
fmt = self._get_format_string()
93
104
d = dict(self.__dict__)
105
# special case: python2.5 puts the 'message' attribute in a
106
# slot, so it isn't seen in __dict__
107
d['message'] = getattr(self, 'message', 'no message')
95
109
# __str__() should always return a 'str' object
96
110
# never a 'unicode' object.
111
if isinstance(s, unicode):
112
return s.encode('utf8')
99
pass # just bind to 'e' for formatting below
102
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
114
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
115
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
116
% (self.__class__.__name__,
118
getattr(self, '_fmt', None),
121
def _get_format_string(self):
122
"""Return format string for this exception or None"""
123
fmt = getattr(self, '_fmt', None)
126
fmt = getattr(self, '__doc__', None)
128
symbol_versioning.warn("%s uses its docstring as a format, "
129
"it should use _fmt instead" % self.__class__.__name__,
132
return 'Unprintable exception %s: dict=%r, fmt=%r' \
103
133
% (self.__class__.__name__,
105
135
getattr(self, '_fmt', None),
108
def __unicode__(self):
110
if isinstance(u, str):
111
# Try decoding the str using the default encoding.
113
elif not isinstance(u, unicode):
114
# Try to make a unicode object from it, because __unicode__ must
115
# return a unicode object.
121
if isinstance(s, unicode):
124
# __str__ must return a str.
129
return '%s(%s)' % (self.__class__.__name__, str(self))
131
def _get_format_string(self):
132
"""Return format string for this exception or None"""
133
fmt = getattr(self, '_fmt', None)
135
from bzrlib.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
138
def __eq__(self, other):
139
if self.__class__ is not other.__class__:
140
return NotImplemented
141
return self.__dict__ == other.__dict__
144
139
class InternalBzrError(BzrError):
1730
1561
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1732
def __init__(self, source, target, is_permanent=False):
1563
def __init__(self, source, target, is_permanent=False, qual_proto=None):
1733
1564
self.source = source
1734
1565
self.target = target
1735
1566
if is_permanent:
1736
1567
self.permanently = ' permanently'
1738
1569
self.permanently = ''
1570
self._qualified_proto = qual_proto
1739
1571
TransportError.__init__(self)
1573
def _requalify_url(self, url):
1574
"""Restore the qualified proto in front of the url"""
1575
# When this exception is raised, source and target are in
1576
# user readable format. But some transports may use a
1577
# different proto (http+urllib:// will present http:// to
1578
# the user. If a qualified proto is specified, the code
1579
# trapping the exception can get the qualified urls to
1580
# properly handle the redirection themself (creating a
1581
# new transport object from the target url for example).
1582
# But checking that the scheme of the original and
1583
# redirected urls are the same can be tricky. (see the
1584
# FIXME in BzrDir.open_from_transport for the unique use
1586
if self._qualified_proto is None:
1589
# The TODO related to NotBranchError mention that doing
1590
# that kind of manipulation on the urls may not be the
1591
# exception object job. On the other hand, this object is
1592
# the interface between the code and the user so
1593
# presenting the urls in different ways is indeed its
1596
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1597
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1600
def get_source_url(self):
1601
return self._requalify_url(self.source)
1603
def get_target_url(self):
1604
return self._requalify_url(self.target)
1742
1607
class TooManyRedirections(TransportError):
2982
2687
'user encoding %(user_encoding)s')
2984
2689
def __init__(self, path, kind):
2985
from bzrlib.osutils import get_user_encoding
2986
2690
self.path = path
2987
2691
self.kind = kind
2988
self.user_encoding = get_user_encoding()
2991
class NoSuchConfig(BzrError):
2993
_fmt = ('The "%(config_id)s" configuration does not exist.')
2995
def __init__(self, config_id):
2996
BzrError.__init__(self, config_id=config_id)
2999
class NoSuchConfigOption(BzrError):
3001
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3003
def __init__(self, option_name):
3004
BzrError.__init__(self, option_name=option_name)
3007
class NoSuchAlias(BzrError):
3009
_fmt = ('The alias "%(alias_name)s" does not exist.')
3011
def __init__(self, alias_name):
3012
BzrError.__init__(self, alias_name=alias_name)
3015
class DirectoryLookupFailure(BzrError):
3016
"""Base type for lookup errors."""
3021
class InvalidLocationAlias(DirectoryLookupFailure):
3023
_fmt = '"%(alias_name)s" is not a valid location alias.'
3025
def __init__(self, alias_name):
3026
DirectoryLookupFailure.__init__(self, alias_name=alias_name)
3029
class UnsetLocationAlias(DirectoryLookupFailure):
3031
_fmt = 'No %(alias_name)s location assigned.'
3033
def __init__(self, alias_name):
3034
DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
3037
class CannotBindAddress(BzrError):
3039
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
3041
def __init__(self, host, port, orig_error):
3042
# nb: in python2.4 socket.error doesn't have a useful repr
3043
BzrError.__init__(self, host=host, port=port,
3044
orig_error=repr(orig_error.args))
3047
class UnknownRules(BzrError):
3049
_fmt = ('Unknown rules detected: %(unknowns_str)s.')
3051
def __init__(self, unknowns):
3052
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3055
class TipChangeRejected(BzrError):
3056
"""A pre_change_branch_tip hook function may raise this to cleanly and
3057
explicitly abort a change to a branch tip.
3060
_fmt = u"Tip change rejected: %(msg)s"
3062
def __init__(self, msg):
3066
class ShelfCorrupt(BzrError):
3068
_fmt = "Shelf corrupt."
3071
class DecompressCorruption(BzrError):
3073
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3075
def __init__(self, orig_error=None):
3076
if orig_error is not None:
3077
self.orig_error = ", %s" % (orig_error,)
3079
self.orig_error = ""
3080
BzrError.__init__(self)
3083
class NoSuchShelfId(BzrError):
3085
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3087
def __init__(self, shelf_id):
3088
BzrError.__init__(self, shelf_id=shelf_id)
3091
class InvalidShelfId(BzrError):
3093
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
3095
def __init__(self, invalid_id):
3096
BzrError.__init__(self, invalid_id=invalid_id)
3099
class JailBreak(BzrError):
3101
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
3103
def __init__(self, url):
3104
BzrError.__init__(self, url=url)
3107
class UserAbort(BzrError):
3109
_fmt = 'The user aborted the operation.'
3112
class MustHaveWorkingTree(BzrError):
3114
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
3116
def __init__(self, format, url):
3117
BzrError.__init__(self, format=format, url=url)
3120
class NoSuchView(BzrError):
3121
"""A view does not exist.
3124
_fmt = u"No such view: %(view_name)s."
3126
def __init__(self, view_name):
3127
self.view_name = view_name
3130
class ViewsNotSupported(BzrError):
3131
"""Views are not supported by a tree format.
3134
_fmt = ("Views are not supported by %(tree)s;"
3135
" use 'bzr upgrade' to change your tree to a later format.")
3137
def __init__(self, tree):
3141
class FileOutsideView(BzrError):
3143
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3146
def __init__(self, file_name, view_files):
3147
self.file_name = file_name
3148
self.view_str = ", ".join(view_files)
3151
class UnresumableWriteGroup(BzrError):
3153
_fmt = ("Repository %(repository)s cannot resume write group "
3154
"%(write_groups)r: %(reason)s")
3156
internal_error = True
3158
def __init__(self, repository, write_groups, reason):
3159
self.repository = repository
3160
self.write_groups = write_groups
3161
self.reason = reason
3164
class UnsuspendableWriteGroup(BzrError):
3166
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3168
internal_error = True
3170
def __init__(self, repository):
3171
self.repository = repository
3174
class LossyPushToSameVCS(BzrError):
3176
_fmt = ("Lossy push not possible between %(source_branch)r and "
3177
"%(target_branch)r that are in the same VCS.")
3179
internal_error = True
3181
def __init__(self, source_branch, target_branch):
3182
self.source_branch = source_branch
3183
self.target_branch = target_branch
3186
class NoRoundtrippingSupport(BzrError):
3188
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3189
"%(target_branch)r.")
3191
internal_error = True
3193
def __init__(self, source_branch, target_branch):
3194
self.source_branch = source_branch
3195
self.target_branch = target_branch
3198
class FileTimestampUnavailable(BzrError):
3200
_fmt = "The filestamp for %(path)s is not available."
3202
internal_error = True
3204
def __init__(self, path):
3208
class NoColocatedBranchSupport(BzrError):
3210
_fmt = ("%(bzrdir)r does not support co-located branches.")
3212
def __init__(self, bzrdir):
3213
self.bzrdir = bzrdir
3216
class NoWhoami(BzrError):
3218
_fmt = ('Unable to determine your name.\n'
3219
"Please, set your name with the 'whoami' command.\n"
3220
'E.g. bzr whoami "Your Name <name@example.com>"')
3223
class InvalidPattern(BzrError):
3225
_fmt = ('Invalid pattern(s) found. %(msg)s')
3227
def __init__(self, msg):
3231
class RecursiveBind(BzrError):
3233
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3234
'Please use `bzr unbind` to fix.')
3236
def __init__(self, branch_url):
3237
self.branch_url = branch_url
3240
# FIXME: I would prefer to define the config related exception classes in
3241
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3242
class OptionExpansionLoop(BzrError):
3244
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3246
def __init__(self, string, refs):
3247
self.string = string
3248
self.refs = '->'.join(refs)
3251
class ExpandingUnknownOption(BzrError):
3253
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3255
def __init__(self, name, string):
3257
self.string = string
3260
class IllegalOptionName(BzrError):
3262
_fmt = 'Option "%(name)s" is not allowed.'
3264
def __init__(self, name):
3268
class NoCompatibleInter(BzrError):
3270
_fmt = ('No compatible object available for operations from %(source)r '
3273
def __init__(self, source, target):
3274
self.source = source
3275
self.target = target
3278
class HpssVfsRequestNotAllowed(BzrError):
3280
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3281
"%(method)s, %(arguments)s.")
3283
def __init__(self, method, arguments):
3284
self.method = method
3285
self.arguments = arguments
3288
class UnsupportedKindChange(BzrError):
3290
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3291
"%(path)s not supported by format %(format)r")
3293
def __init__(self, path, from_kind, to_kind, format):
3295
self.from_kind = from_kind
3296
self.to_kind = to_kind
3297
self.format = format
3300
class MissingFeature(BzrError):
3302
_fmt = ("Missing feature %(feature)s not provided by this "
3303
"version of Bazaar or any plugin.")
3305
def __init__(self, feature):
3306
self.feature = feature
3309
class PatchSyntax(BzrError):
3310
"""Base class for patch syntax errors."""
3313
class BinaryFiles(BzrError):
3315
_fmt = 'Binary files section encountered.'
3317
def __init__(self, orig_name, mod_name):
3318
self.orig_name = orig_name
3319
self.mod_name = mod_name
3322
class MalformedPatchHeader(PatchSyntax):
3324
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3326
def __init__(self, desc, line):
3331
class MalformedHunkHeader(PatchSyntax):
3333
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3335
def __init__(self, desc, line):
3340
class MalformedLine(PatchSyntax):
3342
_fmt = "Malformed line. %(desc)s\n%(line)r"
3344
def __init__(self, desc, line):
3349
class PatchConflict(BzrError):
3351
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3352
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3354
def __init__(self, line_no, orig_line, patch_line):
3355
self.line_no = line_no
3356
self.orig_line = orig_line.rstrip('\n')
3357
self.patch_line = patch_line.rstrip('\n')
3360
class FeatureAlreadyRegistered(BzrError):
3362
_fmt = 'The feature %(feature)s has already been registered.'
3364
def __init__(self, feature):
3365
self.feature = feature
3368
class ChangesAlreadyStored(BzrCommandError):
3370
_fmt = ('Cannot store uncommitted changes because this branch already'
3371
' stores uncommitted changes.')
2692
self.user_encoding = osutils.get_user_encoding()