17
17
"""Exceptions for bzr, and reporting of them.
26
from bzrlib.i18n import gettext
27
from bzrlib.patches import (
20
from __future__ import absolute_import
36
22
# TODO: is there any value in providing the .args field used by standard
37
23
# python exceptions? A list of values with no names seems less useful
109
95
# __str__() should always return a 'str' object
110
96
# never a 'unicode' object.
112
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
113
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
114
% (self.__class__.__name__,
116
getattr(self, '_fmt', None),
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),
119
108
def __unicode__(self):
120
109
u = self._format()
143
132
"""Return format string for this exception or None"""
144
133
fmt = getattr(self, '_fmt', None)
145
134
if fmt is not None:
147
unicode_fmt = unicode(fmt) #_fmt strings should be ascii
148
if type(fmt) == unicode:
149
trace.mutter("Unicode strings in error.fmt are deprecated")
150
return gettext(unicode_fmt)
151
fmt = getattr(self, '__doc__', None)
153
symbol_versioning.warn("%s uses its docstring as a format, "
154
"it should use _fmt instead" % self.__class__.__name__,
157
return 'Unprintable exception %s: dict=%r, fmt=%r' \
158
% (self.__class__.__name__,
160
getattr(self, '_fmt', None),
135
from bzrlib.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
163
138
def __eq__(self, other):
164
139
if self.__class__ is not other.__class__:
177
152
internal_error = True
180
class BzrNewError(BzrError):
181
"""Deprecated error base class."""
182
# base classes should override the docstring with their human-
183
# readable explanation
185
def __init__(self, *args, **kwds):
186
# XXX: Use the underlying BzrError to always generate the args
187
# attribute if it doesn't exist. We can't use super here, because
188
# exceptions are old-style classes in python2.4 (but new in 2.5).
190
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
191
'please convert %s to use BzrError instead'
192
% self.__class__.__name__,
195
BzrError.__init__(self, *args)
196
for key, value in kwds.items():
197
setattr(self, key, value)
201
# __str__() should always return a 'str' object
202
# never a 'unicode' object.
203
s = self.__doc__ % self.__dict__
204
if isinstance(s, unicode):
205
return s.encode('utf8')
207
except (TypeError, NameError, ValueError, KeyError), e:
208
return 'Unprintable exception %s(%r): %r' \
209
% (self.__class__.__name__,
213
155
class AlreadyBuilding(BzrError):
215
157
_fmt = "The tree builder is already building a tree."
758
700
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
703
class AlreadyControlDirError(PathError):
705
_fmt = 'A control directory already exists: "%(path)s".'
761
708
class AlreadyBranchError(PathError):
763
710
_fmt = 'Already a branch: "%(path)s".'
713
class InvalidBranchName(PathError):
715
_fmt = "Invalid branch name: %(name)s"
717
def __init__(self, name):
718
BzrError.__init__(self)
722
class ParentBranchExists(AlreadyBranchError):
724
_fmt = 'Parent branch already exists: "%(path)s".'
766
727
class BranchExistsWithoutWorkingTree(PathError):
768
729
_fmt = 'Directory contains a branch, but no working tree \
797
758
self.path = bzrdir.transport.clone('..').base
800
class FileInWrongBranch(BzrError):
802
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
804
# use PathNotChild instead
805
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
806
def __init__(self, branch, path):
807
BzrError.__init__(self)
809
self.branch_base = branch.base
813
761
class UnsupportedFormatError(BzrError):
815
763
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
834
782
self.bzrdir = bzrdir_format
785
class ParseFormatError(BzrError):
787
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
789
def __init__(self, format, lineno, line, text):
790
BzrError.__init__(self)
837
797
class IncompatibleRepositories(BzrError):
838
798
"""Report an error that two repositories are not compatible.
1303
1258
not_ancestor_id=not_ancestor_id)
1306
class AmbiguousBase(BzrError):
1308
def __init__(self, bases):
1309
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1310
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1311
msg = ("The correct base is unclear, because %s are all equally close"
1313
BzrError.__init__(self, msg)
1317
1261
class NoCommits(BranchError):
1319
1263
_fmt = "Branch %(branch)s has no commits."
1818
1763
class ConfigOptionValueError(BzrError):
1820
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1765
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1766
'See ``bzr help %(name)s``')
1822
1768
def __init__(self, name, value):
1823
1769
BzrError.__init__(self, name=name, value=value)
2085
2031
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2088
class BzrRemoveChangedFilesError(BzrError):
2089
"""Used when user is trying to remove changed files."""
2091
_fmt = ("Can't safely remove modified or unknown files:\n"
2092
"%(changes_as_text)s"
2093
"Use --keep to not delete them, or --force to delete them regardless.")
2095
def __init__(self, tree_delta):
2096
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2097
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2098
BzrError.__init__(self)
2099
self.changes_as_text = tree_delta.get_changes_as_text()
2100
#self.paths_as_string = '\n'.join(changed_files)
2101
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2104
2034
class BzrBadParameterNotString(BzrBadParameter):
2106
2036
_fmt = "Parameter %(param)s is not a string or unicode string."
2839
2769
_fmt = "No mail-to address (--mail-to) or output (-o) specified."
2842
class UnknownMailClient(BzrError):
2844
_fmt = "Unknown mail client: %(mail_client)s"
2846
def __init__(self, mail_client):
2847
BzrError.__init__(self, mail_client=mail_client)
2850
2772
class MailClientNotFound(BzrError):
2852
2774
_fmt = "Unable to find mail client with the following names:"\
2963
2885
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2888
class StoringUncommittedNotSupported(BzrError):
2890
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2893
def __init__(self, branch):
2894
import bzrlib.urlutils as urlutils
2895
user_url = getattr(branch, "user_url", None)
2896
if user_url is None:
2897
display_url = str(branch)
2899
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2900
BzrError.__init__(self, branch=branch, display_url=display_url)
2966
2903
class ShelvedChanges(UncommittedChanges):
2968
2905
_fmt = ('Working tree "%(display_url)s" has shelved changes'
3107
3044
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3110
class HookFailed(BzrError):
3111
"""Raised when a pre_change_branch_tip hook function fails anything other
3112
than TipChangeRejected.
3114
Note that this exception is no longer raised, and the import is only left
3115
to be nice to code which might catch it in a plugin.
3118
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3119
"%(traceback_text)s%(exc_value)s")
3121
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3123
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3124
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3126
self.hook_stage = hook_stage
3127
self.hook_name = hook_name
3128
self.exc_info = exc_info
3129
self.exc_type = exc_info[0]
3130
self.exc_value = exc_info[1]
3131
self.exc_tb = exc_info[2]
3132
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3135
3047
class TipChangeRejected(BzrError):
3136
3048
"""A pre_change_branch_tip hook function may raise this to cleanly and
3137
3049
explicitly abort a change to a branch tip.
3331
3243
class ExpandingUnknownOption(BzrError):
3333
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3245
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3335
3247
def __init__(self, name, string):
3336
3248
self.name = name
3337
3249
self.string = string
3252
class IllegalOptionName(BzrError):
3254
_fmt = 'Option "%(name)s" is not allowed.'
3256
def __init__(self, name):
3340
3260
class NoCompatibleInter(BzrError):
3342
3262
_fmt = ('No compatible object available for operations from %(source)r '
3355
3275
def __init__(self, method, arguments):
3356
3276
self.method = method
3357
3277
self.arguments = arguments
3280
class UnsupportedKindChange(BzrError):
3282
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3283
"%(path)s not supported by format %(format)r")
3285
def __init__(self, path, from_kind, to_kind, format):
3287
self.from_kind = from_kind
3288
self.to_kind = to_kind
3289
self.format = format
3292
class MissingFeature(BzrError):
3294
_fmt = ("Missing feature %(feature)s not provided by this "
3295
"version of Bazaar or any plugin.")
3297
def __init__(self, feature):
3298
self.feature = feature
3301
class PatchSyntax(BzrError):
3302
"""Base class for patch syntax errors."""
3305
class BinaryFiles(BzrError):
3307
_fmt = 'Binary files section encountered.'
3309
def __init__(self, orig_name, mod_name):
3310
self.orig_name = orig_name
3311
self.mod_name = mod_name
3314
class MalformedPatchHeader(PatchSyntax):
3316
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3318
def __init__(self, desc, line):
3323
class MalformedHunkHeader(PatchSyntax):
3325
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3327
def __init__(self, desc, line):
3332
class MalformedLine(PatchSyntax):
3334
_fmt = "Malformed line. %(desc)s\n%(line)r"
3336
def __init__(self, desc, line):
3341
class PatchConflict(BzrError):
3343
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3344
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3346
def __init__(self, line_no, orig_line, patch_line):
3347
self.line_no = line_no
3348
self.orig_line = orig_line.rstrip('\n')
3349
self.patch_line = patch_line.rstrip('\n')
3352
class FeatureAlreadyRegistered(BzrError):
3354
_fmt = 'The feature %(feature)s has already been registered.'
3356
def __init__(self, feature):
3357
self.feature = feature
3360
class ChangesAlreadyStored(BzrCommandError):
3362
_fmt = ('Cannot store uncommitted changes because this branch already'
3363
' stores uncommitted changes.')