1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005-2013, 2016 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""Exceptions for bzr, and reporting of them.
24
from bzrlib.patches import (
20
from __future__ import absolute_import
33
22
# TODO: is there any value in providing the .args field used by standard
34
23
# python exceptions? A list of values with no names seems less useful
106
95
# __str__() should always return a 'str' object
107
96
# 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),
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),
116
108
def __unicode__(self):
117
109
u = self._format()
140
132
"""Return format string for this exception or None"""
141
133
fmt = getattr(self, '_fmt', None)
142
134
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),
135
from bzrlib.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
156
138
def __eq__(self, other):
157
139
if self.__class__ is not other.__class__:
170
152
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
155
class AlreadyBuilding(BzrError):
208
157
_fmt = "The tree builder is already building a tree."
622
571
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
624
def __init__(self, url, extra):
573
def __init__(self, url, extra=""):
625
574
PathError.__init__(self, url, extra=extra)
751
700
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
703
class AlreadyControlDirError(PathError):
705
_fmt = 'A control directory already exists: "%(path)s".'
754
708
class AlreadyBranchError(PathError):
756
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".'
759
727
class BranchExistsWithoutWorkingTree(PathError):
761
729
_fmt = 'Directory contains a branch, but no working tree \
790
758
self.path = bzrdir.transport.clone('..').base
793
class FileInWrongBranch(BzrError):
795
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
797
# use PathNotChild instead
798
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
799
def __init__(self, branch, path):
800
BzrError.__init__(self)
802
self.branch_base = branch.base
806
761
class UnsupportedFormatError(BzrError):
808
763
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
827
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)
830
797
class IncompatibleRepositories(BzrError):
831
798
"""Report an error that two repositories are not compatible.
1221
1188
self.extra = ''
1224
class HistoryMissing(BzrError):
1226
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1229
1191
class AppendRevisionsOnlyViolation(BzrError):
1231
1193
_fmt = ('Operation denied because it would change the main history,'
1296
1258
not_ancestor_id=not_ancestor_id)
1299
class AmbiguousBase(BzrError):
1301
def __init__(self, bases):
1302
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1303
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1304
msg = ("The correct base is unclear, because %s are all equally close"
1306
BzrError.__init__(self, msg)
1310
1261
class NoCommits(BranchError):
1312
1263
_fmt = "Branch %(branch)s has no commits."
1661
1612
def __init__(self, exc_info):
1662
1613
import traceback
1614
# GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1663
1615
self.exc_type, self.exc_value, self.exc_tb = exc_info
1664
1616
self.exc_info = exc_info
1665
1617
traceback_strings = traceback.format_exception(
1704
1656
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1659
class ConnectionTimeout(ConnectionError):
1661
_fmt = "Connection Timeout: %(msg)s%(orig_error)s"
1707
1664
class InvalidRange(TransportError):
1709
1666
_fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
1803
1760
self.errors = '\n'.join(e.msg for e in errors)
1763
class ConfigOptionValueError(BzrError):
1765
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1766
'See ``bzr help %(name)s``')
1768
def __init__(self, name, value):
1769
BzrError.__init__(self, name=name, value=value)
1806
1772
class NoEmailInUsername(BzrError):
1808
1774
_fmt = "%(username)r does not seem to contain a reasonable email address"
2065
2031
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2068
class BzrRemoveChangedFilesError(BzrError):
2069
"""Used when user is trying to remove changed files."""
2071
_fmt = ("Can't safely remove modified or unknown files:\n"
2072
"%(changes_as_text)s"
2073
"Use --keep to not delete them, or --force to delete them regardless.")
2075
def __init__(self, tree_delta):
2076
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2077
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2078
BzrError.__init__(self)
2079
self.changes_as_text = tree_delta.get_changes_as_text()
2080
#self.paths_as_string = '\n'.join(changed_files)
2081
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
2084
2034
class BzrBadParameterNotString(BzrBadParameter):
2086
2036
_fmt = "Parameter %(param)s is not a string or unicode string."
2295
class GhostTagsNotSupported(BzrError):
2297
_fmt = "Ghost tags not supported by format %(format)r."
2299
def __init__(self, format):
2300
self.format = format
2345
2303
class BinaryFile(BzrError):
2347
2305
_fmt = "File is binary but should be text."
2777
2735
_fmt = "Container has multiple records with the same name: %(name)s"
2779
2737
def __init__(self, name):
2738
self.name = name.decode("utf-8")
2783
2741
class NoDestinationAddress(InternalBzrError):
2811
2769
_fmt = "No mail-to address (--mail-to) or output (-o) specified."
2814
class UnknownMailClient(BzrError):
2816
_fmt = "Unknown mail client: %(mail_client)s"
2818
def __init__(self, mail_client):
2819
BzrError.__init__(self, mail_client=mail_client)
2822
2772
class MailClientNotFound(BzrError):
2824
2774
_fmt = "Unable to find mail client with the following names:"\
2935
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)
2938
2903
class ShelvedChanges(UncommittedChanges):
2940
2905
_fmt = ('Working tree "%(display_url)s" has shelved changes'
3079
3044
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3082
class HookFailed(BzrError):
3083
"""Raised when a pre_change_branch_tip hook function fails anything other
3084
than TipChangeRejected.
3086
Note that this exception is no longer raised, and the import is only left
3087
to be nice to code which might catch it in a plugin.
3090
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3091
"%(traceback_text)s%(exc_value)s")
3093
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3095
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3096
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3098
self.hook_stage = hook_stage
3099
self.hook_name = hook_name
3100
self.exc_info = exc_info
3101
self.exc_type = exc_info[0]
3102
self.exc_value = exc_info[1]
3103
self.exc_tb = exc_info[2]
3104
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3107
3047
class TipChangeRejected(BzrError):
3108
3048
"""A pre_change_branch_tip hook function may raise this to cleanly and
3109
3049
explicitly abort a change to a branch tip.
3303
3243
class ExpandingUnknownOption(BzrError):
3305
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3245
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3307
3247
def __init__(self, name, string):
3308
3248
self.name = name
3309
3249
self.string = string
3252
class IllegalOptionName(BzrError):
3254
_fmt = 'Option "%(name)s" is not allowed.'
3256
def __init__(self, name):
3312
3260
class NoCompatibleInter(BzrError):
3314
3262
_fmt = ('No compatible object available for operations from %(source)r '
3319
3267
self.target = target
3270
class HpssVfsRequestNotAllowed(BzrError):
3272
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3273
"%(method)s, %(arguments)s.")
3275
def __init__(self, method, arguments):
3276
self.method = method
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
3322
3292
class MissingFeature(BzrError):
3324
3294
_fmt = ("Missing feature %(feature)s not provided by this "
3328
3298
self.feature = feature
3331
class ParseFormatError(BzrError):
3333
_fmt = "Parse error on line %(lineno)d of format name: %(line)s"
3335
def __init__(self, lineno, line, text):
3336
BzrError.__init__(self)
3337
self.lineno = lineno
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.')