93
106
# __str__() should always return a 'str' object
94
107
# never a 'unicode' object.
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),
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),
106
116
def __unicode__(self):
107
117
u = self._format()
130
140
"""Return format string for this exception or None"""
131
141
fmt = getattr(self, '_fmt', None)
132
142
if fmt is not None:
133
from bzrlib.i18n import gettext
134
return gettext(unicode(fmt)) # _fmt strings should be ascii
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),
136
156
def __eq__(self, other):
137
157
if self.__class__ is not other.__class__:
150
170
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__,
153
206
class AlreadyBuilding(BzrError):
155
208
_fmt = "The tree builder is already building a tree."
673
723
self.bzrdir.open_repository()
674
724
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.
686
727
self.detail = ': location is a repository'
1144
1180
class InvalidRevisionSpec(BzrError):
1146
1182
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1147
" %(branch_url)s%(extra)s")
1183
" %(branch)s%(extra)s")
1149
1185
def __init__(self, spec, branch, extra=None):
1150
1186
BzrError.__init__(self, branch=branch, spec=spec)
1151
self.branch_url = getattr(branch, 'user_url', str(branch))
1153
1188
self.extra = '\n' + str(extra)
1155
1190
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1158
1198
class AppendRevisionsOnlyViolation(BzrError):
1160
1200
_fmt = ('Operation denied because it would change the main history,'
1225
1265
not_ancestor_id=not_ancestor_id)
1268
class AmbiguousBase(BzrError):
1270
def __init__(self, bases):
1271
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1272
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1273
msg = ("The correct base is unclear, because %s are all equally close"
1275
BzrError.__init__(self, msg)
1228
1279
class NoCommits(BranchError):
1230
1281
_fmt = "Branch %(branch)s has no commits."
1641
1685
class InvalidHttpResponse(TransportError):
1643
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1645
1689
def __init__(self, path, msg, orig_error=None):
1646
1690
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,)
1653
1691
TransportError.__init__(self, msg, orig_error=orig_error)
1662
1700
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)
1678
1703
class InvalidHttpContentType(InvalidHttpResponse):
1680
1705
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1708
1733
_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
1720
1736
class ParseConfigError(BzrError):
1722
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1724
1738
def __init__(self, errors, filename):
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)
1739
if filename is None:
1741
message = "Error(s) parsing config file %s:\n%s" % \
1742
(filename, ('\n'.join(e.msg for e in errors)))
1743
BzrError.__init__(self, message)
1738
1746
class NoEmailInUsername(BzrError):
1747
1755
class SigningFailed(BzrError):
1749
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1751
1759
def __init__(self, command_line):
1752
1760
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)
1779
1763
class WorkingTreeNotRevision(BzrError):
1781
1765
_fmt = ("The working tree for %(basedir)s has changed since"
1941
1925
_fmt = "Moving the root directory is not supported at this time"
1944
class TransformRenameFailed(BzrError):
1946
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1948
def __init__(self, from_path, to_path, why, errno):
1949
self.from_path = from_path
1950
self.to_path = to_path
1955
1928
class BzrMoveFailedError(BzrError):
1957
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1958
"%(_has_extra)s%(extra)s")
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1960
1932
def __init__(self, from_path='', to_path='', extra=None):
1961
1933
from bzrlib.osutils import splitpath
1962
1934
BzrError.__init__(self)
1964
self.extra, self._has_extra = extra, ': '
1936
self.extra = ': ' + str(extra)
1966
self.extra = self._has_extra = ''
1968
1940
has_from = len(from_path) > 0
1969
1941
has_to = len(to_path) > 0
1991
1963
class BzrRenameFailedError(BzrMoveFailedError):
1993
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1994
"%(_has_extra)s%(extra)s")
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1996
1967
def __init__(self, from_path, to_path, extra=None):
1997
1968
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
class BzrRemoveChangedFilesError(BzrError):
1971
"""Used when user is trying to remove changed files."""
1973
_fmt = ("Can't safely remove modified or unknown files:\n"
1974
"%(changes_as_text)s"
1975
"Use --keep to not delete them, or --force to delete them regardless.")
1977
def __init__(self, tree_delta):
1978
BzrError.__init__(self)
1979
self.changes_as_text = tree_delta.get_changes_as_text()
1980
#self.paths_as_string = '\n'.join(changed_files)
1981
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2000
1984
class BzrBadParameterNotString(BzrBadParameter):
2635
2619
This is distinct from ErrorFromSmartServer so that it is possible to
2636
2620
distinguish between the following two cases:
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.
2621
- ErrorFromSmartServer was uncaught. This is logic error in the client
2622
and so should provoke a traceback to the user.
2623
- ErrorFromSmartServer was caught but its error_tuple could not be
2624
translated. This is probably because the server sent us garbage, and
2625
should not provoke a traceback.
2645
2628
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2852
2835
more = ' ' + more
2853
2836
import bzrlib.urlutils as urlutils
2854
user_url = getattr(tree, "user_url", None)
2855
if user_url is None:
2856
display_url = str(tree)
2858
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2859
2839
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2862
class ShelvedChanges(UncommittedChanges):
2864
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2865
' (See bzr shelve --list).%(more)s')
2868
2842
class MissingTemplateVariable(BzrError):
2870
2844
_fmt = 'Variable {%(name)s} is not available.'
2936
2910
from bzrlib.osutils import get_user_encoding
2937
2911
self.path = path
2938
2912
self.kind = kind
2939
self.user_encoding = get_user_encoding()
2942
class NoSuchConfig(BzrError):
2944
_fmt = ('The "%(config_id)s" configuration does not exist.')
2946
def __init__(self, config_id):
2947
BzrError.__init__(self, config_id=config_id)
2950
class NoSuchConfigOption(BzrError):
2952
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2954
def __init__(self, option_name):
2955
BzrError.__init__(self, option_name=option_name)
2913
self.user_encoding = osutils.get_user_encoding()
2958
2916
class NoSuchAlias(BzrError):
3003
2961
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2964
class HookFailed(BzrError):
2965
"""Raised when a pre_change_branch_tip hook function fails anything other
2966
than TipChangeRejected.
2968
Note that this exception is no longer raised, and the import is only left
2969
to be nice to code which might catch it in a plugin.
2972
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2973
"%(traceback_text)s%(exc_value)s")
2975
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2977
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2978
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2980
self.hook_stage = hook_stage
2981
self.hook_name = hook_name
2982
self.exc_info = exc_info
2983
self.exc_type = exc_info[0]
2984
self.exc_value = exc_info[1]
2985
self.exc_tb = exc_info[2]
2986
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3006
2989
class TipChangeRejected(BzrError):
3007
2990
"""A pre_change_branch_tip hook function may raise this to cleanly and
3008
2991
explicitly abort a change to a branch tip.
3163
3134
def __init__(self, bzrdir):
3164
3135
self.bzrdir = bzrdir
3167
class NoWhoami(BzrError):
3169
_fmt = ('Unable to determine your name.\n'
3170
"Please, set your name with the 'whoami' command.\n"
3171
'E.g. bzr whoami "Your Name <name@example.com>"')
3174
class InvalidPattern(BzrError):
3176
_fmt = ('Invalid pattern(s) found. %(msg)s')
3178
def __init__(self, msg):
3182
class RecursiveBind(BzrError):
3184
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3185
'Please use `bzr unbind` to fix.')
3187
def __init__(self, branch_url):
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')