85
34
# constructed to make sure it will succeed. But that says nothing about
86
35
# exceptions that are never raised.
88
# TODO: Convert all the other error classes here to BzrNewError, and eliminate
91
# TODO: The pattern (from hct) of using classes docstrings as message
92
# templates is cute but maybe not such a great idea - perhaps should have a
93
# separate static message_template.
37
# TODO: selftest assertRaises should probably also check that every error
38
# raised can be formatted as a string successfully, and without giving
96
42
class BzrError(StandardError):
44
Base class for errors raised by bzrlib.
46
:cvar internal_error: if true (or absent) this was probably caused by a
47
bzr bug and should be displayed with a traceback; if False this was
48
probably a user or environment error and they don't need the gory details.
49
(That can be overridden by -Derror on the command line.)
51
:cvar _fmt: Format string to display the error; this is expanded
52
by the instance's dict.
55
internal_error = False
57
def __init__(self, msg=None, **kwds):
58
"""Construct a new BzrError.
60
There are two alternative forms for constructing these objects.
61
Either a preformatted string may be passed, or a set of named
62
arguments can be given. The first is for generic "user" errors which
63
are not intended to be caught and so do not need a specific subclass.
64
The second case is for use with subclasses that provide a _fmt format
65
string to print the arguments.
67
Keyword arguments are taken as parameters to the error, which can
68
be inserted into the format string template. It's recommended
69
that subclasses override the __init__ method to require specific
72
:param msg: If given, this is the literal complete text for the error,
73
not subject to expansion.
75
StandardError.__init__(self)
77
# I was going to deprecate this, but it actually turns out to be
78
# quite handy - mbp 20061103.
79
self._preformatted_string = msg
81
self._preformatted_string = None
82
for key, value in kwds.items():
83
setattr(self, key, value)
100
85
def __str__(self):
101
# XXX: Should we show the exception class in
102
# exceptions that don't provide their own message?
103
# maybe it should be done at a higher level
104
## n = self.__class__.__name__ + ': '
106
if len(self.args) == 1:
107
return str(self.args[0])
108
elif len(self.args) == 2:
109
# further explanation or suggestions
111
return n + '\n '.join([self.args[0]] + self.args[1])
113
return n + "%r" % self
115
return n + `self.args`
86
s = getattr(self, '_preformatted_string', None)
88
# contains a preformatted message; must be cast to plain str
91
fmt = self._get_format_string()
93
s = fmt % self.__dict__
94
# __str__() should always return a 'str' object
95
# never a 'unicode' object.
96
if isinstance(s, unicode):
97
return s.encode('utf8')
99
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
100
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%s' \
101
% (self.__class__.__name__,
103
getattr(self, '_fmt', None),
106
def _get_format_string(self):
107
"""Return format string for this exception or None"""
108
fmt = getattr(self, '_fmt', None)
111
fmt = getattr(self, '__doc__', None)
113
symbol_versioning.warn("%s uses its docstring as a format, "
114
"it should use _fmt instead" % self.__class__.__name__,
117
return 'Unprintable exception %s: dict=%r, fmt=%r' \
118
% (self.__class__.__name__,
120
getattr(self, '_fmt', None),
118
124
class BzrNewError(BzrError):
125
"""Deprecated error base class."""
120
126
# base classes should override the docstring with their human-
121
127
# readable explanation
910
1081
BzrError.__init__(self, message)
913
class NoEmailInUsername(BzrNewError):
914
"""%(username)r does not seem to contain a reasonable email address"""
1084
class NoEmailInUsername(BzrError):
1086
_fmt = "%(username)r does not seem to contain a reasonable email address"
916
1088
def __init__(self, username):
917
BzrNewError.__init__(self)
1089
BzrError.__init__(self)
918
1090
self.username = username
921
1093
class SigningFailed(BzrError):
1095
_fmt = "Failed to gpg sign data with command %(command_line)r"
922
1097
def __init__(self, command_line):
923
BzrError.__init__(self, "Failed to gpg sign data with command '%s'"
1098
BzrError.__init__(self, command_line=command_line)
927
1101
class WorkingTreeNotRevision(BzrError):
1103
_fmt = ("The working tree for %(basedir)s has changed since"
1104
" the last commit, but weave merge requires that it be"
928
1107
def __init__(self, tree):
929
BzrError.__init__(self, "The working tree for %s has changed since"
930
" last commit, but weave merge requires that it be"
931
" unchanged." % tree.basedir)
934
class WritingCompleted(BzrNewError):
935
"""The MediumRequest '%(request)s' has already had finish_writing called upon it - accept bytes may not be called anymore."""
937
is_user_error = False
939
def __init__(self, request):
940
BzrNewError.__init__(self)
941
self.request = request
944
class WritingNotComplete(BzrNewError):
945
"""The MediumRequest '%(request)s' has not has finish_writing called upon it - until the write phase is complete no data may be read."""
947
is_user_error = False
949
def __init__(self, request):
950
BzrNewError.__init__(self)
951
self.request = request
954
class CantReprocessAndShowBase(BzrNewError):
955
"""Can't reprocess and show base.
956
Reprocessing obscures relationship of conflicting lines to base."""
959
class GraphCycleError(BzrNewError):
960
"""Cycle in graph %(graph)r"""
1108
BzrError.__init__(self, basedir=tree.basedir)
1111
class CantReprocessAndShowBase(BzrError):
1113
_fmt = "Can't reprocess and show base, because reprocessing obscures " \
1114
"the relationship of conflicting lines to the base"
1117
class GraphCycleError(BzrError):
1119
_fmt = "Cycle in graph %(graph)r"
961
1121
def __init__(self, graph):
962
BzrNewError.__init__(self)
1122
BzrError.__init__(self)
963
1123
self.graph = graph
966
class NotConflicted(BzrNewError):
967
"""File %(filename)s is not conflicted."""
1126
class WritingCompleted(BzrError):
1128
_fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
1129
"called upon it - accept bytes may not be called anymore.")
1131
internal_error = True
1133
def __init__(self, request):
1134
self.request = request
1137
class WritingNotComplete(BzrError):
1139
_fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
1140
"called upon it - until the write phase is complete no "
1141
"data may be read.")
1143
internal_error = True
1145
def __init__(self, request):
1146
self.request = request
1149
class NotConflicted(BzrError):
1151
_fmt = "File %(filename)s is not conflicted."
969
1153
def __init__(self, filename):
970
BzrNewError.__init__(self)
1154
BzrError.__init__(self)
971
1155
self.filename = filename
974
class MediumNotConnected(BzrNewError):
975
"""The medium '%(medium)s' is not connected."""
1158
class MediumNotConnected(BzrError):
1160
_fmt = """The medium '%(medium)s' is not connected."""
1162
internal_error = True
977
1164
def __init__(self, medium):
978
BzrNewError.__init__(self)
979
1165
self.medium = medium
982
1168
class MustUseDecorated(Exception):
983
"""A decorating function has requested its original command be used.
985
This should never escape bzr, so does not need to be printable.
989
class NoBundleFound(BzrNewError):
990
"""No bundle was found in %(filename)s"""
1170
_fmt = """A decorating function has requested its original command be used."""
1173
class NoBundleFound(BzrError):
1175
_fmt = "No bundle was found in %(filename)s"
991
1177
def __init__(self, filename):
992
BzrNewError.__init__(self)
1178
BzrError.__init__(self)
993
1179
self.filename = filename
996
class BundleNotSupported(BzrNewError):
997
"""Unable to handle bundle version %(version)s: %(msg)s"""
1182
class BundleNotSupported(BzrError):
1184
_fmt = "Unable to handle bundle version %(version)s: %(msg)s"
998
1186
def __init__(self, version, msg):
999
BzrNewError.__init__(self)
1187
BzrError.__init__(self)
1000
1188
self.version = version
1004
class MissingText(BzrNewError):
1005
"""Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"""
1192
class MissingText(BzrError):
1194
_fmt = "Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"
1007
1196
def __init__(self, branch, text_revision, file_id):
1008
BzrNewError.__init__(self)
1197
BzrError.__init__(self)
1009
1198
self.branch = branch
1010
1199
self.base = branch.base
1011
1200
self.text_revision = text_revision
1012
1201
self.file_id = file_id
1015
class DuplicateKey(BzrNewError):
1016
"""Key %(key)s is already present in map"""
1019
class MalformedTransform(BzrNewError):
1020
"""Tree transform is malformed %(conflicts)r"""
1023
class BzrBadParameter(BzrNewError):
1024
"""A bad parameter : %(param)s is not usable.
1026
This exception should never be thrown, but it is a base class for all
1027
parameter-to-function errors.
1204
class DuplicateKey(BzrError):
1206
_fmt = "Key %(key)s is already present in map"
1209
class MalformedTransform(BzrError):
1211
_fmt = "Tree transform is malformed %(conflicts)r"
1214
class NoFinalPath(BzrError):
1216
_fmt = ("No final name for trans_id %(trans_id)r\n"
1217
"file-id: %(file_id)r\n"
1218
"root trans-id: %(root_trans_id)r\n")
1220
def __init__(self, trans_id, transform):
1221
self.trans_id = trans_id
1222
self.file_id = transform.final_file_id(trans_id)
1223
self.root_trans_id = transform.root
1226
class BzrBadParameter(BzrError):
1228
_fmt = "Bad parameter: %(param)r"
1230
# This exception should never be thrown, but it is a base class for all
1231
# parameter-to-function errors.
1029
1233
def __init__(self, param):
1030
BzrNewError.__init__(self)
1234
BzrError.__init__(self)
1031
1235
self.param = param
1034
1238
class BzrBadParameterNotUnicode(BzrBadParameter):
1035
"""Parameter %(param)s is neither unicode nor utf8."""
1038
class ReusingTransform(BzrNewError):
1039
"""Attempt to reuse a transform that has already been applied."""
1042
class CantMoveRoot(BzrNewError):
1043
"""Moving the root directory is not supported at this time"""
1240
_fmt = "Parameter %(param)s is neither unicode nor utf8."
1243
class ReusingTransform(BzrError):
1245
_fmt = "Attempt to reuse a transform that has already been applied."
1248
class CantMoveRoot(BzrError):
1250
_fmt = "Moving the root directory is not supported at this time"
1046
1253
class BzrBadParameterNotString(BzrBadParameter):
1047
"""Parameter %(param)s is not a string or unicode string."""
1255
_fmt = "Parameter %(param)s is not a string or unicode string."
1050
1258
class BzrBadParameterMissing(BzrBadParameter):
1051
"""Parameter $(param)s is required but not present."""
1260
_fmt = "Parameter $(param)s is required but not present."
1054
1263
class BzrBadParameterUnicode(BzrBadParameter):
1055
"""Parameter %(param)s is unicode but only byte-strings are permitted."""
1265
_fmt = "Parameter %(param)s is unicode but only byte-strings are permitted."
1058
1268
class BzrBadParameterContainsNewline(BzrBadParameter):
1059
"""Parameter %(param)s contains a newline."""
1062
class DependencyNotPresent(BzrNewError):
1063
"""Unable to import library "%(library)s": %(error)s"""
1270
_fmt = "Parameter %(param)s contains a newline."
1273
class DependencyNotPresent(BzrError):
1275
_fmt = 'Unable to import library "%(library)s": %(error)s'
1065
1277
def __init__(self, library, error):
1066
BzrNewError.__init__(self, library=library, error=error)
1278
BzrError.__init__(self, library=library, error=error)
1069
1281
class ParamikoNotPresent(DependencyNotPresent):
1070
"""Unable to import paramiko (required for sftp support): %(error)s"""
1283
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
1072
1285
def __init__(self, error):
1073
1286
DependencyNotPresent.__init__(self, 'paramiko', error)
1076
class PointlessMerge(BzrNewError):
1077
"""Nothing to merge."""
1080
class UninitializableFormat(BzrNewError):
1081
"""Format %(format)s cannot be initialised by this version of bzr."""
1289
class PointlessMerge(BzrError):
1291
_fmt = "Nothing to merge."
1294
class UninitializableFormat(BzrError):
1296
_fmt = "Format %(format)s cannot be initialised by this version of bzr."
1083
1298
def __init__(self, format):
1084
BzrNewError.__init__(self)
1299
BzrError.__init__(self)
1085
1300
self.format = format
1088
class BadConversionTarget(BzrNewError):
1089
"""Cannot convert to format %(format)s. %(problem)s"""
1303
class BadConversionTarget(BzrError):
1305
_fmt = "Cannot convert to format %(format)s. %(problem)s"
1091
1307
def __init__(self, problem, format):
1092
BzrNewError.__init__(self)
1308
BzrError.__init__(self)
1093
1309
self.problem = problem
1094
1310
self.format = format
1097
class NoDiff(BzrNewError):
1098
"""Diff is not installed on this machine: %(msg)s"""
1313
class NoDiff(BzrError):
1315
_fmt = "Diff is not installed on this machine: %(msg)s"
1100
1317
def __init__(self, msg):
1101
BzrNewError.__init__(self, msg=msg)
1104
class NoDiff3(BzrNewError):
1105
"""Diff3 is not installed on this machine."""
1108
class ExistingLimbo(BzrNewError):
1109
"""This tree contains left-over files from a failed operation.
1110
Please examine %(limbo_dir)s to see if it contains any files you wish to
1111
keep, and delete it when you are done.
1113
def __init__(self, limbo_dir):
1114
BzrNewError.__init__(self)
1115
self.limbo_dir = limbo_dir
1118
class ImmortalLimbo(BzrNewError):
1119
"""Unable to delete transform temporary directory $(limbo_dir)s.
1120
Please examine %(limbo_dir)s to see if it contains any files you wish to
1121
keep, and delete it when you are done.
1123
def __init__(self, limbo_dir):
1124
BzrNewError.__init__(self)
1125
self.limbo_dir = limbo_dir
1128
class OutOfDateTree(BzrNewError):
1129
"""Working tree is out of date, please run 'bzr update'."""
1318
BzrError.__init__(self, msg=msg)
1321
class NoDiff3(BzrError):
1323
_fmt = "Diff3 is not installed on this machine."
1326
class ExistingLimbo(BzrError):
1328
_fmt = """This tree contains left-over files from a failed operation.
1329
Please examine %(limbo_dir)s to see if it contains any files you wish to
1330
keep, and delete it when you are done."""
1332
def __init__(self, limbo_dir):
1333
BzrError.__init__(self)
1334
self.limbo_dir = limbo_dir
1337
class ImmortalLimbo(BzrError):
1339
_fmt = """Unable to delete transform temporary directory $(limbo_dir)s.
1340
Please examine %(limbo_dir)s to see if it contains any files you wish to
1341
keep, and delete it when you are done."""
1343
def __init__(self, limbo_dir):
1344
BzrError.__init__(self)
1345
self.limbo_dir = limbo_dir
1348
class OutOfDateTree(BzrError):
1350
_fmt = "Working tree is out of date, please run 'bzr update'."
1131
1352
def __init__(self, tree):
1132
BzrNewError.__init__(self)
1353
BzrError.__init__(self)
1133
1354
self.tree = tree
1136
class MergeModifiedFormatError(BzrNewError):
1137
"""Error in merge modified format"""
1140
class ConflictFormatError(BzrNewError):
1141
"""Format error in conflict listings"""
1144
class CorruptRepository(BzrNewError):
1145
"""An error has been detected in the repository %(repo_path)s.
1357
class MergeModifiedFormatError(BzrError):
1359
_fmt = "Error in merge modified format"
1362
class ConflictFormatError(BzrError):
1364
_fmt = "Format error in conflict listings"
1367
class CorruptRepository(BzrError):
1369
_fmt = """An error has been detected in the repository %(repo_path)s.
1146
1370
Please run bzr reconcile on this repository."""
1148
1372
def __init__(self, repo):
1149
BzrNewError.__init__(self)
1373
BzrError.__init__(self)
1150
1374
self.repo_path = repo.bzrdir.root_transport.base
1153
class UpgradeRequired(BzrNewError):
1154
"""To use this feature you must upgrade your branch at %(path)s."""
1377
class UpgradeRequired(BzrError):
1379
_fmt = "To use this feature you must upgrade your branch at %(path)s."
1156
1381
def __init__(self, path):
1157
BzrNewError.__init__(self)
1382
BzrError.__init__(self)
1158
1383
self.path = path
1161
class LocalRequiresBoundBranch(BzrNewError):
1162
"""Cannot perform local-only commits on unbound branches."""
1165
class MissingProgressBarFinish(BzrNewError):
1166
"""A nested progress bar was not 'finished' correctly."""
1169
class InvalidProgressBarType(BzrNewError):
1170
"""Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
1386
class LocalRequiresBoundBranch(BzrError):
1388
_fmt = "Cannot perform local-only commits on unbound branches."
1391
class MissingProgressBarFinish(BzrError):
1393
_fmt = "A nested progress bar was not 'finished' correctly."
1396
class InvalidProgressBarType(BzrError):
1398
_fmt = """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
1171
1399
Select one of: %(valid_types)s"""
1173
1401
def __init__(self, bar_type, valid_types):
1174
BzrNewError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1177
class UnsupportedOperation(BzrNewError):
1178
"""The method %(mname)s is not supported on objects of type %(tname)s."""
1402
BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1405
class UnsupportedOperation(BzrError):
1407
_fmt = "The method %(mname)s is not supported on objects of type %(tname)s."
1179
1409
def __init__(self, method, method_self):
1180
1410
self.method = method
1181
1411
self.mname = method.__name__
1182
1412
self.tname = type(method_self).__name__
1185
class BinaryFile(BzrNewError):
1186
"""File is binary but should be text."""
1189
class IllegalPath(BzrNewError):
1190
"""The path %(path)s is not permitted on this platform"""
1415
class BinaryFile(BzrError):
1417
_fmt = "File is binary but should be text."
1420
class IllegalPath(BzrError):
1422
_fmt = "The path %(path)s is not permitted on this platform"
1192
1424
def __init__(self, path):
1193
BzrNewError.__init__(self)
1425
BzrError.__init__(self)
1194
1426
self.path = path
1197
class TestamentMismatch(BzrNewError):
1198
"""Testament did not match expected value.
1429
class TestamentMismatch(BzrError):
1431
_fmt = """Testament did not match expected value.
1199
1432
For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
1202
1435
def __init__(self, revision_id, expected, measured):
1203
1436
self.revision_id = revision_id
1204
1437
self.expected = expected
1205
1438
self.measured = measured
1208
class NotABundle(BzrNewError):
1209
"""Not a bzr revision-bundle: %(text)r"""
1441
class NotABundle(BzrError):
1443
_fmt = "Not a bzr revision-bundle: %(text)r"
1211
1445
def __init__(self, text):
1212
BzrNewError.__init__(self)
1446
BzrError.__init__(self)
1213
1447
self.text = text
1216
class BadBundle(BzrNewError):
1217
"""Bad bzr revision-bundle: %(text)r"""
1450
class BadBundle(BzrError):
1452
_fmt = "Bad bzr revision-bundle: %(text)r"
1219
1454
def __init__(self, text):
1220
BzrNewError.__init__(self)
1455
BzrError.__init__(self)
1221
1456
self.text = text
1224
1459
class MalformedHeader(BadBundle):
1225
"""Malformed bzr revision-bundle header: %(text)r"""
1227
def __init__(self, text):
1228
BzrNewError.__init__(self)
1461
_fmt = "Malformed bzr revision-bundle header: %(text)r"
1232
1464
class MalformedPatches(BadBundle):
1233
"""Malformed patches in bzr revision-bundle: %(text)r"""
1235
def __init__(self, text):
1236
BzrNewError.__init__(self)
1466
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
1240
1469
class MalformedFooter(BadBundle):
1241
"""Malformed footer in bzr revision-bundle: %(text)r"""
1243
def __init__(self, text):
1244
BzrNewError.__init__(self)
1471
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
1248
1474
class UnsupportedEOLMarker(BadBundle):
1249
"""End of line marker was not \\n in bzr revision-bundle"""
1476
_fmt = "End of line marker was not \\n in bzr revision-bundle"
1251
1478
def __init__(self):
1252
BzrNewError.__init__(self)
1255
class IncompatibleFormat(BzrNewError):
1256
"""Bundle format %(bundle_format)s is incompatible with %(other)s"""
1479
# XXX: BadBundle's constructor assumes there's explanatory text,
1480
# but for this there is not
1481
BzrError.__init__(self)
1484
class IncompatibleBundleFormat(BzrError):
1486
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
1258
1488
def __init__(self, bundle_format, other):
1259
BzrNewError.__init__(self)
1489
BzrError.__init__(self)
1260
1490
self.bundle_format = bundle_format
1261
1491
self.other = other
1264
class BadInventoryFormat(BzrNewError):
1265
"""Root class for inventory serialization errors"""
1494
class BadInventoryFormat(BzrError):
1496
_fmt = "Root class for inventory serialization errors"
1268
1499
class UnexpectedInventoryFormat(BadInventoryFormat):
1269
"""The inventory was not in the expected format:\n %(msg)s"""
1501
_fmt = "The inventory was not in the expected format:\n %(msg)s"
1271
1503
def __init__(self, msg):
1272
1504
BadInventoryFormat.__init__(self, msg=msg)
1275
class NoSmartMedium(BzrNewError):
1276
"""The transport '%(transport)s' cannot tunnel the smart protocol."""
1507
class NoSmartMedium(BzrError):
1509
_fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
1278
1511
def __init__(self, transport):
1279
BzrNewError.__init__(self)
1280
1512
self.transport = transport
1283
1515
class NoSmartServer(NotBranchError):
1284
"""No smart server available at %(url)s"""
1517
_fmt = "No smart server available at %(url)s"
1286
1519
def __init__(self, url):
1290
class UnknownSSH(BzrNewError):
1291
"""Unrecognised value for BZR_SSH environment variable: %(vendor)s"""
1523
class UnknownSSH(BzrError):
1525
_fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
1293
1527
def __init__(self, vendor):
1294
BzrNewError.__init__(self)
1528
BzrError.__init__(self)
1295
1529
self.vendor = vendor
1298
class GhostRevisionUnusableHere(BzrNewError):
1299
"""Ghost revision {%(revision_id)s} cannot be used here."""
1532
class GhostRevisionUnusableHere(BzrError):
1534
_fmt = "Ghost revision {%(revision_id)s} cannot be used here."
1301
1536
def __init__(self, revision_id):
1302
BzrNewError.__init__(self)
1537
BzrError.__init__(self)
1303
1538
self.revision_id = revision_id
1306
class IllegalUseOfScopeReplacer(BzrNewError):
1307
"""ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"""
1309
is_user_error = False
1541
class IllegalUseOfScopeReplacer(BzrError):
1543
_fmt = "ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"
1545
internal_error = True
1311
1547
def __init__(self, name, msg, extra=None):
1312
BzrNewError.__init__(self)
1548
BzrError.__init__(self)
1313
1549
self.name = name