73
72
arguments can be given. The first is for generic "user" errors which
74
73
are not intended to be caught and so do not need a specific subclass.
75
74
The second case is for use with subclasses that provide a _fmt format
76
string to print the arguments.
75
string to print the arguments.
78
Keyword arguments are taken as parameters to the error, which can
79
be inserted into the format string template. It's recommended
80
that subclasses override the __init__ method to require specific
77
Keyword arguments are taken as parameters to the error, which can
78
be inserted into the format string template. It's recommended
79
that subclasses override the __init__ method to require specific
83
82
:param msg: If given, this is the literal complete text for the error,
84
not subject to expansion.
83
not subject to expansion. 'msg' is used instead of 'message' because
84
python evolved and, in 2.6, forbids the use of 'message'.
86
86
StandardError.__init__(self)
87
87
if msg is not None:
93
93
for key, value in kwds.items():
94
94
setattr(self, key, value)
97
97
s = getattr(self, '_preformatted_string', None)
99
# contains a preformatted message; must be cast to plain str
99
# contains a preformatted message
102
102
fmt = self._get_format_string()
104
104
d = dict(self.__dict__)
105
# special case: python2.5 puts the 'message' attribute in a
106
# slot, so it isn't seen in __dict__
107
d['message'] = getattr(self, 'message', 'no message')
109
106
# __str__() should always return a 'str' object
110
107
# never a 'unicode' object.
111
if isinstance(s, unicode):
112
return s.encode('utf8')
114
109
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
115
110
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
752
795
class IncompatibleRepositories(BzrError):
754
_fmt = "Repository %(target)s is not compatible with repository"\
757
def __init__(self, source, target):
758
BzrError.__init__(self, target=target, source=source)
796
"""Report an error that two repositories are not compatible.
798
Note that the source and target repositories are permitted to be strings:
799
this exception is thrown from the smart server and may refer to a
800
repository the client hasn't opened.
803
_fmt = "%(target)s\n" \
804
"is not compatible with\n" \
808
def __init__(self, source, target, details=None):
810
details = "(no details)"
811
BzrError.__init__(self, target=target, source=source, details=details)
761
814
class IncompatibleRevision(BzrError):
763
816
_fmt = "Revision is not compatible with %(repo_format)s"
765
818
def __init__(self, repo_format):
1422
1494
self.options = options
1497
class RetryWithNewPacks(BzrError):
1498
"""Raised when we realize that the packs on disk have changed.
1500
This is meant as more of a signaling exception, to trap between where a
1501
local error occurred and the code that can actually handle the error and
1502
code that can retry appropriately.
1505
internal_error = True
1507
_fmt = ("Pack files have changed, reload and retry. context: %(context)s"
1510
def __init__(self, context, reload_occurred, exc_info):
1511
"""create a new RetryWithNewPacks error.
1513
:param reload_occurred: Set to True if we know that the packs have
1514
already been reloaded, and we are failing because of an in-memory
1515
cache miss. If set to True then we will ignore if a reload says
1516
nothing has changed, because we assume it has already reloaded. If
1517
False, then a reload with nothing changed will force an error.
1518
:param exc_info: The original exception traceback, so if there is a
1519
problem we can raise the original error (value from sys.exc_info())
1521
BzrError.__init__(self)
1522
self.reload_occurred = reload_occurred
1523
self.exc_info = exc_info
1524
self.orig_error = exc_info[1]
1525
# TODO: The global error handler should probably treat this by
1526
# raising/printing the original exception with a bit about
1527
# RetryWithNewPacks also not being caught
1530
class RetryAutopack(RetryWithNewPacks):
1531
"""Raised when we are autopacking and we find a missing file.
1533
Meant as a signaling exception, to tell the autopack code it should try
1537
internal_error = True
1539
_fmt = ("Pack files have changed, reload and try autopack again."
1540
" context: %(context)s %(orig_error)s")
1425
1543
class NoSuchExportFormat(BzrError):
1427
1545
_fmt = "Export format %(format)r not supported"
1429
1547
def __init__(self, format):
1566
1692
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1568
def __init__(self, source, target, is_permanent=False, qual_proto=None):
1694
def __init__(self, source, target, is_permanent=False):
1569
1695
self.source = source
1570
1696
self.target = target
1571
1697
if is_permanent:
1572
1698
self.permanently = ' permanently'
1574
1700
self.permanently = ''
1575
self._qualified_proto = qual_proto
1576
1701
TransportError.__init__(self)
1578
def _requalify_url(self, url):
1579
"""Restore the qualified proto in front of the url"""
1580
# When this exception is raised, source and target are in
1581
# user readable format. But some transports may use a
1582
# different proto (http+urllib:// will present http:// to
1583
# the user. If a qualified proto is specified, the code
1584
# trapping the exception can get the qualified urls to
1585
# properly handle the redirection themself (creating a
1586
# new transport object from the target url for example).
1587
# But checking that the scheme of the original and
1588
# redirected urls are the same can be tricky. (see the
1589
# FIXME in BzrDir.open_from_transport for the unique use
1591
if self._qualified_proto is None:
1594
# The TODO related to NotBranchError mention that doing
1595
# that kind of manipulation on the urls may not be the
1596
# exception object job. On the other hand, this object is
1597
# the interface between the code and the user so
1598
# presenting the urls in different ways is indeed its
1601
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1602
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1605
def get_source_url(self):
1606
return self._requalify_url(self.source)
1608
def get_target_url(self):
1609
return self._requalify_url(self.target)
1612
1704
class TooManyRedirections(TransportError):
2168
2272
self.text = text
2171
class MalformedHeader(BadBundle):
2275
class MalformedHeader(BadBundle):
2173
2277
_fmt = "Malformed bzr revision-bundle header: %(text)r"
2176
class MalformedPatches(BadBundle):
2280
class MalformedPatches(BadBundle):
2178
2282
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
2181
class MalformedFooter(BadBundle):
2285
class MalformedFooter(BadBundle):
2183
2287
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
2186
2290
class UnsupportedEOLMarker(BadBundle):
2188
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2292
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2190
2294
def __init__(self):
2191
# XXX: BadBundle's constructor assumes there's explanatory text,
2295
# XXX: BadBundle's constructor assumes there's explanatory text,
2192
2296
# but for this there is not
2193
2297
BzrError.__init__(self)
2196
2300
class IncompatibleBundleFormat(BzrError):
2198
2302
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
2200
2304
def __init__(self, bundle_format, other):
2707
2885
'user encoding %(user_encoding)s')
2709
2887
def __init__(self, path, kind):
2888
from bzrlib.osutils import get_user_encoding
2710
2889
self.path = path
2711
2890
self.kind = kind
2712
2891
self.user_encoding = osutils.get_user_encoding()
2894
class NoSuchAlias(BzrError):
2896
_fmt = ('The alias "%(alias_name)s" does not exist.')
2898
def __init__(self, alias_name):
2899
BzrError.__init__(self, alias_name=alias_name)
2902
class DirectoryLookupFailure(BzrError):
2903
"""Base type for lookup errors."""
2908
class InvalidLocationAlias(DirectoryLookupFailure):
2910
_fmt = '"%(alias_name)s" is not a valid location alias.'
2912
def __init__(self, alias_name):
2913
DirectoryLookupFailure.__init__(self, alias_name=alias_name)
2916
class UnsetLocationAlias(DirectoryLookupFailure):
2918
_fmt = 'No %(alias_name)s location assigned.'
2920
def __init__(self, alias_name):
2921
DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
2715
2924
class CannotBindAddress(BzrError):
2717
2926
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2719
2928
def __init__(self, host, port, orig_error):
2929
# nb: in python2.4 socket.error doesn't have a useful repr
2720
2930
BzrError.__init__(self, host=host, port=port,
2721
orig_error=orig_error[1])
2931
orig_error=repr(orig_error.args))
2934
class UnknownRules(BzrError):
2936
_fmt = ('Unknown rules detected: %(unknowns_str)s.')
2938
def __init__(self, unknowns):
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))
2961
class TipChangeRejected(BzrError):
2962
"""A pre_change_branch_tip hook function may raise this to cleanly and
2963
explicitly abort a change to a branch tip.
2966
_fmt = u"Tip change rejected: %(msg)s"
2968
def __init__(self, msg):
2972
class ShelfCorrupt(BzrError):
2974
_fmt = "Shelf corrupt."
2977
class NoSuchShelfId(BzrError):
2979
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
2981
def __init__(self, shelf_id):
2982
BzrError.__init__(self, shelf_id=shelf_id)
2985
class InvalidShelfId(BzrError):
2987
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
2989
def __init__(self, invalid_id):
2990
BzrError.__init__(self, invalid_id=invalid_id)
2993
class JailBreak(BzrError):
2995
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
2997
def __init__(self, url):
2998
BzrError.__init__(self, url=url)
3001
class UserAbort(BzrError):
3003
_fmt = 'The user aborted the operation.'
3006
class MustHaveWorkingTree(BzrError):
3008
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
3010
def __init__(self, format, url):
3011
BzrError.__init__(self, format=format, url=url)
3014
class NoSuchView(BzrError):
3015
"""A view does not exist.
3018
_fmt = u"No such view: %(view_name)s."
3020
def __init__(self, view_name):
3021
self.view_name = view_name
3024
class ViewsNotSupported(BzrError):
3025
"""Views are not supported by a tree format.
3028
_fmt = ("Views are not supported by %(tree)s;"
3029
" use 'bzr upgrade' to change your tree to a later format.")
3031
def __init__(self, tree):
3035
class FileOutsideView(BzrError):
3037
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3040
def __init__(self, file_name, view_files):
3041
self.file_name = file_name
3042
self.view_str = ", ".join(view_files)
3045
class UnresumableWriteGroup(BzrError):
3047
_fmt = ("Repository %(repository)s cannot resume write group "
3048
"%(write_groups)r: %(reason)s")
3050
internal_error = True
3052
def __init__(self, repository, write_groups, reason):
3053
self.repository = repository
3054
self.write_groups = write_groups
3055
self.reason = reason
3058
class UnsuspendableWriteGroup(BzrError):
3060
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3062
internal_error = True
3064
def __init__(self, repository):
3065
self.repository = repository
3068
class LossyPushToSameVCS(BzrError):
3070
_fmt = ("Lossy push not possible between %(source_branch)r and "
3071
"%(target_branch)r that are in the same VCS.")
3073
internal_error = True
3075
def __init__(self, source_branch, target_branch):
3076
self.source_branch = source_branch
3077
self.target_branch = target_branch