54
41
Base class for errors raised by bzrlib.
56
43
: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.)
44
should be displayed with a traceback; if False (or absent) this was
45
probably a user or environment error and they don't need the gory
46
details. (That can be overridden by -Derror on the command line.)
61
48
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
49
by the instance's dict.
65
52
internal_error = False
106
93
# __str__() should always return a 'str' object
107
94
# 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),
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),
116
106
def __unicode__(self):
117
107
u = self._format()
140
130
"""Return format string for this exception or None"""
141
131
fmt = getattr(self, '_fmt', None)
142
132
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),
133
from bzrlib.i18n import gettext
134
return gettext(unicode(fmt)) # _fmt strings should be ascii
156
136
def __eq__(self, other):
157
137
if self.__class__ is not other.__class__:
170
150
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
153
class AlreadyBuilding(BzrError):
208
155
_fmt = "The tree builder is already building a tree."
723
673
self.bzrdir.open_repository()
724
674
except NoRepositoryPresent:
677
# Just ignore unexpected errors. Raising arbitrary errors
678
# during str(err) can provoke strange bugs. Concretely
679
# Launchpad's codehosting managed to raise NotBranchError
680
# here, and then get stuck in an infinite loop/recursion
681
# trying to str() that error. All this error really cares
682
# about that there's no working repository there, and if
683
# open_repository() fails, there probably isn't.
727
686
self.detail = ': location is a repository'
778
737
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
740
class UnsupportedFormatError(BzrError):
796
742
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
852
798
"""Construct a new AlreadyVersionedError.
854
800
:param path: This is the path which is versioned,
855
which should be in a user friendly form.
801
which should be in a user friendly form.
856
802
:param context_info: If given, this is information about the context,
857
which could explain why this is expected to not be versioned.
803
which could explain why this is expected to not be versioned.
859
805
BzrError.__init__(self)
873
819
"""Construct a new NotVersionedError.
875
821
:param path: This is the path which is not versioned,
876
which should be in a user friendly form.
822
which should be in a user friendly form.
877
823
:param context_info: If given, this is information about the context,
878
which could explain why this is expected to be versioned.
824
which could explain why this is expected to be versioned.
880
826
BzrError.__init__(self)
1128
1074
BzrError.__init__(self, files=files, files_str=files_str)
1077
class ExcludesUnsupported(BzrError):
1079
_fmt = ('Excluding paths during commit is not supported by '
1080
'repository at %(repository)r.')
1082
def __init__(self, repository):
1083
BzrError.__init__(self, repository=repository)
1131
1086
class BadCommitMessageEncoding(BzrError):
1133
1088
_fmt = 'The specified commit message contains characters unsupported by '\
1275
1225
not_ancestor_id=not_ancestor_id)
1278
class AmbiguousBase(BzrError):
1280
def __init__(self, bases):
1281
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1282
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1283
msg = ("The correct base is unclear, because %s are all equally close"
1285
BzrError.__init__(self, msg)
1289
1228
class NoCommits(BranchError):
1291
1230
_fmt = "Branch %(branch)s has no commits."
1695
1641
class InvalidHttpResponse(TransportError):
1697
_fmt = "Invalid http response for %(path)s: %(msg)s"
1643
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1699
1645
def __init__(self, path, msg, orig_error=None):
1700
1646
self.path = path
1647
if orig_error is None:
1650
# This is reached for obscure and unusual errors so we want to
1651
# preserve as much info as possible to ease debug.
1652
orig_error = ': %r' % (orig_error,)
1701
1653
TransportError.__init__(self, msg, orig_error=orig_error)
1710
1662
InvalidHttpResponse.__init__(self, path, msg)
1665
class HttpBoundaryMissing(InvalidHttpResponse):
1666
"""A multipart response ends with no boundary marker.
1668
This is a special case caused by buggy proxies, described in
1669
<https://bugs.launchpad.net/bzr/+bug/198646>.
1672
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1674
def __init__(self, path, msg):
1675
InvalidHttpResponse.__init__(self, path, msg)
1713
1678
class InvalidHttpContentType(InvalidHttpResponse):
1715
1680
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1743
1708
_fmt = "Working tree has conflicts."
1711
class ConfigContentError(BzrError):
1713
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1715
def __init__(self, filename):
1716
BzrError.__init__(self)
1717
self.filename = filename
1746
1720
class ParseConfigError(BzrError):
1722
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1748
1724
def __init__(self, errors, filename):
1749
if filename is None:
1751
message = "Error(s) parsing config file %s:\n%s" % \
1752
(filename, ('\n'.join(e.msg for e in errors)))
1753
BzrError.__init__(self, message)
1725
BzrError.__init__(self)
1726
self.filename = filename
1727
self.errors = '\n'.join(e.msg for e in errors)
1730
class ConfigOptionValueError(BzrError):
1732
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1734
def __init__(self, name, value):
1735
BzrError.__init__(self, name=name, value=value)
1756
1738
class NoEmailInUsername(BzrError):
1765
1747
class SigningFailed(BzrError):
1767
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1749
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1769
1751
def __init__(self, command_line):
1770
1752
BzrError.__init__(self, command_line=command_line)
1755
class SignatureVerificationFailed(BzrError):
1757
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1759
def __init__(self, error):
1760
BzrError.__init__(self, error=error)
1763
class DependencyNotPresent(BzrError):
1765
_fmt = 'Unable to import library "%(library)s": %(error)s'
1767
def __init__(self, library, error):
1768
BzrError.__init__(self, library=library, error=error)
1771
class GpgmeNotInstalled(DependencyNotPresent):
1773
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1775
def __init__(self, error):
1776
DependencyNotPresent.__init__(self, 'gpgme', error)
1773
1779
class WorkingTreeNotRevision(BzrError):
1775
1781
_fmt = ("The working tree for %(basedir)s has changed since"
1949
1955
class BzrMoveFailedError(BzrError):
1951
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1957
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1958
"%(_has_extra)s%(extra)s")
1953
1960
def __init__(self, from_path='', to_path='', extra=None):
1954
1961
from bzrlib.osutils import splitpath
1955
1962
BzrError.__init__(self)
1957
self.extra = ': ' + str(extra)
1964
self.extra, self._has_extra = extra, ': '
1966
self.extra = self._has_extra = ''
1961
1968
has_from = len(from_path) > 0
1962
1969
has_to = len(to_path) > 0
1984
1991
class BzrRenameFailedError(BzrMoveFailedError):
1986
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1993
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1994
"%(_has_extra)s%(extra)s")
1988
1996
def __init__(self, from_path, to_path, extra=None):
1989
1997
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1991
class BzrRemoveChangedFilesError(BzrError):
1992
"""Used when user is trying to remove changed files."""
1994
_fmt = ("Can't safely remove modified or unknown files:\n"
1995
"%(changes_as_text)s"
1996
"Use --keep to not delete them, or --force to delete them regardless.")
1998
def __init__(self, tree_delta):
1999
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2000
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2001
BzrError.__init__(self)
2002
self.changes_as_text = tree_delta.get_changes_as_text()
2003
#self.paths_as_string = '\n'.join(changed_files)
2004
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2007
2000
class BzrBadParameterNotString(BzrBadParameter):
2025
2018
_fmt = "Parameter %(param)s contains a newline."
2028
class DependencyNotPresent(BzrError):
2030
_fmt = 'Unable to import library "%(library)s": %(error)s'
2032
def __init__(self, library, error):
2033
BzrError.__init__(self, library=library, error=error)
2036
2021
class ParamikoNotPresent(DependencyNotPresent):
2038
2023
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2642
2635
This is distinct from ErrorFromSmartServer so that it is possible to
2643
2636
distinguish between the following two cases:
2644
- ErrorFromSmartServer was uncaught. This is logic error in the client
2645
and so should provoke a traceback to the user.
2646
- ErrorFromSmartServer was caught but its error_tuple could not be
2647
translated. This is probably because the server sent us garbage, and
2648
should not provoke a traceback.
2638
- ErrorFromSmartServer was uncaught. This is logic error in the client
2639
and so should provoke a traceback to the user.
2640
- ErrorFromSmartServer was caught but its error_tuple could not be
2641
translated. This is probably because the server sent us garbage, and
2642
should not provoke a traceback.
2651
2645
_fmt = "Server sent an unexpected error: %(error_tuple)r"
3009
3003
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3012
class HookFailed(BzrError):
3013
"""Raised when a pre_change_branch_tip hook function fails anything other
3014
than TipChangeRejected.
3016
Note that this exception is no longer raised, and the import is only left
3017
to be nice to code which might catch it in a plugin.
3020
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3021
"%(traceback_text)s%(exc_value)s")
3023
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3025
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3026
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3028
self.hook_stage = hook_stage
3029
self.hook_name = hook_name
3030
self.exc_info = exc_info
3031
self.exc_type = exc_info[0]
3032
self.exc_value = exc_info[1]
3033
self.exc_tb = exc_info[2]
3034
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3037
3006
class TipChangeRejected(BzrError):
3038
3007
"""A pre_change_branch_tip hook function may raise this to cleanly and
3039
3008
explicitly abort a change to a branch tip.
3050
3019
_fmt = "Shelf corrupt."
3022
class DecompressCorruption(BzrError):
3024
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3026
def __init__(self, orig_error=None):
3027
if orig_error is not None:
3028
self.orig_error = ", %s" % (orig_error,)
3030
self.orig_error = ""
3031
BzrError.__init__(self)
3053
3034
class NoSuchShelfId(BzrError):
3055
3036
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3206
3187
def __init__(self, branch_url):
3207
3188
self.branch_url = branch_url
3191
# FIXME: I would prefer to define the config related exception classes in
3192
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3193
class OptionExpansionLoop(BzrError):
3195
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3197
def __init__(self, string, refs):
3198
self.string = string
3199
self.refs = '->'.join(refs)
3202
class ExpandingUnknownOption(BzrError):
3204
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3206
def __init__(self, name, string):
3208
self.string = string
3211
class NoCompatibleInter(BzrError):
3213
_fmt = ('No compatible object available for operations from %(source)r '
3216
def __init__(self, source, target):
3217
self.source = source
3218
self.target = target
3221
class HpssVfsRequestNotAllowed(BzrError):
3223
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3224
"%(method)s, %(arguments)s.")
3226
def __init__(self, method, arguments):
3227
self.method = method
3228
self.arguments = arguments
3231
class UnsupportedKindChange(BzrError):
3233
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3234
"%(path)s not supported by format %(format)r")
3236
def __init__(self, path, from_kind, to_kind, format):
3238
self.from_kind = from_kind
3239
self.to_kind = to_kind
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')