13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Exceptions for bzr, and reporting of them.
20
from __future__ import absolute_import
24
from bzrlib.patches import (
26
33
# TODO: is there any value in providing the .args field used by standard
27
# 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
30
# 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
31
38
# constructed to make sure it will succeed. But that says nothing about
32
39
# exceptions that are never raised.
39
# return codes from the brz program
46
# return codes from the bzr program
42
49
EXIT_INTERNAL_ERROR = 4
45
class BzrError(Exception):
52
class BzrError(StandardError):
47
Base class for errors raised by breezy.
54
Base class for errors raised by bzrlib.
49
:cvar internal_error: if True this was probably caused by a brz bug and
50
should be displayed with a traceback; if False (or absent) this was
51
probably a user or environment error and they don't need the gory
52
details. (That can be overridden by -Derror on the command line.)
56
:cvar internal_error: if True this was probably caused by a bzr bug and
57
should be displayed with a traceback; if False (or absent) this was
58
probably a user or environment error and they don't need the gory details.
59
(That can be overridden by -Derror on the command line.)
54
61
:cvar _fmt: Format string to display the error; this is expanded
55
by the instance's dict.
62
by the instance's dict.
58
65
internal_error = False
60
67
def __init__(self, msg=None, **kwds):
65
72
arguments can be given. The first is for generic "user" errors which
66
73
are not intended to be caught and so do not need a specific subclass.
67
74
The second case is for use with subclasses that provide a _fmt format
68
string to print the arguments.
75
string to print the arguments.
70
Keyword arguments are taken as parameters to the error, which can
71
be inserted into the format string template. It's recommended
72
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
75
82
:param msg: If given, this is the literal complete text for the error,
76
83
not subject to expansion. 'msg' is used instead of 'message' because
77
84
python evolved and, in 2.6, forbids the use of 'message'.
79
Exception.__init__(self)
86
StandardError.__init__(self)
80
87
if msg is not None:
81
88
# I was going to deprecate this, but it actually turns out to be
82
89
# quite handy - mbp 20061103.
100
106
# __str__() should always return a 'str' object
101
107
# never a 'unicode' object.
103
except Exception as e:
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
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),
116
def __unicode__(self):
118
if isinstance(u, str):
119
# Try decoding the str using the default encoding.
121
elif not isinstance(u, unicode):
122
# Try to make a unicode object from it, because __unicode__ must
123
# return a unicode object.
129
if isinstance(s, unicode):
132
# __str__ must return a str.
137
return '%s(%s)' % (self.__class__.__name__, str(self))
139
def _get_format_string(self):
140
"""Return format string for this exception or None"""
141
fmt = getattr(self, '_fmt', 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' \
106
151
% (self.__class__.__name__,
108
153
getattr(self, '_fmt', None),
115
return self._format().encode('utf-8')
117
__unicode__ = _format
120
return '%s(%s)' % (self.__class__.__name__, str(self))
122
def _get_format_string(self):
123
"""Return format string for this exception or None"""
124
fmt = getattr(self, '_fmt', None)
126
from breezy.i18n import gettext
127
return gettext(fmt) # _fmt strings should be ascii
129
156
def __eq__(self, other):
130
if self.__class__ is not other.__class__:
157
if self.__class__ != other.__class__:
131
158
return NotImplemented
132
159
return self.__dict__ == other.__dict__
138
162
class InternalBzrError(BzrError):
139
163
"""Base class for errors that are internal in nature.
146
170
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
class AlreadyBuilding(BzrError):
208
_fmt = "The tree builder is already building a tree."
149
211
class BranchError(BzrError):
150
212
"""Base class for concrete 'errors about a branch'."""
165
class IncompatibleVersion(BzrError):
167
_fmt = 'API %(api)s is not compatible; one of versions %(wanted)r '\
168
'is required, but current version is %(current)r.'
170
def __init__(self, api, wanted, current):
227
class DirstateCorrupt(BzrError):
229
_fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
231
def __init__(self, state, msg):
232
BzrError.__init__(self)
237
class DisabledMethod(InternalBzrError):
239
_fmt = "The smart server method '%(class_name)s' is disabled."
241
def __init__(self, class_name):
242
BzrError.__init__(self)
243
self.class_name = class_name
246
class IncompatibleAPI(BzrError):
248
_fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
249
'It supports versions "%(minimum)s" to "%(current)s".'
251
def __init__(self, api, wanted, minimum, current):
172
253
self.wanted = wanted
254
self.minimum = minimum
173
255
self.current = current
230
312
_fmt = 'There is no public branch set for "%(branch_url)s".'
232
314
def __init__(self, branch):
233
from . import urlutils
315
import bzrlib.urlutils as urlutils
234
316
public_location = urlutils.unescape_for_display(branch.base, 'ascii')
235
317
BzrError.__init__(self, branch_url=public_location)
320
class NoHelpTopic(BzrError):
322
_fmt = ("No help could be found for '%(topic)s'. "
323
"Please use 'bzr help topics' to obtain a list of topics.")
325
def __init__(self, topic):
238
329
class NoSuchId(BzrError):
240
331
_fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
242
333
def __init__(self, tree, file_id):
243
334
BzrError.__init__(self)
244
335
self.file_id = file_id
339
class NoSuchIdInRepository(NoSuchId):
341
_fmt = ('The file id "%(file_id)s" is not present in the repository'
344
def __init__(self, repository, file_id):
345
BzrError.__init__(self, repository=repository, file_id=file_id)
248
348
class NotStacked(BranchError):
250
350
_fmt = "The branch '%(branch)s' is not stacked."
304
409
self.not_locked = not_locked
412
class BzrOptionError(BzrCommandError):
414
_fmt = "Error in command line options"
417
class BadIndexFormatSignature(BzrError):
419
_fmt = "%(value)s is not an index of type %(_type)s."
421
def __init__(self, value, _type):
422
BzrError.__init__(self)
427
class BadIndexData(BzrError):
429
_fmt = "Error in data for index %(value)s."
431
def __init__(self, value):
432
BzrError.__init__(self)
436
class BadIndexDuplicateKey(BzrError):
438
_fmt = "The key '%(key)s' is already in index '%(index)s'."
440
def __init__(self, key, index):
441
BzrError.__init__(self)
446
class BadIndexKey(BzrError):
448
_fmt = "The key '%(key)s' is not a valid key."
450
def __init__(self, key):
451
BzrError.__init__(self)
455
class BadIndexOptions(BzrError):
457
_fmt = "Could not parse options for index %(value)s."
459
def __init__(self, value):
460
BzrError.__init__(self)
464
class BadIndexValue(BzrError):
466
_fmt = "The value '%(value)s' is not a valid value."
468
def __init__(self, value):
469
BzrError.__init__(self)
473
class BadOptionValue(BzrError):
475
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
477
def __init__(self, name, value):
478
BzrError.__init__(self, name=name, value=value)
307
481
class StrictCommitFailed(BzrError):
309
483
_fmt = "Commit refused because there are unknown files in the tree"
395
569
_fmt = 'Permission denied: "%(path)s"%(extra)s'
572
class InvalidURL(PathError):
574
_fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
577
class InvalidURLJoin(PathError):
579
_fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
581
def __init__(self, reason, base, join_args):
584
self.join_args = join_args
585
PathError.__init__(self, base, reason)
588
class InvalidRebaseURLs(PathError):
590
_fmt = "URLs differ by more than path: %(from_)r and %(to)r"
592
def __init__(self, from_, to):
595
PathError.__init__(self, from_, 'URLs differ by more than path.')
398
598
class UnavailableRepresentation(InternalBzrError):
400
600
_fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
401
"is encoded as '%(native)s'.")
601
"is encoded as '%(native)s'.")
403
603
def __init__(self, key, wanted, native):
404
604
InternalBzrError.__init__(self)
610
class UnknownHook(BzrError):
612
_fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
614
def __init__(self, hook_type, hook_name):
615
BzrError.__init__(self)
616
self.type = hook_type
617
self.hook = hook_name
410
620
class UnsupportedProtocol(PathError):
412
622
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
414
def __init__(self, url, extra=""):
624
def __init__(self, url, extra):
415
625
PathError.__init__(self, url, extra=extra)
418
class UnstackableLocationError(BzrError):
420
_fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
422
def __init__(self, branch_url, target_url):
628
class UnstackableBranchFormat(BzrError):
630
_fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
631
"You will need to upgrade the branch to permit branch stacking.")
633
def __init__(self, format, url):
423
634
BzrError.__init__(self)
424
self.branch_url = branch_url
425
self.target_url = target_url
428
639
class UnstackableRepositoryFormat(BzrError):
430
641
_fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
431
"You will need to upgrade the repository to permit branch stacking.")
642
"You will need to upgrade the repository to permit branch stacking.")
433
644
def __init__(self, format, url):
434
645
BzrError.__init__(self)
479
690
# TODO: This is given a URL; we try to unescape it but doing that from inside
480
691
# the exception object is a bit undesirable.
481
# TODO: Probably this behavior of should be a common superclass
692
# TODO: Probably this behavior of should be a common superclass
482
693
class NotBranchError(PathError):
484
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
486
def __init__(self, path, detail=None, controldir=None):
487
from . import urlutils
488
path = urlutils.unescape_for_display(path, 'ascii')
489
if detail is not None:
490
detail = ': ' + detail
492
self.controldir = controldir
493
PathError.__init__(self, path=path)
496
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
498
def _get_format_string(self):
499
# GZ 2017-06-08: Not the best place to lazy fill detail in.
500
if self.detail is None:
501
self.detail = self._get_detail()
502
return super(NotBranchError, self)._get_format_string()
504
def _get_detail(self):
505
if self.controldir is not None:
507
self.controldir.open_repository()
508
except NoRepositoryPresent:
510
except Exception as e:
511
# Just ignore unexpected errors. Raising arbitrary errors
512
# during str(err) can provoke strange bugs. Concretely
513
# Launchpad's codehosting managed to raise NotBranchError
514
# here, and then get stuck in an infinite loop/recursion
515
# trying to str() that error. All this error really cares
516
# about that there's no working repository there, and if
517
# open_repository() fails, there probably isn't.
518
return ': ' + e.__class__.__name__
520
return ': location is a repository'
695
_fmt = 'Not a branch: "%(path)s".'
697
def __init__(self, path):
698
import bzrlib.urlutils as urlutils
699
self.path = urlutils.unescape_for_display(path, 'ascii')
524
702
class NoSubmitBranch(PathError):
540
713
_fmt = 'Already a branch: "%(path)s".'
543
class InvalidBranchName(PathError):
545
_fmt = "Invalid branch name: %(name)s"
547
def __init__(self, name):
548
BzrError.__init__(self)
552
class ParentBranchExists(AlreadyBranchError):
554
_fmt = 'Parent branch already exists: "%(path)s".'
557
716
class BranchExistsWithoutWorkingTree(PathError):
559
718
_fmt = 'Directory contains a branch, but no working tree \
560
(use brz checkout if you wish to build a working tree): "%(path)s"'
719
(use bzr checkout if you wish to build a working tree): "%(path)s"'
722
class AtomicFileAlreadyClosed(PathError):
724
_fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
727
def __init__(self, path, function):
728
PathError.__init__(self, path=path, extra=None)
729
self.function = function
563
732
class InaccessibleParent(PathError):
573
742
class NoRepositoryPresent(BzrError):
575
744
_fmt = 'No repository present: "%(path)s"'
577
def __init__(self, controldir):
578
BzrError.__init__(self)
579
self.path = controldir.transport.clone('..').base
745
def __init__(self, bzrdir):
746
BzrError.__init__(self)
747
self.path = bzrdir.transport.clone('..').base
750
class FileInWrongBranch(BzrError):
752
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
754
def __init__(self, branch, path):
755
BzrError.__init__(self)
757
self.branch_base = branch.base
582
761
class UnsupportedFormatError(BzrError):
584
_fmt = "Unsupported branch format: %(format)s\nPlease run 'brz upgrade'"
763
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
587
766
class UnknownFormatError(BzrError):
589
768
_fmt = "Unknown %(kind)s format: %(format)r"
591
770
def __init__(self, format, kind='branch'):
593
772
self.format = format
596
class LineEndingError(BzrError):
598
_fmt = ("Line ending corrupted for file: %(file)s; "
599
"Maybe your files got corrupted in transport?")
601
def __init__(self, file):
605
775
class IncompatibleFormat(BzrError):
607
_fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
609
def __init__(self, format, controldir_format):
610
BzrError.__init__(self)
612
self.controldir = controldir_format
615
class ParseFormatError(BzrError):
617
_fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
619
def __init__(self, format, lineno, line, text):
620
BzrError.__init__(self)
777
_fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
779
def __init__(self, format, bzrdir_format):
780
BzrError.__init__(self)
782
self.bzrdir = bzrdir_format
627
785
class IncompatibleRepositories(BzrError):
628
"""Report an error that two repositories are not compatible.
630
Note that the source and target repositories are permitted to be strings:
631
this exception is thrown from the smart server and may refer to a
632
repository the client hasn't opened.
635
787
_fmt = "%(target)s\n" \
636
"is not compatible with\n" \
788
"is not compatible with\n" \
640
792
def __init__(self, source, target, details=None):
641
793
if details is None:
972
1142
class InvalidRevisionSpec(BzrError):
974
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
975
" %(branch_url)s%(extra)s")
1144
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1145
" %(branch)s%(extra)s")
977
1147
def __init__(self, spec, branch, extra=None):
978
1148
BzrError.__init__(self, branch=branch, spec=spec)
979
self.branch_url = getattr(branch, 'user_url', str(branch))
981
1150
self.extra = '\n' + str(extra)
1155
class HistoryMissing(BzrError):
1157
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
986
1160
class AppendRevisionsOnlyViolation(BzrError):
988
1162
_fmt = ('Operation denied because it would change the main history,'
989
' which is not permitted by the append_revisions_only setting on'
990
' branch "%(location)s".')
1163
' which is not permitted by the append_revisions_only setting on'
1164
' branch "%(location)s".')
992
1166
def __init__(self, location):
993
import breezy.urlutils as urlutils
994
location = urlutils.unescape_for_display(location, 'ascii')
995
BzrError.__init__(self, location=location)
1167
import bzrlib.urlutils as urlutils
1168
location = urlutils.unescape_for_display(location, 'ascii')
1169
BzrError.__init__(self, location=location)
998
1172
class DivergedBranches(BzrError):
1000
1174
_fmt = ("These branches have diverged."
1001
" Use the missing command to see how.\n"
1002
"Use the merge command to reconcile them.")
1175
" Use the merge command to reconcile them.")
1004
1177
def __init__(self, branch1, branch2):
1005
1178
self.branch1 = branch1
1051
1224
def __init__(self, rev_id, not_ancestor_id):
1052
1225
BzrError.__init__(self, rev_id=rev_id,
1053
not_ancestor_id=not_ancestor_id)
1226
not_ancestor_id=not_ancestor_id)
1229
class InstallFailed(BzrError):
1231
def __init__(self, revisions):
1232
revision_str = ", ".join(str(r) for r in revisions)
1233
msg = "Could not install revisions:\n%s" % revision_str
1234
BzrError.__init__(self, msg)
1235
self.revisions = revisions
1238
class AmbiguousBase(BzrError):
1240
def __init__(self, bases):
1241
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1243
msg = ("The correct base is unclear, because %s are all equally close"
1245
BzrError.__init__(self, msg)
1056
1249
class NoCommits(BranchError):
1115
1308
self.error = error
1311
class WeaveError(BzrError):
1313
_fmt = "Error in processing weave: %(msg)s"
1315
def __init__(self, msg=None):
1316
BzrError.__init__(self)
1320
class WeaveRevisionAlreadyPresent(WeaveError):
1322
_fmt = "Revision {%(revision_id)s} already present in %(weave)s"
1324
def __init__(self, revision_id, weave):
1326
WeaveError.__init__(self)
1327
self.revision_id = revision_id
1331
class WeaveRevisionNotPresent(WeaveError):
1333
_fmt = "Revision {%(revision_id)s} not present in %(weave)s"
1335
def __init__(self, revision_id, weave):
1336
WeaveError.__init__(self)
1337
self.revision_id = revision_id
1341
class WeaveFormatError(WeaveError):
1343
_fmt = "Weave invariant violated: %(what)s"
1345
def __init__(self, what):
1346
WeaveError.__init__(self)
1350
class WeaveParentMismatch(WeaveError):
1352
_fmt = "Parents are mismatched between two revisions. %(message)s"
1355
class WeaveInvalidChecksum(WeaveError):
1357
_fmt = "Text did not match it's checksum: %(message)s"
1360
class WeaveTextDiffers(WeaveError):
1362
_fmt = ("Weaves differ on text content. Revision:"
1363
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1365
def __init__(self, revision_id, weave_a, weave_b):
1366
WeaveError.__init__(self)
1367
self.revision_id = revision_id
1368
self.weave_a = weave_a
1369
self.weave_b = weave_b
1372
class WeaveTextDiffers(WeaveError):
1374
_fmt = ("Weaves differ on text content. Revision:"
1375
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1377
def __init__(self, revision_id, weave_a, weave_b):
1378
WeaveError.__init__(self)
1379
self.revision_id = revision_id
1380
self.weave_a = weave_a
1381
self.weave_b = weave_b
1118
1384
class VersionedFileError(BzrError):
1120
1386
_fmt = "Versioned file error"
1123
1389
class RevisionNotPresent(VersionedFileError):
1125
1391
_fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
1127
1393
def __init__(self, revision_id, file_id):
1143
1409
class VersionedFileInvalidChecksum(VersionedFileError):
1145
_fmt = "Text did not match its checksum: %(msg)s"
1411
_fmt = "Text did not match its checksum: %(message)s"
1414
class KnitError(InternalBzrError):
1419
class KnitCorrupt(KnitError):
1421
_fmt = "Knit %(filename)s corrupt: %(how)s"
1423
def __init__(self, filename, how):
1424
KnitError.__init__(self)
1425
self.filename = filename
1429
class SHA1KnitCorrupt(KnitCorrupt):
1431
_fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
1432
"match expected sha-1. key %(key)s expected sha %(expected)s actual "
1435
def __init__(self, filename, actual, expected, key, content):
1436
KnitError.__init__(self)
1437
self.filename = filename
1438
self.actual = actual
1439
self.expected = expected
1441
self.content = content
1444
class KnitDataStreamIncompatible(KnitError):
1445
# Not raised anymore, as we can convert data streams. In future we may
1446
# need it again for more exotic cases, so we're keeping it around for now.
1448
_fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
1450
def __init__(self, stream_format, target_format):
1451
self.stream_format = stream_format
1452
self.target_format = target_format
1455
class KnitDataStreamUnknown(KnitError):
1456
# Indicates a data stream we don't know how to handle.
1458
_fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
1460
def __init__(self, stream_format):
1461
self.stream_format = stream_format
1464
class KnitHeaderError(KnitError):
1466
_fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
1468
def __init__(self, badline, filename):
1469
KnitError.__init__(self)
1470
self.badline = badline
1471
self.filename = filename
1473
class KnitIndexUnknownMethod(KnitError):
1474
"""Raised when we don't understand the storage method.
1476
Currently only 'fulltext' and 'line-delta' are supported.
1479
_fmt = ("Knit index %(filename)s does not have a known method"
1480
" in options: %(options)r")
1482
def __init__(self, filename, options):
1483
KnitError.__init__(self)
1484
self.filename = filename
1485
self.options = options
1148
1488
class RetryWithNewPacks(BzrError):
1388
1700
_fmt = "Working tree has conflicts."
1391
class DependencyNotPresent(BzrError):
1393
_fmt = 'Unable to import library "%(library)s": %(error)s'
1395
def __init__(self, library, error):
1396
BzrError.__init__(self, library=library, error=error)
1703
class ParseConfigError(BzrError):
1705
def __init__(self, errors, filename):
1706
if filename is None:
1708
message = "Error(s) parsing config file %s:\n%s" % \
1709
(filename, ('\n'.join(e.msg for e in errors)))
1710
BzrError.__init__(self, message)
1713
class NoEmailInUsername(BzrError):
1715
_fmt = "%(username)r does not seem to contain a reasonable email address"
1717
def __init__(self, username):
1718
BzrError.__init__(self)
1719
self.username = username
1722
class SigningFailed(BzrError):
1724
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1726
def __init__(self, command_line):
1727
BzrError.__init__(self, command_line=command_line)
1399
1730
class WorkingTreeNotRevision(BzrError):
1401
_fmt = ("The working tree for %(basedir)s has changed since"
1732
_fmt = ("The working tree for %(basedir)s has changed since"
1402
1733
" the last commit, but weave merge requires that it be"
1555
1892
_fmt = "Moving the root directory is not supported at this time"
1558
class TransformRenameFailed(BzrError):
1560
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1562
def __init__(self, from_path, to_path, why, errno):
1563
self.from_path = from_path
1564
self.to_path = to_path
1569
1895
class BzrMoveFailedError(BzrError):
1571
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1572
"%(_has_extra)s%(extra)s")
1897
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1574
1899
def __init__(self, from_path='', to_path='', extra=None):
1575
from breezy.osutils import splitpath
1900
from bzrlib.osutils import splitpath
1576
1901
BzrError.__init__(self)
1578
self.extra, self._has_extra = extra, ': '
1903
self.extra = ': ' + str(extra)
1580
self.extra = self._has_extra = ''
1582
1907
has_from = len(from_path) > 0
1583
1908
has_to = len(to_path) > 0
1605
1930
class BzrRenameFailedError(BzrMoveFailedError):
1607
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1608
"%(_has_extra)s%(extra)s")
1932
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1610
1934
def __init__(self, from_path, to_path, extra=None):
1611
1935
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1937
class BzrRemoveChangedFilesError(BzrError):
1938
"""Used when user is trying to remove changed files."""
1940
_fmt = ("Can't safely remove modified or unknown files:\n"
1941
"%(changes_as_text)s"
1942
"Use --keep to not delete them, or --force to delete them regardless.")
1944
def __init__(self, tree_delta):
1945
BzrError.__init__(self)
1946
self.changes_as_text = tree_delta.get_changes_as_text()
1947
#self.paths_as_string = '\n'.join(changed_files)
1948
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1614
1951
class BzrBadParameterNotString(BzrBadParameter):
1729
2072
keep, and delete it when you are done."""
1731
2074
def __init__(self, limbo_dir):
1732
BzrError.__init__(self)
1733
self.limbo_dir = limbo_dir
2075
BzrError.__init__(self)
2076
self.limbo_dir = limbo_dir
1736
2079
class ImmortalPendingDeletion(BzrError):
1738
2081
_fmt = ("Unable to delete transform temporary directory "
1739
"%(pending_deletion)s. Please examine %(pending_deletion)s to see if it "
1740
"contains any files you wish to keep, and delete it when you are done.")
2082
"%(pending_deletion)s. Please examine %(pending_deletion)s to see if it "
2083
"contains any files you wish to keep, and delete it when you are done.")
1742
2085
def __init__(self, pending_deletion):
1743
BzrError.__init__(self, pending_deletion=pending_deletion)
2086
BzrError.__init__(self, pending_deletion=pending_deletion)
1746
2089
class OutOfDateTree(BzrError):
1748
_fmt = "Working tree is out of date, please run 'brz update'.%(more)s"
2091
_fmt = "Working tree is out of date, please run 'bzr update'."
1750
def __init__(self, tree, more=None):
2093
def __init__(self, tree):
1755
2094
BzrError.__init__(self)
1756
2095
self.tree = tree
1760
2098
class PublicBranchOutOfDate(BzrError):
1917
2245
self.text = text
1920
class MalformedHeader(BadBundle):
2248
class MalformedHeader(BadBundle):
1922
2250
_fmt = "Malformed bzr revision-bundle header: %(text)r"
1925
class MalformedPatches(BadBundle):
2253
class MalformedPatches(BadBundle):
1927
2255
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
1930
class MalformedFooter(BadBundle):
2258
class MalformedFooter(BadBundle):
1932
2260
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
1935
2263
class UnsupportedEOLMarker(BadBundle):
1937
_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"
1939
2267
def __init__(self):
1940
# XXX: BadBundle's constructor assumes there's explanatory text,
2268
# XXX: BadBundle's constructor assumes there's explanatory text,
1941
2269
# but for this there is not
1942
2270
BzrError.__init__(self)
1945
2273
class IncompatibleBundleFormat(BzrError):
1947
2275
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
1949
2277
def __init__(self, bundle_format, other):
2182
2558
class UnknownErrorFromSmartServer(BzrError):
2183
"""An ErrorFromSmartServer could not be translated into a typical breezy
2559
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2186
2562
This is distinct from ErrorFromSmartServer so that it is possible to
2187
2563
distinguish between the following two cases:
2189
- ErrorFromSmartServer was uncaught. This is logic error in the client
2190
and so should provoke a traceback to the user.
2191
- ErrorFromSmartServer was caught but its error_tuple could not be
2192
translated. This is probably because the server sent us garbage, and
2193
should not provoke a traceback.
2564
- ErrorFromSmartServer was uncaught. This is logic error in the client
2565
and so should provoke a traceback to the user.
2566
- ErrorFromSmartServer was caught but its error_tuple could not be
2567
translated. This is probably because the server sent us garbage, and
2568
should not provoke a traceback.
2196
2571
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2263
2643
self.reason = reason
2646
class SMTPError(BzrError):
2648
_fmt = "SMTP error: %(error)s"
2650
def __init__(self, error):
2654
class NoMessageSupplied(BzrError):
2656
_fmt = "No message supplied."
2659
class NoMailAddressSpecified(BzrError):
2661
_fmt = "No mail-to address (--mail-to) or output (-o) specified."
2664
class UnknownMailClient(BzrError):
2666
_fmt = "Unknown mail client: %(mail_client)s"
2668
def __init__(self, mail_client):
2669
BzrError.__init__(self, mail_client=mail_client)
2672
class MailClientNotFound(BzrError):
2674
_fmt = "Unable to find mail client with the following names:"\
2675
" %(mail_command_list_string)s"
2677
def __init__(self, mail_command_list):
2678
mail_command_list_string = ', '.join(mail_command_list)
2679
BzrError.__init__(self, mail_command_list=mail_command_list,
2680
mail_command_list_string=mail_command_list_string)
2682
class SMTPConnectionRefused(SMTPError):
2684
_fmt = "SMTP connection to %(host)s refused"
2686
def __init__(self, error, host):
2691
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
2693
_fmt = "Please specify smtp_server. No server at default %(host)s."
2696
class BzrDirError(BzrError):
2698
def __init__(self, bzrdir):
2699
import bzrlib.urlutils as urlutils
2700
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2702
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2705
class UnsyncedBranches(BzrDirError):
2707
_fmt = ("'%(display_url)s' is not in sync with %(target_url)s. See"
2708
" bzr help sync-for-reconfigure.")
2710
def __init__(self, bzrdir, target_branch):
2711
BzrDirError.__init__(self, bzrdir)
2712
import bzrlib.urlutils as urlutils
2713
self.target_url = urlutils.unescape_for_display(target_branch.base,
2717
class AlreadyBranch(BzrDirError):
2719
_fmt = "'%(display_url)s' is already a branch."
2722
class AlreadyTree(BzrDirError):
2724
_fmt = "'%(display_url)s' is already a tree."
2727
class AlreadyCheckout(BzrDirError):
2729
_fmt = "'%(display_url)s' is already a checkout."
2732
class AlreadyLightweightCheckout(BzrDirError):
2734
_fmt = "'%(display_url)s' is already a lightweight checkout."
2737
class AlreadyUsingShared(BzrDirError):
2739
_fmt = "'%(display_url)s' is already using a shared repository."
2742
class AlreadyStandalone(BzrDirError):
2744
_fmt = "'%(display_url)s' is already standalone."
2747
class ReconfigurationNotSupported(BzrDirError):
2749
_fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
2752
class NoBindLocation(BzrDirError):
2754
_fmt = "No location could be found to bind to at %(display_url)s."
2266
2757
class UncommittedChanges(BzrError):
2268
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2269
' (See brz status).%(more)s')
2271
def __init__(self, tree, more=None):
2276
import breezy.urlutils as urlutils
2277
user_url = getattr(tree, "user_url", None)
2278
if user_url is None:
2279
display_url = str(tree)
2281
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2282
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2285
class StoringUncommittedNotSupported(BzrError):
2287
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2290
def __init__(self, branch):
2291
import breezy.urlutils as urlutils
2292
user_url = getattr(branch, "user_url", None)
2293
if user_url is None:
2294
display_url = str(branch)
2296
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2297
BzrError.__init__(self, branch=branch, display_url=display_url)
2300
class ShelvedChanges(UncommittedChanges):
2302
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2303
' (See brz shelve --list).%(more)s')
2759
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2761
def __init__(self, tree):
2762
import bzrlib.urlutils as urlutils
2763
display_url = urlutils.unescape_for_display(
2764
tree.bzrdir.root_transport.base, 'ascii')
2765
BzrError.__init__(self, tree=tree, display_url=display_url)
2768
class MissingTemplateVariable(BzrError):
2770
_fmt = 'Variable {%(name)s} is not available.'
2772
def __init__(self, name):
2776
class NoTemplate(BzrError):
2778
_fmt = 'No template specified.'
2306
2781
class UnableCreateSymlink(BzrError):
2318
2793
self.path_str = path_str
2796
class UnsupportedTimezoneFormat(BzrError):
2798
_fmt = ('Unsupported timezone format "%(timezone)s", '
2799
'options are "utc", "original", "local".')
2801
def __init__(self, timezone):
2802
self.timezone = timezone
2805
class CommandAvailableInPlugin(StandardError):
2807
internal_error = False
2809
def __init__(self, cmd_name, plugin_metadata, provider):
2811
self.plugin_metadata = plugin_metadata
2812
self.cmd_name = cmd_name
2813
self.provider = provider
2817
_fmt = ('"%s" is not a standard bzr command. \n'
2818
'However, the following official plugin provides this command: %s\n'
2819
'You can install it by going to: %s'
2820
% (self.cmd_name, self.plugin_metadata['name'],
2821
self.plugin_metadata['url']))
2826
class NoPluginAvailable(BzrError):
2830
class NotATerminal(BzrError):
2832
_fmt = 'Unable to ask for a password without real terminal.'
2321
2835
class UnableEncodePath(BzrError):
2323
2837
_fmt = ('Unable to encode %(kind)s path %(path)r in '
2324
2838
'user encoding %(user_encoding)s')
2326
2840
def __init__(self, path, kind):
2327
from breezy.osutils import get_user_encoding
2841
from bzrlib.osutils import get_user_encoding
2328
2842
self.path = path
2329
2843
self.kind = kind
2330
self.user_encoding = get_user_encoding()
2844
self.user_encoding = osutils.get_user_encoding()
2333
2847
class NoSuchAlias(BzrError):
2338
2852
BzrError.__init__(self, alias_name=alias_name)
2855
class DirectoryLookupFailure(BzrError):
2856
"""Base type for lookup errors."""
2861
class InvalidLocationAlias(DirectoryLookupFailure):
2863
_fmt = '"%(alias_name)s" is not a valid location alias.'
2865
def __init__(self, alias_name):
2866
DirectoryLookupFailure.__init__(self, alias_name=alias_name)
2869
class UnsetLocationAlias(DirectoryLookupFailure):
2871
_fmt = 'No %(alias_name)s location assigned.'
2873
def __init__(self, alias_name):
2874
DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
2341
2877
class CannotBindAddress(BzrError):
2343
2879
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
2345
2881
def __init__(self, host, port, orig_error):
2346
# nb: in python2.4 socket.error doesn't have a useful repr
2347
2882
BzrError.__init__(self, host=host, port=port,
2348
orig_error=repr(orig_error.args))
2883
orig_error=orig_error[1])
2886
class UnknownRules(BzrError):
2888
_fmt = ('Unknown rules detected: %(unknowns_str)s.')
2890
def __init__(self, unknowns):
2891
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2894
class HookFailed(BzrError):
2895
"""Raised when a pre_change_branch_tip hook function fails anything other
2896
than TipChangeRejected.
2899
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2900
"%(traceback_text)s%(exc_value)s")
2902
def __init__(self, hook_stage, hook_name, exc_info):
2904
self.hook_stage = hook_stage
2905
self.hook_name = hook_name
2906
self.exc_info = exc_info
2907
self.exc_type = exc_info[0]
2908
self.exc_value = exc_info[1]
2909
self.exc_tb = exc_info[2]
2910
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
2351
2913
class TipChangeRejected(BzrError):
2352
2914
"""A pre_change_branch_tip hook function may raise this to cleanly and
2353
2915
explicitly abort a change to a branch tip.
2356
2918
_fmt = u"Tip change rejected: %(msg)s"
2358
2920
def __init__(self, msg):
2362
class JailBreak(BzrError):
2364
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
2366
def __init__(self, url):
2367
BzrError.__init__(self, url=url)
2924
class ShelfCorrupt(BzrError):
2926
_fmt = "Shelf corrupt."
2929
class NoSuchShelfId(BzrError):
2931
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
2933
def __init__(self, shelf_id):
2934
BzrError.__init__(self, shelf_id=shelf_id)
2937
class InvalidShelfId(BzrError):
2939
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
2941
def __init__(self, invalid_id):
2942
BzrError.__init__(self, invalid_id=invalid_id)
2370
2945
class UserAbort(BzrError):
2372
2947
_fmt = 'The user aborted the operation.'
2375
class UnresumableWriteGroup(BzrError):
2377
_fmt = ("Repository %(repository)s cannot resume write group "
2378
"%(write_groups)r: %(reason)s")
2380
internal_error = True
2382
def __init__(self, repository, write_groups, reason):
2383
self.repository = repository
2384
self.write_groups = write_groups
2385
self.reason = reason
2388
class UnsuspendableWriteGroup(BzrError):
2390
_fmt = ("Repository %(repository)s cannot suspend a write group.")
2392
internal_error = True
2394
def __init__(self, repository):
2395
self.repository = repository
2398
class LossyPushToSameVCS(BzrError):
2400
_fmt = ("Lossy push not possible between %(source_branch)r and "
2401
"%(target_branch)r that are in the same VCS.")
2403
internal_error = True
2405
def __init__(self, source_branch, target_branch):
2406
self.source_branch = source_branch
2407
self.target_branch = target_branch
2410
class NoRoundtrippingSupport(BzrError):
2412
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
2413
"%(target_branch)r.")
2415
internal_error = True
2417
def __init__(self, source_branch, target_branch):
2418
self.source_branch = source_branch
2419
self.target_branch = target_branch
2422
class NoColocatedBranchSupport(BzrError):
2424
_fmt = ("%(controldir)r does not support co-located branches.")
2426
def __init__(self, controldir):
2427
self.controldir = controldir
2430
class RecursiveBind(BzrError):
2432
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
2433
'Please use `brz unbind` to fix.')
2435
def __init__(self, branch_url):
2436
self.branch_url = branch_url
2439
class UnsupportedKindChange(BzrError):
2441
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
2442
"%(path)s not supported by format %(format)r")
2444
def __init__(self, path, from_kind, to_kind, format):
2446
self.from_kind = from_kind
2447
self.to_kind = to_kind
2448
self.format = format
2451
class ChangesAlreadyStored(BzrCommandError):
2453
_fmt = ('Cannot store uncommitted changes because this branch already'
2454
' stores uncommitted changes.')
2950
class MustHaveWorkingTree(BzrError):
2952
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
2954
def __init__(self, format, url):
2955
BzrError.__init__(self, format=format, url=url)