106
95
# __str__() should always return a 'str' object
107
96
# never a 'unicode' object.
109
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
110
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
111
% (self.__class__.__name__,
113
getattr(self, '_fmt', None),
99
pass # just bind to 'e' for formatting below
102
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
103
% (self.__class__.__name__,
105
getattr(self, '_fmt', None),
116
108
def __unicode__(self):
117
109
u = self._format()
140
132
"""Return format string for this exception or None"""
141
133
fmt = getattr(self, '_fmt', None)
142
134
if fmt is not None:
144
fmt = getattr(self, '__doc__', None)
146
symbol_versioning.warn("%s uses its docstring as a format, "
147
"it should use _fmt instead" % self.__class__.__name__,
150
return 'Unprintable exception %s: dict=%r, fmt=%r' \
151
% (self.__class__.__name__,
153
getattr(self, '_fmt', None),
135
from bzrlib.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
156
138
def __eq__(self, other):
157
139
if self.__class__ is not other.__class__:
170
152
internal_error = True
173
class BzrNewError(BzrError):
174
"""Deprecated error base class."""
175
# base classes should override the docstring with their human-
176
# readable explanation
178
def __init__(self, *args, **kwds):
179
# XXX: Use the underlying BzrError to always generate the args
180
# attribute if it doesn't exist. We can't use super here, because
181
# exceptions are old-style classes in python2.4 (but new in 2.5).
183
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
184
'please convert %s to use BzrError instead'
185
% self.__class__.__name__,
188
BzrError.__init__(self, *args)
189
for key, value in kwds.items():
190
setattr(self, key, value)
194
# __str__() should always return a 'str' object
195
# never a 'unicode' object.
196
s = self.__doc__ % self.__dict__
197
if isinstance(s, unicode):
198
return s.encode('utf8')
200
except (TypeError, NameError, ValueError, KeyError), e:
201
return 'Unprintable exception %s(%r): %r' \
202
% (self.__class__.__name__,
206
155
class AlreadyBuilding(BzrError):
208
157
_fmt = "The tree builder is already building a tree."
751
700
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
703
class AlreadyControlDirError(PathError):
705
_fmt = 'A control directory already exists: "%(path)s".'
754
708
class AlreadyBranchError(PathError):
756
710
_fmt = 'Already a branch: "%(path)s".'
713
class ParentBranchExists(AlreadyBranchError):
715
_fmt = 'Parent branch already exists: "%(path)s".'
759
718
class BranchExistsWithoutWorkingTree(PathError):
761
720
_fmt = 'Directory contains a branch, but no working tree \
790
749
self.path = bzrdir.transport.clone('..').base
793
class FileInWrongBranch(BzrError):
795
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
797
# use PathNotChild instead
798
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
799
def __init__(self, branch, path):
800
BzrError.__init__(self)
802
self.branch_base = branch.base
806
752
class UnsupportedFormatError(BzrError):
808
754
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
1140
1098
BzrError.__init__(self, files=files, files_str=files_str)
1101
class ExcludesUnsupported(BzrError):
1103
_fmt = ('Excluding paths during commit is not supported by '
1104
'repository at %(repository)r.')
1106
def __init__(self, repository):
1107
BzrError.__init__(self, repository=repository)
1143
1110
class BadCommitMessageEncoding(BzrError):
1145
1112
_fmt = 'The specified commit message contains characters unsupported by '\
1287
1249
not_ancestor_id=not_ancestor_id)
1290
class AmbiguousBase(BzrError):
1292
def __init__(self, bases):
1293
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1294
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1295
msg = ("The correct base is unclear, because %s are all equally close"
1297
BzrError.__init__(self, msg)
1301
1252
class NoCommits(BranchError):
1303
1254
_fmt = "Branch %(branch)s has no commits."
1707
1665
class InvalidHttpResponse(TransportError):
1709
_fmt = "Invalid http response for %(path)s: %(msg)s"
1667
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1711
1669
def __init__(self, path, msg, orig_error=None):
1712
1670
self.path = path
1671
if orig_error is None:
1674
# This is reached for obscure and unusual errors so we want to
1675
# preserve as much info as possible to ease debug.
1676
orig_error = ': %r' % (orig_error,)
1713
1677
TransportError.__init__(self, msg, orig_error=orig_error)
1680
class CertificateError(TransportError):
1682
_fmt = "Certificate error: %(error)s"
1684
def __init__(self, error):
1716
1688
class InvalidHttpRange(InvalidHttpResponse):
1718
1690
_fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1722
1694
InvalidHttpResponse.__init__(self, path, msg)
1697
class HttpBoundaryMissing(InvalidHttpResponse):
1698
"""A multipart response ends with no boundary marker.
1700
This is a special case caused by buggy proxies, described in
1701
<https://bugs.launchpad.net/bzr/+bug/198646>.
1704
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1706
def __init__(self, path, msg):
1707
InvalidHttpResponse.__init__(self, path, msg)
1725
1710
class InvalidHttpContentType(InvalidHttpResponse):
1727
1712
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1755
1740
_fmt = "Working tree has conflicts."
1743
class ConfigContentError(BzrError):
1745
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1747
def __init__(self, filename):
1748
BzrError.__init__(self)
1749
self.filename = filename
1758
1752
class ParseConfigError(BzrError):
1754
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1760
1756
def __init__(self, errors, filename):
1761
if filename is None:
1763
message = "Error(s) parsing config file %s:\n%s" % \
1764
(filename, ('\n'.join(e.msg for e in errors)))
1765
BzrError.__init__(self, message)
1757
BzrError.__init__(self)
1758
self.filename = filename
1759
self.errors = '\n'.join(e.msg for e in errors)
1762
class ConfigOptionValueError(BzrError):
1764
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1765
'See ``bzr help %(name)s``')
1767
def __init__(self, name, value):
1768
BzrError.__init__(self, name=name, value=value)
1768
1771
class NoEmailInUsername(BzrError):
1777
1780
class SigningFailed(BzrError):
1779
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1782
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1781
1784
def __init__(self, command_line):
1782
1785
BzrError.__init__(self, command_line=command_line)
1788
class SignatureVerificationFailed(BzrError):
1790
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1792
def __init__(self, error):
1793
BzrError.__init__(self, error=error)
1796
class DependencyNotPresent(BzrError):
1798
_fmt = 'Unable to import library "%(library)s": %(error)s'
1800
def __init__(self, library, error):
1801
BzrError.__init__(self, library=library, error=error)
1804
class GpgmeNotInstalled(DependencyNotPresent):
1806
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1808
def __init__(self, error):
1809
DependencyNotPresent.__init__(self, 'gpgme', error)
1785
1812
class WorkingTreeNotRevision(BzrError):
1787
1814
_fmt = ("The working tree for %(basedir)s has changed since"
2003
2030
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2006
class BzrRemoveChangedFilesError(BzrError):
2007
"""Used when user is trying to remove changed files."""
2009
_fmt = ("Can't safely remove modified or unknown files:\n"
2010
"%(changes_as_text)s"
2011
"Use --keep to not delete them, or --force to delete them regardless.")
2013
def __init__(self, tree_delta):
2014
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2015
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2016
BzrError.__init__(self)
2017
self.changes_as_text = tree_delta.get_changes_as_text()
2018
#self.paths_as_string = '\n'.join(changed_files)
2019
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2022
2033
class BzrBadParameterNotString(BzrBadParameter):
2024
2035
_fmt = "Parameter %(param)s is not a string or unicode string."
2657
2668
This is distinct from ErrorFromSmartServer so that it is possible to
2658
2669
distinguish between the following two cases:
2659
- ErrorFromSmartServer was uncaught. This is logic error in the client
2660
and so should provoke a traceback to the user.
2661
- ErrorFromSmartServer was caught but its error_tuple could not be
2662
translated. This is probably because the server sent us garbage, and
2663
should not provoke a traceback.
2671
- ErrorFromSmartServer was uncaught. This is logic error in the client
2672
and so should provoke a traceback to the user.
2673
- ErrorFromSmartServer was caught but its error_tuple could not be
2674
translated. This is probably because the server sent us garbage, and
2675
should not provoke a traceback.
2666
2678
_fmt = "Server sent an unexpected error: %(error_tuple)r"
3024
3028
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3027
class HookFailed(BzrError):
3028
"""Raised when a pre_change_branch_tip hook function fails anything other
3029
than TipChangeRejected.
3031
Note that this exception is no longer raised, and the import is only left
3032
to be nice to code which might catch it in a plugin.
3035
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3036
"%(traceback_text)s%(exc_value)s")
3038
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3040
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3041
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3043
self.hook_stage = hook_stage
3044
self.hook_name = hook_name
3045
self.exc_info = exc_info
3046
self.exc_type = exc_info[0]
3047
self.exc_value = exc_info[1]
3048
self.exc_tb = exc_info[2]
3049
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3052
3031
class TipChangeRejected(BzrError):
3053
3032
"""A pre_change_branch_tip hook function may raise this to cleanly and
3054
3033
explicitly abort a change to a branch tip.
3225
3216
# FIXME: I would prefer to define the config related exception classes in
3226
3217
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3227
class InterpolationLoop(BzrError):
3218
class OptionExpansionLoop(BzrError):
3229
_fmt = 'Loop involving %(refs)r while evaluating "%(string)s".'
3220
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3231
3222
def __init__(self, string, refs):
3232
3223
self.string = string
3233
3224
self.refs = '->'.join(refs)
3236
class InterpolationUnknownOption(BzrError):
3227
class ExpandingUnknownOption(BzrError):
3238
_fmt = 'Option %(name)s is not defined while interpolating "%(string)s".'
3229
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3240
3231
def __init__(self, name, string):
3241
3232
self.name = name
3242
3233
self.string = string
3236
class NoCompatibleInter(BzrError):
3238
_fmt = ('No compatible object available for operations from %(source)r '
3241
def __init__(self, source, target):
3242
self.source = source
3243
self.target = target
3246
class HpssVfsRequestNotAllowed(BzrError):
3248
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3249
"%(method)s, %(arguments)s.")
3251
def __init__(self, method, arguments):
3252
self.method = method
3253
self.arguments = arguments
3256
class UnsupportedKindChange(BzrError):
3258
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3259
"%(path)s not supported by format %(format)r")
3261
def __init__(self, path, from_kind, to_kind, format):
3263
self.from_kind = from_kind
3264
self.to_kind = to_kind
3265
self.format = format
3268
class MissingFeature(BzrError):
3270
_fmt = ("Missing feature %(feature)s not provided by this "
3271
"version of Bazaar or any plugin.")
3273
def __init__(self, feature):
3274
self.feature = feature
3277
class PatchSyntax(BzrError):
3278
"""Base class for patch syntax errors."""
3281
class BinaryFiles(BzrError):
3283
_fmt = 'Binary files section encountered.'
3285
def __init__(self, orig_name, mod_name):
3286
self.orig_name = orig_name
3287
self.mod_name = mod_name
3290
class MalformedPatchHeader(PatchSyntax):
3292
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3294
def __init__(self, desc, line):
3299
class MalformedHunkHeader(PatchSyntax):
3301
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3303
def __init__(self, desc, line):
3308
class MalformedLine(PatchSyntax):
3310
_fmt = "Malformed line. %(desc)s\n%(line)r"
3312
def __init__(self, desc, line):
3317
class PatchConflict(BzrError):
3319
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3320
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3322
def __init__(self, line_no, orig_line, patch_line):
3323
self.line_no = line_no
3324
self.orig_line = orig_line.rstrip('\n')
3325
self.patch_line = patch_line.rstrip('\n')
3328
class FeatureAlreadyRegistered(BzrError):
3330
_fmt = 'The feature %(feature)s has already been registered.'
3332
def __init__(self, feature):
3333
self.feature = feature