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'
1265
1230
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)
1279
1233
class NoCommits(BranchError):
1281
1235
_fmt = "Branch %(branch)s has no commits."
1685
1646
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1648
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1650
def __init__(self, path, msg, orig_error=None):
1690
1651
self.path = path
1652
if orig_error is None:
1655
# This is reached for obscure and unusual errors so we want to
1656
# preserve as much info as possible to ease debug.
1657
orig_error = ': %r' % (orig_error,)
1691
1658
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1667
InvalidHttpResponse.__init__(self, path, msg)
1670
class HttpBoundaryMissing(InvalidHttpResponse):
1671
"""A multipart response ends with no boundary marker.
1673
This is a special case caused by buggy proxies, described in
1674
<https://bugs.launchpad.net/bzr/+bug/198646>.
1677
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1679
def __init__(self, path, msg):
1680
InvalidHttpResponse.__init__(self, path, msg)
1703
1683
class InvalidHttpContentType(InvalidHttpResponse):
1705
1685
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1713
_fmt = "Working tree has conflicts."
1716
class ConfigContentError(BzrError):
1718
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1720
def __init__(self, filename):
1721
BzrError.__init__(self)
1722
self.filename = filename
1736
1725
class ParseConfigError(BzrError):
1727
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1729
def __init__(self, errors, filename):
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)
1730
BzrError.__init__(self)
1731
self.filename = filename
1732
self.errors = '\n'.join(e.msg for e in errors)
1735
class ConfigOptionValueError(BzrError):
1737
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1739
def __init__(self, name, value):
1740
BzrError.__init__(self, name=name, value=value)
1746
1743
class NoEmailInUsername(BzrError):
1755
1752
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1754
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1756
def __init__(self, command_line):
1760
1757
BzrError.__init__(self, command_line=command_line)
1760
class SignatureVerificationFailed(BzrError):
1762
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1764
def __init__(self, error):
1765
BzrError.__init__(self, error=error)
1768
class DependencyNotPresent(BzrError):
1770
_fmt = 'Unable to import library "%(library)s": %(error)s'
1772
def __init__(self, library, error):
1773
BzrError.__init__(self, library=library, error=error)
1776
class GpgmeNotInstalled(DependencyNotPresent):
1778
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1780
def __init__(self, error):
1781
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1784
class WorkingTreeNotRevision(BzrError):
1765
1786
_fmt = ("The working tree for %(basedir)s has changed since"
1925
1946
_fmt = "Moving the root directory is not supported at this time"
1949
class TransformRenameFailed(BzrError):
1951
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1953
def __init__(self, from_path, to_path, why, errno):
1954
self.from_path = from_path
1955
self.to_path = to_path
1928
1960
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1962
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1963
"%(_has_extra)s%(extra)s")
1932
1965
def __init__(self, from_path='', to_path='', extra=None):
1933
1966
from bzrlib.osutils import splitpath
1934
1967
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1969
self.extra, self._has_extra = extra, ': '
1971
self.extra = self._has_extra = ''
1940
1973
has_from = len(from_path) > 0
1941
1974
has_to = len(to_path) > 0
1963
1996
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1998
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1999
"%(_has_extra)s%(extra)s")
1967
2001
def __init__(self, from_path, to_path, extra=None):
1968
2002
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])
1984
2005
class BzrBadParameterNotString(BzrBadParameter):
2619
2640
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2641
distinguish between the following two cases:
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.
2643
- ErrorFromSmartServer was uncaught. This is logic error in the client
2644
and so should provoke a traceback to the user.
2645
- ErrorFromSmartServer was caught but its error_tuple could not be
2646
translated. This is probably because the server sent us garbage, and
2647
should not provoke a traceback.
2628
2650
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2835
2857
more = ' ' + more
2836
2858
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2859
user_url = getattr(tree, "user_url", None)
2860
if user_url is None:
2861
display_url = str(tree)
2863
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2864
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2867
class ShelvedChanges(UncommittedChanges):
2869
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2870
' (See bzr shelve --list).%(more)s')
2842
2873
class MissingTemplateVariable(BzrError):
2844
2875
_fmt = 'Variable {%(name)s} is not available.'
2910
2941
from bzrlib.osutils import get_user_encoding
2911
2942
self.path = path
2912
2943
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2944
self.user_encoding = get_user_encoding()
2947
class NoSuchConfig(BzrError):
2949
_fmt = ('The "%(config_id)s" configuration does not exist.')
2951
def __init__(self, config_id):
2952
BzrError.__init__(self, config_id=config_id)
2955
class NoSuchConfigOption(BzrError):
2957
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2959
def __init__(self, option_name):
2960
BzrError.__init__(self, option_name=option_name)
2916
2963
class NoSuchAlias(BzrError):
2961
3008
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))
2989
3011
class TipChangeRejected(BzrError):
2990
3012
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
3013
explicitly abort a change to a branch tip.
3134
3168
def __init__(self, bzrdir):
3135
3169
self.bzrdir = bzrdir
3172
class NoWhoami(BzrError):
3174
_fmt = ('Unable to determine your name.\n'
3175
"Please, set your name with the 'whoami' command.\n"
3176
'E.g. bzr whoami "Your Name <name@example.com>"')
3179
class InvalidPattern(BzrError):
3181
_fmt = ('Invalid pattern(s) found. %(msg)s')
3183
def __init__(self, msg):
3187
class RecursiveBind(BzrError):
3189
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3190
'Please use `bzr unbind` to fix.')
3192
def __init__(self, branch_url):
3193
self.branch_url = branch_url
3196
# FIXME: I would prefer to define the config related exception classes in
3197
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3198
class OptionExpansionLoop(BzrError):
3200
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3202
def __init__(self, string, refs):
3203
self.string = string
3204
self.refs = '->'.join(refs)
3207
class ExpandingUnknownOption(BzrError):
3209
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3211
def __init__(self, name, string):
3213
self.string = string
3216
class NoCompatibleInter(BzrError):
3218
_fmt = ('No compatible object available for operations from %(source)r '
3221
def __init__(self, source, target):
3222
self.source = source
3223
self.target = target
3226
class HpssVfsRequestNotAllowed(BzrError):
3228
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3229
"%(method)s, %(arguments)s.")
3231
def __init__(self, method, arguments):
3232
self.method = method
3233
self.arguments = arguments
3236
class UnsupportedKindChange(BzrError):
3238
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3239
"%(path)s not supported by format %(format)r")
3241
def __init__(self, path, from_kind, to_kind, format):
3243
self.from_kind = from_kind
3244
self.to_kind = to_kind
3245
self.format = format
3248
class PatchSyntax(BzrError):
3249
"""Base class for patch syntax errors."""
3252
class BinaryFiles(BzrError):
3254
_fmt = 'Binary files section encountered.'
3256
def __init__(self, orig_name, mod_name):
3257
self.orig_name = orig_name
3258
self.mod_name = mod_name
3261
class MalformedPatchHeader(PatchSyntax):
3263
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3265
def __init__(self, desc, line):
3270
class MalformedHunkHeader(PatchSyntax):
3272
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3274
def __init__(self, desc, line):
3279
class MalformedLine(PatchSyntax):
3281
_fmt = "Malformed line. %(desc)s\n%(line)r"
3283
def __init__(self, desc, line):
3288
class PatchConflict(BzrError):
3290
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3291
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3293
def __init__(self, line_no, orig_line, patch_line):
3294
self.line_no = line_no
3295
self.orig_line = orig_line.rstrip('\n')
3296
self.patch_line = patch_line.rstrip('\n')