95
106
# __str__() should always return a 'str' object
96
107
# never a 'unicode' object.
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),
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),
108
116
def __unicode__(self):
109
117
u = self._format()
132
140
"""Return format string for this exception or None"""
133
141
fmt = getattr(self, '_fmt', None)
134
142
if fmt is not None:
135
from bzrlib.i18n import gettext
136
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),
138
156
def __eq__(self, other):
139
157
if self.__class__ is not other.__class__:
152
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__,
155
206
class AlreadyBuilding(BzrError):
157
208
_fmt = "The tree builder is already building a tree."
651
702
# TODO: Probably this behavior of should be a common superclass
652
703
class NotBranchError(PathError):
654
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
705
_fmt = 'Not a branch: "%(path)s".'
656
def __init__(self, path, detail=None, bzrdir=None):
707
def __init__(self, path):
657
708
import bzrlib.urlutils as urlutils
658
path = urlutils.unescape_for_display(path, 'ascii')
659
if detail is not None:
660
detail = ': ' + detail
663
PathError.__init__(self, path=path)
666
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
669
# XXX: Ideally self.detail would be a property, but Exceptions in
670
# Python 2.4 have to be old-style classes so properties don't work.
671
# Instead we override _format.
672
if self.detail is None:
673
if self.bzrdir is not None:
675
self.bzrdir.open_repository()
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.
688
self.detail = ': location is a repository'
691
return PathError._format(self)
709
self.path = urlutils.unescape_for_display(path, 'ascii')
694
712
class NoSubmitBranch(PathError):
1146
1159
class InvalidRevisionSpec(BzrError):
1148
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1149
" %(branch_url)s%(extra)s")
1161
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1162
" %(branch)s%(extra)s")
1151
1164
def __init__(self, spec, branch, extra=None):
1152
1165
BzrError.__init__(self, branch=branch, spec=spec)
1153
self.branch_url = getattr(branch, 'user_url', str(branch))
1155
1167
self.extra = '\n' + str(extra)
1157
1169
self.extra = ''
1172
class HistoryMissing(BzrError):
1174
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1160
1177
class AppendRevisionsOnlyViolation(BzrError):
1162
1179
_fmt = ('Operation denied because it would change the main history,'
1664
1678
InvalidHttpResponse.__init__(self, path, msg)
1667
class HttpBoundaryMissing(InvalidHttpResponse):
1668
"""A multipart response ends with no boundary marker.
1670
This is a special case caused by buggy proxies, described in
1671
<https://bugs.launchpad.net/bzr/+bug/198646>.
1674
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1676
def __init__(self, path, msg):
1677
InvalidHttpResponse.__init__(self, path, msg)
1680
1681
class InvalidHttpContentType(InvalidHttpResponse):
1682
1683
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1710
1711
_fmt = "Working tree has conflicts."
1713
class ConfigContentError(BzrError):
1715
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1717
def __init__(self, filename):
1718
BzrError.__init__(self)
1719
self.filename = filename
1722
1714
class ParseConfigError(BzrError):
1724
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1726
1716
def __init__(self, errors, filename):
1727
BzrError.__init__(self)
1728
self.filename = filename
1729
self.errors = '\n'.join(e.msg for e in errors)
1732
class ConfigOptionValueError(BzrError):
1734
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1736
def __init__(self, name, value):
1737
BzrError.__init__(self, name=name, value=value)
1717
if filename is None:
1719
message = "Error(s) parsing config file %s:\n%s" % \
1720
(filename, ('\n'.join(e.msg for e in errors)))
1721
BzrError.__init__(self, message)
1740
1724
class NoEmailInUsername(BzrError):
1749
1733
class SigningFailed(BzrError):
1751
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1735
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1753
1737
def __init__(self, command_line):
1754
1738
BzrError.__init__(self, command_line=command_line)
1757
class SignatureVerificationFailed(BzrError):
1759
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1761
def __init__(self, error):
1762
BzrError.__init__(self, error=error)
1765
class DependencyNotPresent(BzrError):
1767
_fmt = 'Unable to import library "%(library)s": %(error)s'
1769
def __init__(self, library, error):
1770
BzrError.__init__(self, library=library, error=error)
1773
class GpgmeNotInstalled(DependencyNotPresent):
1775
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1777
def __init__(self, error):
1778
DependencyNotPresent.__init__(self, 'gpgme', error)
1781
1741
class WorkingTreeNotRevision(BzrError):
1783
1743
_fmt = ("The working tree for %(basedir)s has changed since"
1943
1903
_fmt = "Moving the root directory is not supported at this time"
1946
class TransformRenameFailed(BzrError):
1948
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1950
def __init__(self, from_path, to_path, why, errno):
1951
self.from_path = from_path
1952
self.to_path = to_path
1957
1906
class BzrMoveFailedError(BzrError):
1959
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1960
"%(_has_extra)s%(extra)s")
1908
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1962
1910
def __init__(self, from_path='', to_path='', extra=None):
1963
1911
from bzrlib.osutils import splitpath
1964
1912
BzrError.__init__(self)
1966
self.extra, self._has_extra = extra, ': '
1914
self.extra = ': ' + str(extra)
1968
self.extra = self._has_extra = ''
1970
1918
has_from = len(from_path) > 0
1971
1919
has_to = len(to_path) > 0
1993
1941
class BzrRenameFailedError(BzrMoveFailedError):
1995
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1996
"%(_has_extra)s%(extra)s")
1943
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1998
1945
def __init__(self, from_path, to_path, extra=None):
1999
1946
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1948
class BzrRemoveChangedFilesError(BzrError):
1949
"""Used when user is trying to remove changed files."""
1951
_fmt = ("Can't safely remove modified or unknown files:\n"
1952
"%(changes_as_text)s"
1953
"Use --keep to not delete them, or --force to delete them regardless.")
1955
def __init__(self, tree_delta):
1956
BzrError.__init__(self)
1957
self.changes_as_text = tree_delta.get_changes_as_text()
1958
#self.paths_as_string = '\n'.join(changed_files)
1959
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2002
1962
class BzrBadParameterNotString(BzrBadParameter):
2637
2597
This is distinct from ErrorFromSmartServer so that it is possible to
2638
2598
distinguish between the following two cases:
2640
- ErrorFromSmartServer was uncaught. This is logic error in the client
2641
and so should provoke a traceback to the user.
2642
- ErrorFromSmartServer was caught but its error_tuple could not be
2643
translated. This is probably because the server sent us garbage, and
2644
should not provoke a traceback.
2599
- ErrorFromSmartServer was uncaught. This is logic error in the client
2600
and so should provoke a traceback to the user.
2601
- ErrorFromSmartServer was caught but its error_tuple could not be
2602
translated. This is probably because the server sent us garbage, and
2603
should not provoke a traceback.
2647
2606
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2854
2813
more = ' ' + more
2855
2814
import bzrlib.urlutils as urlutils
2856
user_url = getattr(tree, "user_url", None)
2857
if user_url is None:
2858
display_url = str(tree)
2860
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2815
display_url = urlutils.unescape_for_display(
2816
tree.bzrdir.root_transport.base, 'ascii')
2861
2817
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2864
class ShelvedChanges(UncommittedChanges):
2866
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2867
' (See bzr shelve --list).%(more)s')
2870
2820
class MissingTemplateVariable(BzrError):
2872
2822
_fmt = 'Variable {%(name)s} is not available.'
2938
2888
from bzrlib.osutils import get_user_encoding
2939
2889
self.path = path
2940
2890
self.kind = kind
2941
self.user_encoding = get_user_encoding()
2944
class NoSuchConfig(BzrError):
2946
_fmt = ('The "%(config_id)s" configuration does not exist.')
2948
def __init__(self, config_id):
2949
BzrError.__init__(self, config_id=config_id)
2952
class NoSuchConfigOption(BzrError):
2954
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2956
def __init__(self, option_name):
2957
BzrError.__init__(self, option_name=option_name)
2891
self.user_encoding = osutils.get_user_encoding()
2960
2894
class NoSuchAlias(BzrError):
3005
2939
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2942
class HookFailed(BzrError):
2943
"""Raised when a pre_change_branch_tip hook function fails anything other
2944
than TipChangeRejected.
2947
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2948
"%(traceback_text)s%(exc_value)s")
2950
def __init__(self, hook_stage, hook_name, exc_info):
2952
self.hook_stage = hook_stage
2953
self.hook_name = hook_name
2954
self.exc_info = exc_info
2955
self.exc_type = exc_info[0]
2956
self.exc_value = exc_info[1]
2957
self.exc_tb = exc_info[2]
2958
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3008
2961
class TipChangeRejected(BzrError):
3009
2962
"""A pre_change_branch_tip hook function may raise this to cleanly and
3010
2963
explicitly abort a change to a branch tip.
3134
3075
def __init__(self, source_branch, target_branch):
3135
3076
self.source_branch = source_branch
3136
3077
self.target_branch = target_branch
3139
class NoRoundtrippingSupport(BzrError):
3141
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3142
"%(target_branch)r.")
3144
internal_error = True
3146
def __init__(self, source_branch, target_branch):
3147
self.source_branch = source_branch
3148
self.target_branch = target_branch
3151
class FileTimestampUnavailable(BzrError):
3153
_fmt = "The filestamp for %(path)s is not available."
3155
internal_error = True
3157
def __init__(self, path):
3161
class NoColocatedBranchSupport(BzrError):
3163
_fmt = ("%(bzrdir)r does not support co-located branches.")
3165
def __init__(self, bzrdir):
3166
self.bzrdir = bzrdir
3169
class NoWhoami(BzrError):
3171
_fmt = ('Unable to determine your name.\n'
3172
"Please, set your name with the 'whoami' command.\n"
3173
'E.g. bzr whoami "Your Name <name@example.com>"')
3176
class InvalidPattern(BzrError):
3178
_fmt = ('Invalid pattern(s) found. %(msg)s')
3180
def __init__(self, msg):
3184
class RecursiveBind(BzrError):
3186
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3187
'Please use `bzr unbind` to fix.')
3189
def __init__(self, branch_url):
3190
self.branch_url = branch_url
3193
# FIXME: I would prefer to define the config related exception classes in
3194
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3195
class OptionExpansionLoop(BzrError):
3197
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3199
def __init__(self, string, refs):
3200
self.string = string
3201
self.refs = '->'.join(refs)
3204
class ExpandingUnknownOption(BzrError):
3206
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3208
def __init__(self, name, string):
3210
self.string = string
3213
class NoCompatibleInter(BzrError):
3215
_fmt = ('No compatible object available for operations from %(source)r '
3218
def __init__(self, source, target):
3219
self.source = source
3220
self.target = target
3223
class HpssVfsRequestNotAllowed(BzrError):
3225
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3226
"%(method)s, %(arguments)s.")
3228
def __init__(self, method, arguments):
3229
self.method = method
3230
self.arguments = arguments
3233
class UnsupportedKindChange(BzrError):
3235
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3236
"%(path)s not supported by format %(format)r")
3238
def __init__(self, path, from_kind, to_kind, format):
3240
self.from_kind = from_kind
3241
self.to_kind = to_kind
3242
self.format = format
3245
class PatchSyntax(BzrError):
3246
"""Base class for patch syntax errors."""
3249
class BinaryFiles(BzrError):
3251
_fmt = 'Binary files section encountered.'
3253
def __init__(self, orig_name, mod_name):
3254
self.orig_name = orig_name
3255
self.mod_name = mod_name
3258
class MalformedPatchHeader(PatchSyntax):
3260
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3262
def __init__(self, desc, line):
3267
class MalformedHunkHeader(PatchSyntax):
3269
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3271
def __init__(self, desc, line):
3276
class MalformedLine(PatchSyntax):
3278
_fmt = "Malformed line. %(desc)s\n%(line)r"
3280
def __init__(self, desc, line):
3285
class PatchConflict(BzrError):
3287
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3288
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3290
def __init__(self, line_no, orig_line, patch_line):
3291
self.line_no = line_no
3292
self.orig_line = orig_line.rstrip('\n')
3293
self.patch_line = patch_line.rstrip('\n')