140
135
"""Return format string for this exception or None"""
141
136
fmt = getattr(self, '_fmt', None)
142
137
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__,
139
unicode_fmt = unicode(fmt) #_fmt strings should be ascii
140
if type(fmt) == unicode:
141
trace.mutter("Unicode strings in error.fmt are deprecated")
142
return gettext(unicode_fmt)
150
143
return 'Unprintable exception %s: dict=%r, fmt=%r' \
151
144
% (self.__class__.__name__,
170
163
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
166
class AlreadyBuilding(BzrError):
208
168
_fmt = "The tree builder is already building a tree."
723
686
self.bzrdir.open_repository()
724
687
except NoRepositoryPresent:
690
# Just ignore unexpected errors. Raising arbitrary errors
691
# during str(err) can provoke strange bugs. Concretely
692
# Launchpad's codehosting managed to raise NotBranchError
693
# here, and then get stuck in an infinite loop/recursion
694
# trying to str() that error. All this error really cares
695
# about that there's no working repository there, and if
696
# open_repository() fails, there probably isn't.
727
699
self.detail = ': location is a repository'
1265
1243
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
1246
class NoCommits(BranchError):
1281
1248
_fmt = "Branch %(branch)s has no commits."
1685
1659
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1661
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1663
def __init__(self, path, msg, orig_error=None):
1690
1664
self.path = path
1665
if orig_error is None:
1668
# This is reached for obscure and unusual errors so we want to
1669
# preserve as much info as possible to ease debug.
1670
orig_error = ': %r' % (orig_error,)
1691
1671
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1680
InvalidHttpResponse.__init__(self, path, msg)
1683
class HttpBoundaryMissing(InvalidHttpResponse):
1684
"""A multipart response ends with no boundary marker.
1686
This is a special case caused by buggy proxies, described in
1687
<https://bugs.launchpad.net/bzr/+bug/198646>.
1690
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1692
def __init__(self, path, msg):
1693
InvalidHttpResponse.__init__(self, path, msg)
1703
1696
class InvalidHttpContentType(InvalidHttpResponse):
1705
1698
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1726
_fmt = "Working tree has conflicts."
1729
class ConfigContentError(BzrError):
1731
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1733
def __init__(self, filename):
1734
BzrError.__init__(self)
1735
self.filename = filename
1736
1738
class ParseConfigError(BzrError):
1740
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1742
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)
1743
BzrError.__init__(self)
1744
self.filename = filename
1745
self.errors = '\n'.join(e.msg for e in errors)
1748
class ConfigOptionValueError(BzrError):
1750
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1752
def __init__(self, name, value):
1753
BzrError.__init__(self, name=name, value=value)
1746
1756
class NoEmailInUsername(BzrError):
1755
1765
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1767
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1769
def __init__(self, command_line):
1760
1770
BzrError.__init__(self, command_line=command_line)
1773
class SignatureVerificationFailed(BzrError):
1775
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1777
def __init__(self, error):
1778
BzrError.__init__(self, error=error)
1781
class DependencyNotPresent(BzrError):
1783
_fmt = 'Unable to import library "%(library)s": %(error)s'
1785
def __init__(self, library, error):
1786
BzrError.__init__(self, library=library, error=error)
1789
class GpgmeNotInstalled(DependencyNotPresent):
1791
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1793
def __init__(self, error):
1794
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1797
class WorkingTreeNotRevision(BzrError):
1765
1799
_fmt = ("The working tree for %(basedir)s has changed since"
1925
1959
_fmt = "Moving the root directory is not supported at this time"
1962
class TransformRenameFailed(BzrError):
1964
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1966
def __init__(self, from_path, to_path, why, errno):
1967
self.from_path = from_path
1968
self.to_path = to_path
1928
1973
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1975
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1976
"%(_has_extra)s%(extra)s")
1932
1978
def __init__(self, from_path='', to_path='', extra=None):
1933
1979
from bzrlib.osutils import splitpath
1934
1980
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1982
self.extra, self._has_extra = extra, ': '
1984
self.extra = self._has_extra = ''
1940
1986
has_from = len(from_path) > 0
1941
1987
has_to = len(to_path) > 0
1963
2009
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2011
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2012
"%(_has_extra)s%(extra)s")
1967
2014
def __init__(self, from_path, to_path, extra=None):
1968
2015
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
2018
class BzrBadParameterNotString(BzrBadParameter):
2619
2653
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2654
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.
2656
- ErrorFromSmartServer was uncaught. This is logic error in the client
2657
and so should provoke a traceback to the user.
2658
- ErrorFromSmartServer was caught but its error_tuple could not be
2659
translated. This is probably because the server sent us garbage, and
2660
should not provoke a traceback.
2628
2663
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2835
2870
more = ' ' + more
2836
2871
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2872
user_url = getattr(tree, "user_url", None)
2873
if user_url is None:
2874
display_url = str(tree)
2876
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2877
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2880
class ShelvedChanges(UncommittedChanges):
2882
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2883
' (See bzr shelve --list).%(more)s')
2842
2886
class MissingTemplateVariable(BzrError):
2844
2888
_fmt = 'Variable {%(name)s} is not available.'
2913
2957
self.user_encoding = osutils.get_user_encoding()
2960
class NoSuchConfig(BzrError):
2962
_fmt = ('The "%(config_id)s" configuration does not exist.')
2964
def __init__(self, config_id):
2965
BzrError.__init__(self, config_id=config_id)
2968
class NoSuchConfigOption(BzrError):
2970
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2972
def __init__(self, option_name):
2973
BzrError.__init__(self, option_name=option_name)
2916
2976
class NoSuchAlias(BzrError):
2918
2978
_fmt = ('The alias "%(alias_name)s" does not exist.')
2961
3021
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
3024
class TipChangeRejected(BzrError):
2990
3025
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
3026
explicitly abort a change to a branch tip.
3134
3181
def __init__(self, bzrdir):
3135
3182
self.bzrdir = bzrdir
3185
class NoWhoami(BzrError):
3187
_fmt = ('Unable to determine your name.\n'
3188
"Please, set your name with the 'whoami' command.\n"
3189
'E.g. bzr whoami "Your Name <name@example.com>"')
3192
class InvalidPattern(BzrError):
3194
_fmt = ('Invalid pattern(s) found. %(msg)s')
3196
def __init__(self, msg):
3200
class RecursiveBind(BzrError):
3202
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3203
'Please use `bzr unbind` to fix.')
3205
def __init__(self, branch_url):
3206
self.branch_url = branch_url
3209
# FIXME: I would prefer to define the config related exception classes in
3210
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3211
class OptionExpansionLoop(BzrError):
3213
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3215
def __init__(self, string, refs):
3216
self.string = string
3217
self.refs = '->'.join(refs)
3220
class ExpandingUnknownOption(BzrError):
3222
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3224
def __init__(self, name, string):
3226
self.string = string
3229
class NoCompatibleInter(BzrError):
3231
_fmt = ('No compatible object available for operations from %(source)r '
3234
def __init__(self, source, target):
3235
self.source = source
3236
self.target = target
3239
class HpssVfsRequestNotAllowed(BzrError):
3241
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3242
"%(method)s, %(arguments)s.")
3244
def __init__(self, method, arguments):
3245
self.method = method
3246
self.arguments = arguments
3249
class UnsupportedKindChange(BzrError):
3251
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3252
"%(path)s not supported by format %(format)r")
3254
def __init__(self, path, from_kind, to_kind, format):
3256
self.from_kind = from_kind
3257
self.to_kind = to_kind
3258
self.format = format
3261
class PatchSyntax(BzrError):
3262
"""Base class for patch syntax errors."""
3265
class BinaryFiles(BzrError):
3267
_fmt = 'Binary files section encountered.'
3269
def __init__(self, orig_name, mod_name):
3270
self.orig_name = orig_name
3271
self.mod_name = mod_name
3274
class MalformedPatchHeader(PatchSyntax):
3276
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3278
def __init__(self, desc, line):
3283
class MalformedHunkHeader(PatchSyntax):
3285
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3287
def __init__(self, desc, line):
3292
class MalformedLine(PatchSyntax):
3294
_fmt = "Malformed line. %(desc)s\n%(line)r"
3296
def __init__(self, desc, line):
3301
class PatchConflict(BzrError):
3303
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3304
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3306
def __init__(self, line_no, orig_line, patch_line):
3307
self.line_no = line_no
3308
self.orig_line = orig_line.rstrip('\n')
3309
self.patch_line = patch_line.rstrip('\n')