54
43
Base class for errors raised by bzrlib.
56
45
:cvar internal_error: if True this was probably caused by a bzr bug and
57
should be displayed with a traceback; if False (or absent) this was
58
probably a user or environment error and they don't need the gory details.
59
(That can be overridden by -Derror on the command line.)
46
should be displayed with a traceback; if False (or absent) this was
47
probably a user or environment error and they don't need the gory
48
details. (That can be overridden by -Derror on the command line.)
61
50
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
51
by the instance's dict.
65
54
internal_error = False
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."
723
675
self.bzrdir.open_repository()
724
676
except NoRepositoryPresent:
679
# Just ignore unexpected errors. Raising arbitrary errors
680
# during str(err) can provoke strange bugs. Concretely
681
# Launchpad's codehosting managed to raise NotBranchError
682
# here, and then get stuck in an infinite loop/recursion
683
# trying to str() that error. All this error really cares
684
# about that there's no working repository there, and if
685
# open_repository() fails, there probably isn't.
727
688
self.detail = ': location is a repository'
778
744
self.path = bzrdir.transport.clone('..').base
781
class FileInWrongBranch(BzrError):
783
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
785
# use PathNotChild instead
786
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
787
def __init__(self, branch, path):
788
BzrError.__init__(self)
790
self.branch_base = branch.base
794
747
class UnsupportedFormatError(BzrError):
796
749
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
1116
1093
BzrError.__init__(self, files=files, files_str=files_str)
1096
class ExcludesUnsupported(BzrError):
1098
_fmt = ('Excluding paths during commit is not supported by '
1099
'repository at %(repository)r.')
1101
def __init__(self, repository):
1102
BzrError.__init__(self, repository=repository)
1119
1105
class BadCommitMessageEncoding(BzrError):
1121
1107
_fmt = 'The specified commit message contains characters unsupported by '\
1263
1244
not_ancestor_id=not_ancestor_id)
1266
class AmbiguousBase(BzrError):
1268
def __init__(self, bases):
1269
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1270
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1271
msg = ("The correct base is unclear, because %s are all equally close"
1273
BzrError.__init__(self, msg)
1277
1247
class NoCommits(BranchError):
1279
1249
_fmt = "Branch %(branch)s has no commits."
1683
1660
class InvalidHttpResponse(TransportError):
1685
_fmt = "Invalid http response for %(path)s: %(msg)s"
1662
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1687
1664
def __init__(self, path, msg, orig_error=None):
1688
1665
self.path = path
1666
if orig_error is None:
1669
# This is reached for obscure and unusual errors so we want to
1670
# preserve as much info as possible to ease debug.
1671
orig_error = ': %r' % (orig_error,)
1689
1672
TransportError.__init__(self, msg, orig_error=orig_error)
1675
class CertificateError(TransportError):
1677
_fmt = "Certificate error: %(error)s"
1679
def __init__(self, error):
1692
1683
class InvalidHttpRange(InvalidHttpResponse):
1694
1685
_fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1698
1689
InvalidHttpResponse.__init__(self, path, msg)
1692
class HttpBoundaryMissing(InvalidHttpResponse):
1693
"""A multipart response ends with no boundary marker.
1695
This is a special case caused by buggy proxies, described in
1696
<https://bugs.launchpad.net/bzr/+bug/198646>.
1699
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1701
def __init__(self, path, msg):
1702
InvalidHttpResponse.__init__(self, path, msg)
1701
1705
class InvalidHttpContentType(InvalidHttpResponse):
1703
1707
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1731
1735
_fmt = "Working tree has conflicts."
1738
class ConfigContentError(BzrError):
1740
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1742
def __init__(self, filename):
1743
BzrError.__init__(self)
1744
self.filename = filename
1734
1747
class ParseConfigError(BzrError):
1749
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1736
1751
def __init__(self, errors, filename):
1737
if filename is None:
1739
message = "Error(s) parsing config file %s:\n%s" % \
1740
(filename, ('\n'.join(e.msg for e in errors)))
1741
BzrError.__init__(self, message)
1752
BzrError.__init__(self)
1753
self.filename = filename
1754
self.errors = '\n'.join(e.msg for e in errors)
1757
class ConfigOptionValueError(BzrError):
1759
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1761
def __init__(self, name, value):
1762
BzrError.__init__(self, name=name, value=value)
1744
1765
class NoEmailInUsername(BzrError):
1753
1774
class SigningFailed(BzrError):
1755
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1776
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
1778
def __init__(self, command_line):
1758
1779
BzrError.__init__(self, command_line=command_line)
1782
class SignatureVerificationFailed(BzrError):
1784
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1786
def __init__(self, error):
1787
BzrError.__init__(self, error=error)
1790
class DependencyNotPresent(BzrError):
1792
_fmt = 'Unable to import library "%(library)s": %(error)s'
1794
def __init__(self, library, error):
1795
BzrError.__init__(self, library=library, error=error)
1798
class GpgmeNotInstalled(DependencyNotPresent):
1800
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1802
def __init__(self, error):
1803
DependencyNotPresent.__init__(self, 'gpgme', error)
1761
1806
class WorkingTreeNotRevision(BzrError):
1763
1808
_fmt = ("The working tree for %(basedir)s has changed since"
1937
1982
class BzrMoveFailedError(BzrError):
1939
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1984
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1985
"%(_has_extra)s%(extra)s")
1941
1987
def __init__(self, from_path='', to_path='', extra=None):
1942
1988
from bzrlib.osutils import splitpath
1943
1989
BzrError.__init__(self)
1945
self.extra = ': ' + str(extra)
1991
self.extra, self._has_extra = extra, ': '
1993
self.extra = self._has_extra = ''
1949
1995
has_from = len(from_path) > 0
1950
1996
has_to = len(to_path) > 0
1972
2018
class BzrRenameFailedError(BzrMoveFailedError):
1974
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2020
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2021
"%(_has_extra)s%(extra)s")
1976
2023
def __init__(self, from_path, to_path, extra=None):
1977
2024
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1979
class BzrRemoveChangedFilesError(BzrError):
1980
"""Used when user is trying to remove changed files."""
1982
_fmt = ("Can't safely remove modified or unknown files:\n"
1983
"%(changes_as_text)s"
1984
"Use --keep to not delete them, or --force to delete them regardless.")
1986
def __init__(self, tree_delta):
1987
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
1988
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1989
BzrError.__init__(self)
1990
self.changes_as_text = tree_delta.get_changes_as_text()
1991
#self.paths_as_string = '\n'.join(changed_files)
1992
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1995
2027
class BzrBadParameterNotString(BzrBadParameter):
2630
2662
This is distinct from ErrorFromSmartServer so that it is possible to
2631
2663
distinguish between the following two cases:
2632
- ErrorFromSmartServer was uncaught. This is logic error in the client
2633
and so should provoke a traceback to the user.
2634
- ErrorFromSmartServer was caught but its error_tuple could not be
2635
translated. This is probably because the server sent us garbage, and
2636
should not provoke a traceback.
2665
- ErrorFromSmartServer was uncaught. This is logic error in the client
2666
and so should provoke a traceback to the user.
2667
- ErrorFromSmartServer was caught but its error_tuple could not be
2668
translated. This is probably because the server sent us garbage, and
2669
should not provoke a traceback.
2639
2672
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2930
2963
from bzrlib.osutils import get_user_encoding
2931
2964
self.path = path
2932
2965
self.kind = kind
2933
self.user_encoding = osutils.get_user_encoding()
2966
self.user_encoding = get_user_encoding()
2969
class NoSuchConfig(BzrError):
2971
_fmt = ('The "%(config_id)s" configuration does not exist.')
2973
def __init__(self, config_id):
2974
BzrError.__init__(self, config_id=config_id)
2977
class NoSuchConfigOption(BzrError):
2979
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2981
def __init__(self, option_name):
2982
BzrError.__init__(self, option_name=option_name)
2936
2985
class NoSuchAlias(BzrError):
2981
3030
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2984
class HookFailed(BzrError):
2985
"""Raised when a pre_change_branch_tip hook function fails anything other
2986
than TipChangeRejected.
2988
Note that this exception is no longer raised, and the import is only left
2989
to be nice to code which might catch it in a plugin.
2992
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2993
"%(traceback_text)s%(exc_value)s")
2995
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2997
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2998
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3000
self.hook_stage = hook_stage
3001
self.hook_name = hook_name
3002
self.exc_info = exc_info
3003
self.exc_type = exc_info[0]
3004
self.exc_value = exc_info[1]
3005
self.exc_tb = exc_info[2]
3006
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3009
3033
class TipChangeRejected(BzrError):
3010
3034
"""A pre_change_branch_tip hook function may raise this to cleanly and
3011
3035
explicitly abort a change to a branch tip.
3178
3214
def __init__(self, branch_url):
3179
3215
self.branch_url = branch_url
3218
# FIXME: I would prefer to define the config related exception classes in
3219
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3220
class OptionExpansionLoop(BzrError):
3222
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3224
def __init__(self, string, refs):
3225
self.string = string
3226
self.refs = '->'.join(refs)
3229
class ExpandingUnknownOption(BzrError):
3231
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3233
def __init__(self, name, string):
3235
self.string = string
3238
class NoCompatibleInter(BzrError):
3240
_fmt = ('No compatible object available for operations from %(source)r '
3243
def __init__(self, source, target):
3244
self.source = source
3245
self.target = target
3248
class HpssVfsRequestNotAllowed(BzrError):
3250
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3251
"%(method)s, %(arguments)s.")
3253
def __init__(self, method, arguments):
3254
self.method = method
3255
self.arguments = arguments
3258
class UnsupportedKindChange(BzrError):
3260
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3261
"%(path)s not supported by format %(format)r")
3263
def __init__(self, path, from_kind, to_kind, format):
3265
self.from_kind = from_kind
3266
self.to_kind = to_kind
3267
self.format = format
3270
class MissingFeature(BzrError):
3272
_fmt = ("Missing feature %(feature)s not provided by this "
3273
"version of Bazaar or any plugin.")
3275
def __init__(self, feature):
3276
self.feature = feature
3279
class PatchSyntax(BzrError):
3280
"""Base class for patch syntax errors."""
3283
class BinaryFiles(BzrError):
3285
_fmt = 'Binary files section encountered.'
3287
def __init__(self, orig_name, mod_name):
3288
self.orig_name = orig_name
3289
self.mod_name = mod_name
3292
class MalformedPatchHeader(PatchSyntax):
3294
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3296
def __init__(self, desc, line):
3301
class MalformedHunkHeader(PatchSyntax):
3303
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3305
def __init__(self, desc, line):
3310
class MalformedLine(PatchSyntax):
3312
_fmt = "Malformed line. %(desc)s\n%(line)r"
3314
def __init__(self, desc, line):
3319
class PatchConflict(BzrError):
3321
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3322
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3324
def __init__(self, line_no, orig_line, patch_line):
3325
self.line_no = line_no
3326
self.orig_line = orig_line.rstrip('\n')
3327
self.patch_line = patch_line.rstrip('\n')
3330
class FeatureAlreadyRegistered(BzrError):
3332
_fmt = 'The feature %(feature)s has already been registered.'
3334
def __init__(self, feature):
3335
self.feature = feature