34
33
# TODO: is there any value in providing the .args field used by standard
35
# python exceptions? A list of values with no names seems less useful
34
# python exceptions? A list of values with no names seems less useful
38
# TODO: Perhaps convert the exception to a string at the moment it's
37
# TODO: Perhaps convert the exception to a string at the moment it's
39
38
# constructed to make sure it will succeed. But that says nothing about
40
39
# exceptions that are never raised.
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,
478
477
def __init__(self, name, value):
479
478
BzrError.__init__(self, name=name, value=value)
482
481
class StrictCommitFailed(BzrError):
484
483
_fmt = "Commit refused because there are unknown files in the tree"
487
486
# XXX: Should be unified with TransportError; they seem to represent the
489
488
# RBC 20060929: I think that unifiying with TransportError would be a mistake
490
# - this is finer than a TransportError - and more useful as such. It
489
# - this is finer than a TransportError - and more useful as such. It
491
490
# differentiates between 'transport has failed' and 'operation on a transport
493
492
class PathError(BzrError):
495
494
_fmt = "Generic path error: %(path)r%(extra)s)"
497
496
def __init__(self, path, extra=None):
691
690
# TODO: This is given a URL; we try to unescape it but doing that from inside
692
691
# the exception object is a bit undesirable.
693
# TODO: Probably this behavior of should be a common superclass
692
# TODO: Probably this behavior of should be a common superclass
694
693
class NotBranchError(PathError):
696
695
_fmt = 'Not a branch: "%(path)s".'
1132
1131
class NoSuchRevisionInTree(NoSuchRevision):
1133
1132
"""When using Tree.revision_tree, and the revision is not accessible."""
1135
1134
_fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
1137
1136
def __init__(self, tree, revision_id):
1385
1384
class VersionedFileError(BzrError):
1387
1386
_fmt = "Versioned file error"
1390
1389
class RevisionNotPresent(VersionedFileError):
1392
1391
_fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
1394
1393
def __init__(self, revision_id, file_id):
1451
1450
def __init__(self, stream_format, target_format):
1452
1451
self.stream_format = stream_format
1453
1452
self.target_format = target_format
1456
1455
class KnitDataStreamUnknown(KnitError):
1457
1456
# Indicates a data stream we don't know how to handle.
1497
1496
internal_error = True
1499
_fmt = ("Pack files have changed, reload and retry. %(orig_error)s")
1498
_fmt = ("Pack files have changed, reload and retry. context: %(context)s"
1501
def __init__(self, reload_occurred, exc_info):
1502
"""create a new RestartWithNewPacks error.
1501
def __init__(self, context, reload_occurred, exc_info):
1502
"""create a new RetryWithNewPacks error.
1504
1504
:param reload_occurred: Set to True if we know that the packs have
1505
1505
already been reloaded, and we are failing because of an in-memory
1518
1518
# RetryWithNewPacks also not being caught
1521
class RetryAutopack(RetryWithNewPacks):
1522
"""Raised when we are autopacking and we find a missing file.
1524
Meant as a signaling exception, to tell the autopack code it should try
1528
internal_error = True
1530
_fmt = ("Pack files have changed, reload and try autopack again."
1531
" context: %(context)s %(orig_error)s")
1521
1534
class NoSuchExportFormat(BzrError):
1523
1536
_fmt = "Export format %(format)r not supported"
1525
1538
def __init__(self, format):
1580
1593
class SmartMessageHandlerError(InternalBzrError):
1582
_fmt = "The message handler raised an exception: %(exc_value)s."
1595
_fmt = ("The message handler raised an exception:\n"
1596
"%(traceback_text)s")
1584
1598
def __init__(self, exc_info):
1585
self.exc_type, self.exc_value, self.tb = exc_info
1600
self.exc_type, self.exc_value, self.exc_tb = exc_info
1601
self.exc_info = exc_info
1602
traceback_strings = traceback.format_exception(
1603
self.exc_type, self.exc_value, self.exc_tb)
1604
self.traceback_text = ''.join(traceback_strings)
1588
1607
# A set of semi-meaningful errors which can be thrown
1589
1608
class TransportNotPossible(TransportError):
1662
1681
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1664
def __init__(self, source, target, is_permanent=False, qual_proto=None):
1683
def __init__(self, source, target, is_permanent=False):
1665
1684
self.source = source
1666
1685
self.target = target
1667
1686
if is_permanent:
1668
1687
self.permanently = ' permanently'
1670
1689
self.permanently = ''
1671
self._qualified_proto = qual_proto
1672
1690
TransportError.__init__(self)
1674
def _requalify_url(self, url):
1675
"""Restore the qualified proto in front of the url"""
1676
# When this exception is raised, source and target are in
1677
# user readable format. But some transports may use a
1678
# different proto (http+urllib:// will present http:// to
1679
# the user. If a qualified proto is specified, the code
1680
# trapping the exception can get the qualified urls to
1681
# properly handle the redirection themself (creating a
1682
# new transport object from the target url for example).
1683
# But checking that the scheme of the original and
1684
# redirected urls are the same can be tricky. (see the
1685
# FIXME in BzrDir.open_from_transport for the unique use
1687
if self._qualified_proto is None:
1690
# The TODO related to NotBranchError mention that doing
1691
# that kind of manipulation on the urls may not be the
1692
# exception object job. On the other hand, this object is
1693
# the interface between the code and the user so
1694
# presenting the urls in different ways is indeed its
1697
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1698
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1701
def get_source_url(self):
1702
return self._requalify_url(self.source)
1704
def get_target_url(self):
1705
return self._requalify_url(self.target)
1708
1693
class TooManyRedirections(TransportError):
2064
2049
_fmt = """This tree contains left-over files from a failed operation.
2065
2050
Please examine %(limbo_dir)s to see if it contains any files you wish to
2066
2051
keep, and delete it when you are done."""
2068
2053
def __init__(self, limbo_dir):
2069
2054
BzrError.__init__(self)
2070
2055
self.limbo_dir = limbo_dir
2265
2245
self.text = text
2268
class MalformedHeader(BadBundle):
2248
class MalformedHeader(BadBundle):
2270
2250
_fmt = "Malformed bzr revision-bundle header: %(text)r"
2273
class MalformedPatches(BadBundle):
2253
class MalformedPatches(BadBundle):
2275
2255
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
2278
class MalformedFooter(BadBundle):
2258
class MalformedFooter(BadBundle):
2280
2260
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
2283
2263
class UnsupportedEOLMarker(BadBundle):
2285
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2265
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2287
2267
def __init__(self):
2288
# XXX: BadBundle's constructor assumes there's explanatory text,
2268
# XXX: BadBundle's constructor assumes there's explanatory text,
2289
2269
# but for this there is not
2290
2270
BzrError.__init__(self)
2293
2273
class IncompatibleBundleFormat(BzrError):
2295
2275
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
2297
2277
def __init__(self, bundle_format, other):
2764
2744
_fmt = "'%(display_url)s' is already standalone."
2747
class AlreadyWithTrees(BzrDirError):
2749
_fmt = ("Shared repository '%(display_url)s' already creates "
2753
class AlreadyWithNoTrees(BzrDirError):
2755
_fmt = ("Shared repository '%(display_url)s' already doesn't create "
2767
2759
class ReconfigurationNotSupported(BzrDirError):
2769
2761
_fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
2825
2817
class CommandAvailableInPlugin(StandardError):
2827
2819
internal_error = False
2829
2821
def __init__(self, cmd_name, plugin_metadata, provider):
2831
2823
self.plugin_metadata = plugin_metadata
2832
2824
self.cmd_name = cmd_name
2833
2825
self.provider = provider
2835
2827
def __str__(self):
2837
_fmt = ('"%s" is not a standard bzr command. \n'
2829
_fmt = ('"%s" is not a standard bzr command. \n'
2838
2830
'However, the following official plugin provides this command: %s\n'
2839
2831
'You can install it by going to: %s'
2840
% (self.cmd_name, self.plugin_metadata['name'],
2832
% (self.cmd_name, self.plugin_metadata['name'],
2841
2833
self.plugin_metadata['url']))
2846
2838
class NoPluginAvailable(BzrError):
2850
2842
class NotATerminal(BzrError):
2954
2946
BzrError.__init__(self, shelf_id=shelf_id)
2949
class InvalidShelfId(BzrError):
2951
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
2953
def __init__(self, invalid_id):
2954
BzrError.__init__(self, invalid_id=invalid_id)
2957
2957
class UserAbort(BzrError):
2959
2959
_fmt = 'The user aborted the operation.'
2962
class MustHaveWorkingTree(BzrError):
2964
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
2966
def __init__(self, format, url):
2967
BzrError.__init__(self, format=format, url=url)
2970
class NoSuchView(BzrError):
2971
"""A view does not exist.
2974
_fmt = u"No such view: %(view_name)s."
2976
def __init__(self, view_name):
2977
self.view_name = view_name
2980
class ViewsNotSupported(BzrError):
2981
"""Views are not supported by a tree format.
2984
_fmt = ("Views are not supported by %(tree)s;"
2985
" use 'bzr upgrade' to change your tree to a later format.")
2987
def __init__(self, tree):
2991
class FileOutsideView(BzrError):
2993
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
2996
def __init__(self, file_name, view_files):
2997
self.file_name = file_name
2998
self.view_str = ", ".join(view_files)
3001
class UnresumableWriteGroup(BzrError):
3003
_fmt = ("Repository %(repository)s cannot resume write group "
3004
"%(write_groups)r: %(reason)s")
3006
internal_error = True
3008
def __init__(self, repository, write_groups, reason):
3009
self.repository = repository
3010
self.write_groups = write_groups
3011
self.reason = reason
3014
class UnsuspendableWriteGroup(BzrError):
3016
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3018
internal_error = True
3020
def __init__(self, repository):
3021
self.repository = repository