1
# Copyright (C) 2005, 2006 Canonical Ltd
1
# -*- coding: UTF-8 -*-
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Exceptions for bzr, and reporting of them.
21
from bzrlib import symbol_versioning
22
from bzrlib.patches import (PatchSyntax,
29
# TODO: is there any value in providing the .args field used by standard
30
# python exceptions? A list of values with no names seems less useful
33
# TODO: Perhaps convert the exception to a string at the moment it's
34
# constructed to make sure it will succeed. But that says nothing about
35
# exceptions that are never raised.
37
# TODO: selftest assertRaises should probably also check that every error
38
# raised can be formatted as a string successfully, and without giving
18
__copyright__ = "Copyright (C) 2005 Canonical Ltd."
19
__author__ = "Martin Pool <mbp@canonical.com>"
22
######################################################################
42
24
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
26
# XXX: Should we show the exception class in
27
# exceptions that don't provide their own message?
28
# maybe it should be done at a higher level
29
## n = self.__class__.__name__ + ': '
31
if len(self.args) == 1:
32
return n + self.args[0]
33
elif len(self.args) == 2:
34
# further explanation or suggestions
36
return n + '\n '.join([self.args[0]] + self.args[1])
38
return n + "%r" % self
81
self._preformatted_string = None
82
for key, value in kwds.items():
83
setattr(self, key, value)
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),
124
class BzrNewError(BzrError):
125
"""Deprecated error base class."""
126
# base classes should override the docstring with their human-
127
# readable explanation
129
def __init__(self, *args, **kwds):
130
# XXX: Use the underlying BzrError to always generate the args attribute
131
# if it doesn't exist. We can't use super here, because exceptions are
132
# old-style classes in python2.4 (but new in 2.5). --bmc, 20060426
133
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
134
'please convert %s to use BzrError instead'
135
% self.__class__.__name__,
138
BzrError.__init__(self, *args)
139
for key, value in kwds.items():
140
setattr(self, key, value)
144
# __str__() should always return a 'str' object
145
# never a 'unicode' object.
146
s = self.__doc__ % self.__dict__
147
if isinstance(s, unicode):
148
return s.encode('utf8')
150
except (TypeError, NameError, ValueError, KeyError), e:
151
return 'Unprintable exception %s(%r): %s' \
152
% (self.__class__.__name__,
153
self.__dict__, str(e))
156
class AlreadyBuilding(BzrError):
158
_fmt = "The tree builder is already building a tree."
40
return n + `self.args`
161
43
class BzrCheckError(BzrError):
163
_fmt = "Internal check failed: %(message)s"
165
internal_error = True
167
def __init__(self, message):
168
BzrError.__init__(self)
169
self.message = message
172
class InvalidEntryName(BzrError):
174
_fmt = "Invalid entry name: %(name)s"
176
internal_error = True
178
def __init__(self, name):
179
BzrError.__init__(self)
183
47
class InvalidRevisionNumber(BzrError):
185
_fmt = "Invalid revision number %(revno)s"
187
def __init__(self, revno):
188
BzrError.__init__(self)
49
return 'invalid revision number: %r' % self.args[0]
192
52
class InvalidRevisionId(BzrError):
194
_fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
196
def __init__(self, revision_id, branch):
197
# branch can be any string or object with __str__ defined
198
BzrError.__init__(self)
199
self.revision_id = revision_id
203
class NoSuchId(BzrError):
205
_fmt = "The file id %(file_id)s is not present in the tree %(tree)s."
207
def __init__(self, tree, file_id):
208
BzrError.__init__(self)
209
self.file_id = file_id
213
class InventoryModified(BzrError):
215
_fmt = ("The current inventory for the tree %(tree)r has been modified, "
216
"so a clean inventory cannot be read without data loss.")
218
internal_error = True
220
def __init__(self, tree):
224
class NoWorkingTree(BzrError):
226
_fmt = "No WorkingTree exists for %(base)s."
228
def __init__(self, base):
229
BzrError.__init__(self)
233
class NotBuilding(BzrError):
235
_fmt = "Not currently building a tree."
238
class NotLocalUrl(BzrError):
240
_fmt = "%(url)s is not a local path."
242
def __init__(self, url):
246
class WorkingTreeAlreadyPopulated(BzrError):
248
_fmt = """Working tree already populated in %(base)s"""
250
internal_error = True
252
def __init__(self, base):
255
56
class BzrCommandError(BzrError):
256
"""Error from user command"""
258
internal_error = False
260
# Error from malformed user command; please avoid raising this as a
261
# generic exception not caused by user input.
263
# I think it's a waste of effort to differentiate between errors that
264
# are not intended to be caught anyway. UI code need not subclass
265
# BzrCommandError, and non-UI code should not throw a subclass of
266
# BzrCommandError. ADHB 20051211
267
def __init__(self, msg):
268
# Object.__str__() must return a real string
269
# returning a Unicode string is a python error.
270
if isinstance(msg, unicode):
271
self.msg = msg.encode('utf8')
279
class NotWriteLocked(BzrError):
281
_fmt = """%(not_locked)r is not write locked but needs to be."""
283
def __init__(self, not_locked):
284
self.not_locked = not_locked
287
class BzrOptionError(BzrCommandError):
289
_fmt = "Error in command line options"
292
class StrictCommitFailed(BzrError):
294
_fmt = "Commit refused because there are unknown files in the tree"
297
# XXX: Should be unified with TransportError; they seem to represent the
299
class PathError(BzrError):
301
_fmt = "Generic path error: %(path)r%(extra)s)"
303
def __init__(self, path, extra=None):
304
BzrError.__init__(self)
307
self.extra = ': ' + str(extra)
312
class NoSuchFile(PathError):
314
_fmt = "No such file: %(path)r%(extra)s"
317
class FileExists(PathError):
319
_fmt = "File exists: %(path)r%(extra)s"
322
class DirectoryNotEmpty(PathError):
324
_fmt = "Directory not empty: %(path)r%(extra)s"
327
class ReadingCompleted(BzrError):
329
_fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
330
"called upon it - the request has been completed and no more "
333
internal_error = True
335
def __init__(self, request):
336
self.request = request
339
class ResourceBusy(PathError):
341
_fmt = "Device or resource busy: %(path)r%(extra)s"
344
class PermissionDenied(PathError):
346
_fmt = "Permission denied: %(path)r%(extra)s"
349
class InvalidURL(PathError):
351
_fmt = "Invalid url supplied to transport: %(path)r%(extra)s"
354
class InvalidURLJoin(PathError):
356
_fmt = "Invalid URL join request: %(args)s%(extra)s"
358
def __init__(self, msg, base, args):
359
PathError.__init__(self, base, msg)
360
self.args = [base] + list(args)
363
class UnsupportedProtocol(PathError):
365
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
367
def __init__(self, url, extra):
368
PathError.__init__(self, url, extra=extra)
371
class ShortReadvError(PathError):
373
_fmt = "readv() read %(actual)s bytes rather than %(length)s bytes at %(offset)s for %(path)s%(extra)s"
375
internal_error = True
377
def __init__(self, path, offset, length, actual, extra=None):
378
PathError.__init__(self, path, extra=extra)
384
class PathNotChild(BzrError):
386
_fmt = "Path %(path)r is not a child of path %(base)r%(extra)s"
388
internal_error = True
390
def __init__(self, path, base, extra=None):
391
BzrError.__init__(self)
395
self.extra = ': ' + str(extra)
400
class InvalidNormalization(PathError):
402
_fmt = "Path %(path)r is not unicode normalized"
405
# TODO: This is given a URL; we try to unescape it but doing that from inside
406
# the exception object is a bit undesirable.
407
# TODO: Probably this behavior of should be a common superclass
408
class NotBranchError(PathError):
410
_fmt = "Not a branch: %(path)s"
412
def __init__(self, path):
413
import bzrlib.urlutils as urlutils
414
self.path = urlutils.unescape_for_display(path, 'ascii')
417
class AlreadyBranchError(PathError):
419
_fmt = "Already a branch: %(path)s."
422
class BranchExistsWithoutWorkingTree(PathError):
424
_fmt = "Directory contains a branch, but no working tree \
425
(use bzr checkout if you wish to build a working tree): %(path)s"
428
class AtomicFileAlreadyClosed(PathError):
430
_fmt = "'%(function)s' called on an AtomicFile after it was closed: %(path)s"
432
def __init__(self, path, function):
433
PathError.__init__(self, path=path, extra=None)
434
self.function = function
437
class InaccessibleParent(PathError):
439
_fmt = "Parent not accessible given base %(base)s and relative path %(path)s"
441
def __init__(self, path, base):
442
PathError.__init__(self, path)
446
class NoRepositoryPresent(BzrError):
448
_fmt = "No repository present: %(path)r"
449
def __init__(self, bzrdir):
450
BzrError.__init__(self)
451
self.path = bzrdir.transport.clone('..').base
454
class FileInWrongBranch(BzrError):
456
_fmt = "File %(path)s in not in branch %(branch_base)s."
458
def __init__(self, branch, path):
459
BzrError.__init__(self)
461
self.branch_base = branch.base
57
# Error from malformed user command
62
class NotBranchError(BzrError):
63
"""Specified path is not in a branch"""
65
return 'not a branch: %s' % self.args[0]
465
68
class UnsupportedFormatError(BzrError):
467
_fmt = "Unsupported branch format: %(format)s"
470
class UnknownFormatError(BzrError):
472
_fmt = "Unknown branch format: %(format)r"
475
class IncompatibleFormat(BzrError):
477
_fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
479
def __init__(self, format, bzrdir_format):
480
BzrError.__init__(self)
482
self.bzrdir = bzrdir_format
485
class IncompatibleRevision(BzrError):
487
_fmt = "Revision is not compatible with %(repo_format)s"
489
def __init__(self, repo_format):
490
BzrError.__init__(self)
491
self.repo_format = repo_format
69
"""Specified path is a bzr branch that we cannot read."""
71
return 'unsupported branch format: %s' % self.args[0]
494
74
class NotVersionedError(BzrError):
496
_fmt = "%(path)s is not versioned"
498
def __init__(self, path):
499
BzrError.__init__(self)
503
class PathsNotVersionedError(BzrError):
504
# used when reporting several paths are not versioned
506
_fmt = "Path(s) are not versioned: %(paths_as_string)s"
508
def __init__(self, paths):
509
from bzrlib.osutils import quotefn
510
BzrError.__init__(self)
512
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
515
class PathsDoNotExist(BzrError):
517
_fmt = "Path(s) do not exist: %(paths_as_string)s"
519
# used when reporting that paths are neither versioned nor in the working
522
def __init__(self, paths):
524
from bzrlib.osutils import quotefn
525
BzrError.__init__(self)
527
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
75
"""Specified object is not versioned."""
530
78
class BadFileKindError(BzrError):
532
_fmt = "Cannot operate on %(filename)s of unsupported kind %(kind)s"
535
class ForbiddenControlFileError(BzrError):
537
_fmt = "Cannot operate on %(filename)s because it is a control file"
540
class LockError(BzrError):
542
_fmt = "Lock error: %(message)s"
544
# All exceptions from the lock/unlock functions should be from
545
# this exception class. They will be translated as necessary. The
546
# original exception is available as e.original_error
548
# New code should prefer to raise specific subclasses
549
def __init__(self, message):
550
self.message = message
79
"""Specified file is of a kind that cannot be added.
81
(For example a symlink or device file.)"""
85
class ForbiddenFileError(BzrError):
86
"""Cannot operate on a file because it is a control file."""
90
class LockError(Exception):
91
"""All exceptions from the lock/unlock functions should be from
92
this exception class. They will be translated as necessary. The
93
original exception is available as e.original_error
95
def __init__(self, e=None):
96
self.original_error = e
98
Exception.__init__(self, e)
100
Exception.__init__(self)
553
103
class CommitNotPossible(LockError):
555
_fmt = "A commit was attempted but we do not have a write lock open."
104
"""A commit was attempted but we do not have a write lock open."""
561
107
class AlreadyCommitted(LockError):
563
_fmt = "A rollback was requested, but is not able to be accomplished."
108
"""A rollback was requested, but is not able to be accomplished."""
569
111
class ReadOnlyError(LockError):
571
_fmt = "A write attempt was made in a read only transaction on %(obj)s"
573
def __init__(self, obj):
577
class OutSideTransaction(BzrError):
579
_fmt = "A transaction related operation was attempted after the transaction finished."
582
class ObjectNotLocked(LockError):
584
_fmt = "%(obj)r is not locked"
586
internal_error = True
588
# this can indicate that any particular object is not locked; see also
589
# LockNotHeld which means that a particular *lock* object is not held by
590
# the caller -- perhaps they should be unified.
591
def __init__(self, obj):
595
class ReadOnlyObjectDirtiedError(ReadOnlyError):
597
_fmt = "Cannot change object %(obj)r in read only transaction"
599
def __init__(self, obj):
603
class UnlockableTransport(LockError):
605
_fmt = "Cannot lock: transport is read only: %(transport)s"
607
def __init__(self, transport):
608
self.transport = transport
611
class LockContention(LockError):
613
_fmt = "Could not acquire lock %(lock)s"
614
# TODO: show full url for lock, combining the transport and relative bits?
616
def __init__(self, lock):
620
class LockBroken(LockError):
622
_fmt = "Lock was broken while still open: %(lock)s - check storage consistency!"
624
def __init__(self, lock):
628
class LockBreakMismatch(LockError):
630
_fmt = "Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"
632
def __init__(self, lock, holder, target):
638
class LockNotHeld(LockError):
640
_fmt = "Lock not held: %(lock)s"
642
def __init__(self, lock):
646
class PointlessCommit(BzrError):
648
_fmt = "No changes to commit"
651
class UpgradeReadonly(BzrError):
653
_fmt = "Upgrade URL cannot work with readonly URLs."
656
class UpToDateFormat(BzrError):
658
_fmt = "The branch format %(format)s is already at the most recent format."
660
def __init__(self, format):
661
BzrError.__init__(self)
665
class StrictCommitFailed(Exception):
667
_fmt = "Commit refused because there are unknowns in the tree."
112
"""A write attempt was made in a read only transaction."""
115
class PointlessCommit(Exception):
116
"""Commit failed because nothing was changed."""
670
119
class NoSuchRevision(BzrError):
672
_fmt = "Branch %(branch)s has no revision %(revision)s"
674
internal_error = True
676
120
def __init__(self, branch, revision):
677
BzrError.__init__(self, branch=branch, revision=revision)
680
class NoSuchRevisionSpec(BzrError):
682
_fmt = "No namespace registered for string: %(spec)r"
684
def __init__(self, spec):
685
BzrError.__init__(self, spec=spec)
688
class InvalidRevisionSpec(BzrError):
690
_fmt = "Requested revision: %(spec)r does not exist in branch: %(branch)s%(extra)s"
692
def __init__(self, spec, branch, extra=None):
693
BzrError.__init__(self, branch=branch, spec=spec)
695
self.extra = '\n' + str(extra)
122
self.revision = revision
123
msg = "Branch %s has no revision %s" % (branch, revision)
124
BzrError.__init__(self, msg)
700
127
class HistoryMissing(BzrError):
702
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
128
def __init__(self, branch, object_type, object_id):
130
BzrError.__init__(self,
131
'%s is missing %s {%s}'
132
% (branch, object_type, object_id))
705
135
class DivergedBranches(BzrError):
707
_fmt = "These branches have diverged. Use the merge command to reconcile them."""
709
internal_error = False
711
136
def __init__(self, branch1, branch2):
137
BzrError.__init__(self, "These branches have diverged.")
712
138
self.branch1 = branch1
713
139
self.branch2 = branch2
716
class UnrelatedBranches(BzrError):
718
_fmt = "Branches have no common ancestor, and no merge base revision was specified."
720
internal_error = False
142
class UnrelatedBranches(BzrCommandError):
144
msg = "Branches have no common ancestor, and no base revision"\
146
BzrCommandError.__init__(self, msg)
723
148
class NoCommonAncestor(BzrError):
725
_fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
727
149
def __init__(self, revision_a, revision_b):
728
self.revision_a = revision_a
729
self.revision_b = revision_b
150
msg = "Revisions have no common ancestor: %s %s." \
151
% (revision_a, revision_b)
152
BzrError.__init__(self, msg)
732
154
class NoCommonRoot(BzrError):
734
_fmt = "Revisions are not derived from the same root: " \
735
"%(revision_a)s %(revision_b)s."
737
155
def __init__(self, revision_a, revision_b):
738
BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
741
class NotAncestor(BzrError):
743
_fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
745
def __init__(self, rev_id, not_ancestor_id):
746
BzrError.__init__(self, rev_id=rev_id,
747
not_ancestor_id=not_ancestor_id)
156
msg = "Revisions are not derived from the same root: %s %s." \
157
% (revision_a, revision_b)
158
BzrError.__init__(self, msg)
160
class NotAncestor(BzrError):
161
def __init__(self, rev_id, not_ancestor_id):
162
msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id,
164
BzrError.__init__(self, msg)
166
self.not_ancestor_id = not_ancestor_id
169
class NotAncestor(BzrError):
170
def __init__(self, rev_id, not_ancestor_id):
172
self.not_ancestor_id = not_ancestor_id
173
msg = "Revision %s is not an ancestor of %s" % (not_ancestor_id,
175
BzrError.__init__(self, msg)
750
178
class InstallFailed(BzrError):
752
179
def __init__(self, revisions):
753
180
msg = "Could not install revisions:\n%s" % " ,".join(revisions)
754
181
BzrError.__init__(self, msg)
758
185
class AmbiguousBase(BzrError):
760
186
def __init__(self, bases):
761
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
763
msg = "The correct base is unclear, because %s are all equally close" %\
187
msg = "The correct base is unclear, becase %s are all equally close" %\
765
189
BzrError.__init__(self, msg)
766
190
self.bases = bases
769
192
class NoCommits(BzrError):
771
_fmt = "Branch %(branch)s has no commits."
773
193
def __init__(self, branch):
774
BzrError.__init__(self, branch=branch)
194
msg = "Branch %s has no commits." % branch
195
BzrError.__init__(self, msg)
777
197
class UnlistableStore(BzrError):
779
198
def __init__(self, store):
780
199
BzrError.__init__(self, "Store %s is not listable" % store)
784
201
class UnlistableBranch(BzrError):
786
202
def __init__(self, br):
787
203
BzrError.__init__(self, "Stores for branch %s are not listable" % br)
790
class BoundBranchOutOfDate(BzrError):
792
_fmt = "Bound branch %(branch)s is out of date with master branch %(master)s."
794
def __init__(self, branch, master):
795
BzrError.__init__(self)
800
class CommitToDoubleBoundBranch(BzrError):
802
_fmt = "Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."
804
def __init__(self, branch, master, remote):
805
BzrError.__init__(self)
811
class OverwriteBoundBranch(BzrError):
813
_fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
815
def __init__(self, branch):
816
BzrError.__init__(self)
820
class BoundBranchConnectionFailure(BzrError):
822
_fmt = "Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"
824
def __init__(self, branch, target, error):
825
BzrError.__init__(self)
831
class WeaveError(BzrError):
833
_fmt = "Error in processing weave: %(message)s"
835
def __init__(self, message=None):
836
BzrError.__init__(self)
837
self.message = message
840
class WeaveRevisionAlreadyPresent(WeaveError):
842
_fmt = "Revision {%(revision_id)s} already present in %(weave)s"
844
def __init__(self, revision_id, weave):
846
WeaveError.__init__(self)
847
self.revision_id = revision_id
851
class WeaveRevisionNotPresent(WeaveError):
853
_fmt = "Revision {%(revision_id)s} not present in %(weave)s"
855
def __init__(self, revision_id, weave):
856
WeaveError.__init__(self)
857
self.revision_id = revision_id
861
class WeaveFormatError(WeaveError):
863
_fmt = "Weave invariant violated: %(what)s"
865
def __init__(self, what):
866
WeaveError.__init__(self)
870
class WeaveParentMismatch(WeaveError):
872
_fmt = "Parents are mismatched between two revisions."
875
class WeaveInvalidChecksum(WeaveError):
877
_fmt = "Text did not match it's checksum: %(message)s"
880
class WeaveTextDiffers(WeaveError):
882
_fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
884
def __init__(self, revision_id, weave_a, weave_b):
885
WeaveError.__init__(self)
886
self.revision_id = revision_id
887
self.weave_a = weave_a
888
self.weave_b = weave_b
891
class WeaveTextDiffers(WeaveError):
893
_fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
895
def __init__(self, revision_id, weave_a, weave_b):
896
WeaveError.__init__(self)
897
self.revision_id = revision_id
898
self.weave_a = weave_a
899
self.weave_b = weave_b
902
class VersionedFileError(BzrError):
904
_fmt = "Versioned file error"
907
class RevisionNotPresent(VersionedFileError):
909
_fmt = "Revision {%(revision_id)s} not present in %(file_id)s."
911
def __init__(self, revision_id, file_id):
912
VersionedFileError.__init__(self)
913
self.revision_id = revision_id
914
self.file_id = file_id
917
class RevisionAlreadyPresent(VersionedFileError):
919
_fmt = "Revision {%(revision_id)s} already present in %(file_id)s."
921
def __init__(self, revision_id, file_id):
922
VersionedFileError.__init__(self)
923
self.revision_id = revision_id
924
self.file_id = file_id
927
class KnitError(BzrError):
932
class KnitHeaderError(KnitError):
934
_fmt = "Knit header error: %(badline)r unexpected"
936
def __init__(self, badline):
937
KnitError.__init__(self)
938
self.badline = badline
941
class KnitCorrupt(KnitError):
943
_fmt = "Knit %(filename)s corrupt: %(how)s"
945
def __init__(self, filename, how):
946
KnitError.__init__(self)
947
self.filename = filename
951
class NoSuchExportFormat(BzrError):
953
_fmt = "Export format %(format)r not supported"
955
def __init__(self, format):
956
BzrError.__init__(self)
206
from bzrlib.weave import WeaveError, WeaveParentMismatch
960
208
class TransportError(BzrError):
962
_fmt = "Transport error: %(msg)s %(orig_error)s"
209
"""All errors thrown by Transport implementations should derive
964
212
def __init__(self, msg=None, orig_error=None):
965
213
if msg is None and orig_error is not None:
966
214
msg = str(orig_error)
967
if orig_error is None:
215
BzrError.__init__(self, msg)
972
217
self.orig_error = orig_error
973
BzrError.__init__(self)
976
class TooManyConcurrentRequests(BzrError):
978
_fmt = ("The medium '%(medium)s' has reached its concurrent request limit. "
979
"Be sure to finish_writing and finish_reading on the "
980
"current request that is open.")
982
internal_error = True
984
def __init__(self, medium):
988
class SmartProtocolError(TransportError):
990
_fmt = "Generic bzr smart protocol error: %(details)s"
992
def __init__(self, details):
993
self.details = details
996
219
# A set of semi-meaningful errors which can be thrown
997
220
class TransportNotPossible(TransportError):
999
_fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
1002
class ConnectionError(TransportError):
1004
_fmt = "Connection error: %(msg)s %(orig_error)s"
1007
class SocketConnectionError(ConnectionError):
1009
_fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
1011
def __init__(self, host, port=None, msg=None, orig_error=None):
1013
msg = 'Failed to connect to'
1014
if orig_error is None:
1017
orig_error = '; ' + str(orig_error)
1018
ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
1023
self.port = ':%s' % port
221
"""This is for transports where a specific function is explicitly not
222
possible. Such as pushing files to an HTTP server.
226
class NonRelativePath(TransportError):
227
"""An absolute path was supplied, that could not be decoded into
232
class NoSuchFile(TransportError, IOError):
233
"""A get() was issued for a file that doesn't exist."""
235
# XXX: Is multiple inheritance for exceptions really needed?
238
return 'no such file: ' + self.msg
240
def __init__(self, msg=None, orig_error=None):
242
TransportError.__init__(self, msg=msg, orig_error=orig_error)
243
IOError.__init__(self, errno.ENOENT, self.msg)
245
class FileExists(TransportError, OSError):
246
"""An operation was attempted, which would overwrite an entry,
247
but overwritting is not supported.
249
mkdir() can throw this, but put() just overwites existing files.
251
# XXX: Is multiple inheritance for exceptions really needed?
252
def __init__(self, msg=None, orig_error=None):
254
TransportError.__init__(self, msg=msg, orig_error=orig_error)
255
OSError.__init__(self, errno.EEXIST, self.msg)
257
class PermissionDenied(TransportError):
258
"""An operation cannot succeed because of a lack of permissions."""
1026
261
class ConnectionReset(TransportError):
1028
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1031
class InvalidRange(TransportError):
1033
_fmt = "Invalid range access in %(path)s at %(offset)s."
1035
def __init__(self, path, offset):
1036
TransportError.__init__(self, ("Invalid range access in %s at %d"
1039
self.offset = offset
1042
class InvalidHttpResponse(TransportError):
1044
_fmt = "Invalid http response for %(path)s: %(msg)s"
1046
def __init__(self, path, msg, orig_error=None):
1048
TransportError.__init__(self, msg, orig_error=orig_error)
1051
class InvalidHttpRange(InvalidHttpResponse):
1053
_fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1055
def __init__(self, path, range, msg):
1057
InvalidHttpResponse.__init__(self, path, msg)
1060
class InvalidHttpContentType(InvalidHttpResponse):
1062
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1064
def __init__(self, path, ctype, msg):
1066
InvalidHttpResponse.__init__(self, path, msg)
262
"""The connection has been closed."""
1069
265
class ConflictsInTree(BzrError):
1071
_fmt = "Working tree has conflicts."
1074
class ParseConfigError(BzrError):
1076
def __init__(self, errors, filename):
1077
if filename is None:
1079
message = "Error(s) parsing config file %s:\n%s" % \
1080
(filename, ('\n'.join(e.message for e in errors)))
1081
BzrError.__init__(self, message)
1084
class NoEmailInUsername(BzrError):
1086
_fmt = "%(username)r does not seem to contain a reasonable email address"
1088
def __init__(self, username):
1089
BzrError.__init__(self)
1090
self.username = username
1093
class SigningFailed(BzrError):
1095
_fmt = "Failed to gpg sign data with command %(command_line)r"
1097
def __init__(self, command_line):
1098
BzrError.__init__(self, command_line=command_line)
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"
1107
def __init__(self, tree):
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"
1121
def __init__(self, graph):
1122
BzrError.__init__(self)
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."
1153
def __init__(self, filename):
1154
BzrError.__init__(self)
1155
self.filename = filename
1158
class MediumNotConnected(BzrError):
1160
_fmt = """The medium '%(medium)s' is not connected."""
1162
internal_error = True
1164
def __init__(self, medium):
1165
self.medium = medium
1168
class MustUseDecorated(Exception):
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"
1177
def __init__(self, filename):
1178
BzrError.__init__(self)
1179
self.filename = filename
1182
class BundleNotSupported(BzrError):
1184
_fmt = "Unable to handle bundle version %(version)s: %(msg)s"
1186
def __init__(self, version, msg):
1187
BzrError.__init__(self)
1188
self.version = version
1192
class MissingText(BzrError):
1194
_fmt = "Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"
1196
def __init__(self, branch, text_revision, file_id):
1197
BzrError.__init__(self)
1198
self.branch = branch
1199
self.base = branch.base
1200
self.text_revision = text_revision
1201
self.file_id = file_id
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.
1233
def __init__(self, param):
1234
BzrError.__init__(self)
1238
class BzrBadParameterNotUnicode(BzrBadParameter):
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"
1253
class BzrBadParameterNotString(BzrBadParameter):
1255
_fmt = "Parameter %(param)s is not a string or unicode string."
1258
class BzrBadParameterMissing(BzrBadParameter):
1260
_fmt = "Parameter $(param)s is required but not present."
1263
class BzrBadParameterUnicode(BzrBadParameter):
1265
_fmt = "Parameter %(param)s is unicode but only byte-strings are permitted."
1268
class BzrBadParameterContainsNewline(BzrBadParameter):
1270
_fmt = "Parameter %(param)s contains a newline."
1273
class DependencyNotPresent(BzrError):
1275
_fmt = 'Unable to import library "%(library)s": %(error)s'
1277
def __init__(self, library, error):
1278
BzrError.__init__(self, library=library, error=error)
1281
class ParamikoNotPresent(DependencyNotPresent):
1283
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
1285
def __init__(self, error):
1286
DependencyNotPresent.__init__(self, 'paramiko', error)
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."
1298
def __init__(self, format):
1299
BzrError.__init__(self)
1300
self.format = format
1303
class BadConversionTarget(BzrError):
1305
_fmt = "Cannot convert to format %(format)s. %(problem)s"
1307
def __init__(self, problem, format):
1308
BzrError.__init__(self)
1309
self.problem = problem
1310
self.format = format
1313
class NoDiff(BzrError):
1315
_fmt = "Diff is not installed on this machine: %(msg)s"
1317
def __init__(self, msg):
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'."
1352
def __init__(self, tree):
1353
BzrError.__init__(self)
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.
1370
Please run bzr reconcile on this repository."""
1372
def __init__(self, repo):
1373
BzrError.__init__(self)
1374
self.repo_path = repo.bzrdir.root_transport.base
1377
class UpgradeRequired(BzrError):
1379
_fmt = "To use this feature you must upgrade your branch at %(path)s."
1381
def __init__(self, path):
1382
BzrError.__init__(self)
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
1399
Select one of: %(valid_types)s"""
1401
def __init__(self, bar_type, valid_types):
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."
1409
def __init__(self, method, method_self):
1410
self.method = method
1411
self.mname = method.__name__
1412
self.tname = type(method_self).__name__
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"
1424
def __init__(self, path):
1425
BzrError.__init__(self)
1429
class TestamentMismatch(BzrError):
1431
_fmt = """Testament did not match expected value.
1432
For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
1435
def __init__(self, revision_id, expected, measured):
1436
self.revision_id = revision_id
1437
self.expected = expected
1438
self.measured = measured
1441
class NotABundle(BzrError):
1443
_fmt = "Not a bzr revision-bundle: %(text)r"
1445
def __init__(self, text):
1446
BzrError.__init__(self)
1450
class BadBundle(BzrError):
1452
_fmt = "Bad bzr revision-bundle: %(text)r"
1454
def __init__(self, text):
1455
BzrError.__init__(self)
1459
class MalformedHeader(BadBundle):
1461
_fmt = "Malformed bzr revision-bundle header: %(text)r"
1464
class MalformedPatches(BadBundle):
1466
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
1469
class MalformedFooter(BadBundle):
1471
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
1474
class UnsupportedEOLMarker(BadBundle):
1476
_fmt = "End of line marker was not \\n in bzr revision-bundle"
1478
266
def __init__(self):
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"
1488
def __init__(self, bundle_format, other):
1489
BzrError.__init__(self)
1490
self.bundle_format = bundle_format
1494
class BadInventoryFormat(BzrError):
1496
_fmt = "Root class for inventory serialization errors"
1499
class UnexpectedInventoryFormat(BadInventoryFormat):
1501
_fmt = "The inventory was not in the expected format:\n %(msg)s"
1503
def __init__(self, msg):
1504
BadInventoryFormat.__init__(self, msg=msg)
1507
class NoSmartMedium(BzrError):
1509
_fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
1511
def __init__(self, transport):
1512
self.transport = transport
1515
class NoSmartServer(NotBranchError):
1517
_fmt = "No smart server available at %(url)s"
1519
def __init__(self, url):
1523
class UnknownSSH(BzrError):
1525
_fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
1527
def __init__(self, vendor):
1528
BzrError.__init__(self)
1529
self.vendor = vendor
1532
class GhostRevisionUnusableHere(BzrError):
1534
_fmt = "Ghost revision {%(revision_id)s} cannot be used here."
1536
def __init__(self, revision_id):
1537
BzrError.__init__(self)
1538
self.revision_id = revision_id
1541
class IllegalUseOfScopeReplacer(BzrError):
1543
_fmt = "ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"
1545
internal_error = True
1547
def __init__(self, name, msg, extra=None):
1548
BzrError.__init__(self)
1552
self.extra = ': ' + str(extra)
1557
class InvalidImportLine(BzrError):
1559
_fmt = "Not a valid import statement: %(msg)\n%(text)s"
1561
internal_error = True
1563
def __init__(self, text, msg):
1564
BzrError.__init__(self)
1569
class ImportNameCollision(BzrError):
1571
_fmt = "Tried to import an object to the same name as an existing object. %(name)s"
1573
internal_error = True
1575
def __init__(self, name):
1576
BzrError.__init__(self)
267
BzrError.__init__(self, "Working tree has conflicts.")