1
# Copyright (C) 2005, 2006 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Exceptions for bzr, and reporting of them.
25
from bzrlib.patches import (
34
# TODO: is there any value in providing the .args field used by standard
35
# python exceptions? A list of values with no names seems less useful
38
# TODO: Perhaps convert the exception to a string at the moment it's
39
# constructed to make sure it will succeed. But that says nothing about
40
# exceptions that are never raised.
42
# TODO: selftest assertRaises should probably also check that every error
43
# raised can be formatted as a string successfully, and without giving
47
class BzrError(StandardError):
49
Base class for errors raised by bzrlib.
51
:cvar internal_error: if true (or absent) this was probably caused by a
52
bzr bug and should be displayed with a traceback; if False this was
53
probably a user or environment error and they don't need the gory details.
54
(That can be overridden by -Derror on the command line.)
56
:cvar _fmt: Format string to display the error; this is expanded
57
by the instance's dict.
60
internal_error = False
62
def __init__(self, msg=None, **kwds):
63
"""Construct a new BzrError.
65
There are two alternative forms for constructing these objects.
66
Either a preformatted string may be passed, or a set of named
67
arguments can be given. The first is for generic "user" errors which
68
are not intended to be caught and so do not need a specific subclass.
69
The second case is for use with subclasses that provide a _fmt format
70
string to print the arguments.
72
Keyword arguments are taken as parameters to the error, which can
73
be inserted into the format string template. It's recommended
74
that subclasses override the __init__ method to require specific
77
:param msg: If given, this is the literal complete text for the error,
78
not subject to expansion.
80
StandardError.__init__(self)
82
# I was going to deprecate this, but it actually turns out to be
83
# quite handy - mbp 20061103.
84
self._preformatted_string = msg
86
self._preformatted_string = None
87
for key, value in kwds.items():
88
setattr(self, key, value)
91
s = getattr(self, '_preformatted_string', None)
93
# contains a preformatted message; must be cast to plain str
96
fmt = self._get_format_string()
98
s = fmt % self.__dict__
99
# __str__() should always return a 'str' object
100
# never a 'unicode' object.
101
if isinstance(s, unicode):
102
return s.encode('utf8')
104
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%s' \
106
% (self.__class__.__name__,
108
getattr(self, '_fmt', None),
111
def _get_format_string(self):
112
"""Return format string for this exception or None"""
113
fmt = getattr(self, '_fmt', None)
116
fmt = getattr(self, '__doc__', None)
118
symbol_versioning.warn("%s uses its docstring as a format, "
119
"it should use _fmt instead" % self.__class__.__name__,
122
return 'Unprintable exception %s: dict=%r, fmt=%r' \
123
% (self.__class__.__name__,
125
getattr(self, '_fmt', None),
129
class BzrNewError(BzrError):
130
"""Deprecated error base class."""
131
# base classes should override the docstring with their human-
132
# readable explanation
134
def __init__(self, *args, **kwds):
135
# XXX: Use the underlying BzrError to always generate the args
136
# attribute if it doesn't exist. We can't use super here, because
137
# exceptions are old-style classes in python2.4 (but new in 2.5).
139
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
140
'please convert %s to use BzrError instead'
141
% self.__class__.__name__,
144
BzrError.__init__(self, *args)
145
for key, value in kwds.items():
146
setattr(self, key, value)
150
# __str__() should always return a 'str' object
151
# never a 'unicode' object.
152
s = self.__doc__ % self.__dict__
153
if isinstance(s, unicode):
154
return s.encode('utf8')
156
except (TypeError, NameError, ValueError, KeyError), e:
157
return 'Unprintable exception %s(%r): %s' \
158
% (self.__class__.__name__,
159
self.__dict__, str(e))
162
class AlreadyBuilding(BzrError):
164
_fmt = "The tree builder is already building a tree."
167
class BzrCheckError(BzrError):
169
_fmt = "Internal check failed: %(message)s"
171
internal_error = True
173
def __init__(self, message):
174
BzrError.__init__(self)
175
self.message = message
178
class InvalidEntryName(BzrError):
180
_fmt = "Invalid entry name: %(name)s"
182
internal_error = True
184
def __init__(self, name):
185
BzrError.__init__(self)
189
class InvalidRevisionNumber(BzrError):
191
_fmt = "Invalid revision number %(revno)s"
193
def __init__(self, revno):
194
BzrError.__init__(self)
198
class InvalidRevisionId(BzrError):
200
_fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
202
def __init__(self, revision_id, branch):
203
# branch can be any string or object with __str__ defined
204
BzrError.__init__(self)
205
self.revision_id = revision_id
208
class ReservedId(BzrError):
210
_fmt = "Reserved revision-id {%(revision_id)s}"
212
def __init__(self, revision_id):
213
self.revision_id = revision_id
215
class NoSuchId(BzrError):
217
_fmt = "The file id %(file_id)s is not present in the tree %(tree)s."
219
def __init__(self, tree, file_id):
220
BzrError.__init__(self)
221
self.file_id = file_id
225
class InventoryModified(BzrError):
227
_fmt = ("The current inventory for the tree %(tree)r has been modified,"
228
" so a clean inventory cannot be read without data loss.")
230
internal_error = True
232
def __init__(self, tree):
236
class NoWorkingTree(BzrError):
238
_fmt = "No WorkingTree exists for %(base)s."
240
def __init__(self, base):
241
BzrError.__init__(self)
245
class NotBuilding(BzrError):
247
_fmt = "Not currently building a tree."
250
class NotLocalUrl(BzrError):
252
_fmt = "%(url)s is not a local path."
254
def __init__(self, url):
258
class WorkingTreeAlreadyPopulated(BzrError):
260
_fmt = """Working tree already populated in %(base)s"""
262
internal_error = True
264
def __init__(self, base):
267
class BzrCommandError(BzrError):
268
"""Error from user command"""
270
internal_error = False
272
# Error from malformed user command; please avoid raising this as a
273
# generic exception not caused by user input.
275
# I think it's a waste of effort to differentiate between errors that
276
# are not intended to be caught anyway. UI code need not subclass
277
# BzrCommandError, and non-UI code should not throw a subclass of
278
# BzrCommandError. ADHB 20051211
279
def __init__(self, msg):
280
# Object.__str__() must return a real string
281
# returning a Unicode string is a python error.
282
if isinstance(msg, unicode):
283
self.msg = msg.encode('utf8')
291
class NotWriteLocked(BzrError):
293
_fmt = """%(not_locked)r is not write locked but needs to be."""
295
def __init__(self, not_locked):
296
self.not_locked = not_locked
299
class BzrOptionError(BzrCommandError):
301
_fmt = "Error in command line options"
304
class BadOptionValue(BzrError):
306
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
308
def __init__(self, name, value):
309
BzrError.__init__(self, name=name, value=value)
312
class StrictCommitFailed(BzrError):
314
_fmt = "Commit refused because there are unknown files in the tree"
317
# XXX: Should be unified with TransportError; they seem to represent the
319
class PathError(BzrError):
321
_fmt = "Generic path error: %(path)r%(extra)s)"
323
def __init__(self, path, extra=None):
324
BzrError.__init__(self)
327
self.extra = ': ' + str(extra)
332
class NoSuchFile(PathError):
334
_fmt = "No such file: %(path)r%(extra)s"
337
class FileExists(PathError):
339
_fmt = "File exists: %(path)r%(extra)s"
342
class RenameFailedFilesExist(BzrError):
343
"""Used when renaming and both source and dest exist."""
345
_fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
348
def __init__(self, source, dest, extra=None):
349
BzrError.__init__(self)
350
self.source = str(source)
351
self.dest = str(dest)
353
self.extra = ' ' + str(extra)
358
class NotADirectory(PathError):
360
_fmt = "%(path)r is not a directory %(extra)s"
363
class NotInWorkingDirectory(PathError):
365
_fmt = "%(path)r is not in the working directory %(extra)s"
368
class DirectoryNotEmpty(PathError):
370
_fmt = "Directory not empty: %(path)r%(extra)s"
373
class ReadingCompleted(BzrError):
375
_fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
376
"called upon it - the request has been completed and no more "
379
internal_error = True
381
def __init__(self, request):
382
self.request = request
385
class ResourceBusy(PathError):
387
_fmt = "Device or resource busy: %(path)r%(extra)s"
390
class PermissionDenied(PathError):
392
_fmt = "Permission denied: %(path)r%(extra)s"
395
class InvalidURL(PathError):
397
_fmt = "Invalid url supplied to transport: %(path)r%(extra)s"
400
class InvalidURLJoin(PathError):
402
_fmt = "Invalid URL join request: %(args)s%(extra)s"
404
def __init__(self, msg, base, args):
405
PathError.__init__(self, base, msg)
406
self.args = [base] + list(args)
409
class UnknownHook(BzrError):
411
_fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
413
def __init__(self, hook_type, hook_name):
414
BzrError.__init__(self)
415
self.type = hook_type
416
self.hook = hook_name
419
class UnsupportedProtocol(PathError):
421
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
423
def __init__(self, url, extra):
424
PathError.__init__(self, url, extra=extra)
427
class ShortReadvError(PathError):
429
_fmt = ("readv() read %(actual)s bytes rather than %(length)s bytes"
430
" at %(offset)s for %(path)s%(extra)s")
432
internal_error = True
434
def __init__(self, path, offset, length, actual, extra=None):
435
PathError.__init__(self, path, extra=extra)
441
class PathNotChild(BzrError):
443
_fmt = "Path %(path)r is not a child of path %(base)r%(extra)s"
445
internal_error = True
447
def __init__(self, path, base, extra=None):
448
BzrError.__init__(self)
452
self.extra = ': ' + str(extra)
457
class InvalidNormalization(PathError):
459
_fmt = "Path %(path)r is not unicode normalized"
462
# TODO: This is given a URL; we try to unescape it but doing that from inside
463
# the exception object is a bit undesirable.
464
# TODO: Probably this behavior of should be a common superclass
465
class NotBranchError(PathError):
467
_fmt = "Not a branch: %(path)s"
469
def __init__(self, path):
470
import bzrlib.urlutils as urlutils
471
self.path = urlutils.unescape_for_display(path, 'ascii')
474
class AlreadyBranchError(PathError):
476
_fmt = "Already a branch: %(path)s."
479
class BranchExistsWithoutWorkingTree(PathError):
481
_fmt = "Directory contains a branch, but no working tree \
482
(use bzr checkout if you wish to build a working tree): %(path)s"
485
class AtomicFileAlreadyClosed(PathError):
487
_fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
490
def __init__(self, path, function):
491
PathError.__init__(self, path=path, extra=None)
492
self.function = function
495
class InaccessibleParent(PathError):
497
_fmt = ("Parent not accessible given base %(base)s and"
498
" relative path %(path)s")
500
def __init__(self, path, base):
501
PathError.__init__(self, path)
505
class NoRepositoryPresent(BzrError):
507
_fmt = "No repository present: %(path)r"
508
def __init__(self, bzrdir):
509
BzrError.__init__(self)
510
self.path = bzrdir.transport.clone('..').base
513
class FileInWrongBranch(BzrError):
515
_fmt = "File %(path)s in not in branch %(branch_base)s."
517
def __init__(self, branch, path):
518
BzrError.__init__(self)
520
self.branch_base = branch.base
524
class UnsupportedFormatError(BzrError):
526
_fmt = "Unsupported branch format: %(format)s"
529
class UnknownFormatError(BzrError):
531
_fmt = "Unknown branch format: %(format)r"
534
class IncompatibleFormat(BzrError):
536
_fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
538
def __init__(self, format, bzrdir_format):
539
BzrError.__init__(self)
541
self.bzrdir = bzrdir_format
544
class IncompatibleRevision(BzrError):
546
_fmt = "Revision is not compatible with %(repo_format)s"
548
def __init__(self, repo_format):
549
BzrError.__init__(self)
550
self.repo_format = repo_format
553
class AlreadyVersionedError(BzrError):
554
"""Used when a path is expected not to be versioned, but it is."""
556
_fmt = "%(context_info)s%(path)s is already versioned"
558
def __init__(self, path, context_info=None):
559
"""Construct a new NotVersionedError.
561
:param path: This is the path which is versioned,
562
which should be in a user friendly form.
563
:param context_info: If given, this is information about the context,
564
which could explain why this is expected to not be versioned.
566
BzrError.__init__(self)
568
if context_info is None:
569
self.context_info = ''
571
self.context_info = context_info + ". "
574
class NotVersionedError(BzrError):
575
"""Used when a path is expected to be versioned, but it is not."""
577
_fmt = "%(context_info)s%(path)s is not versioned"
579
def __init__(self, path, context_info=None):
580
"""Construct a new NotVersionedError.
582
:param path: This is the path which is not versioned,
583
which should be in a user friendly form.
584
:param context_info: If given, this is information about the context,
585
which could explain why this is expected to be versioned.
587
BzrError.__init__(self)
589
if context_info is None:
590
self.context_info = ''
592
self.context_info = context_info + ". "
595
class PathsNotVersionedError(BzrError):
596
"""Used when reporting several paths which are not versioned"""
598
_fmt = "Path(s) are not versioned: %(paths_as_string)s"
600
def __init__(self, paths):
601
from bzrlib.osutils import quotefn
602
BzrError.__init__(self)
604
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
607
class PathsDoNotExist(BzrError):
609
_fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
611
# used when reporting that paths are neither versioned nor in the working
614
def __init__(self, paths, extra=None):
616
from bzrlib.osutils import quotefn
617
BzrError.__init__(self)
619
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
621
self.extra = ': ' + str(extra)
626
class BadFileKindError(BzrError):
628
_fmt = "Cannot operate on %(filename)s of unsupported kind %(kind)s"
631
class ForbiddenControlFileError(BzrError):
633
_fmt = "Cannot operate on %(filename)s because it is a control file"
636
class LockError(BzrError):
638
_fmt = "Lock error: %(message)s"
640
internal_error = True
642
# All exceptions from the lock/unlock functions should be from
643
# this exception class. They will be translated as necessary. The
644
# original exception is available as e.original_error
646
# New code should prefer to raise specific subclasses
647
def __init__(self, message):
648
self.message = message
651
class CommitNotPossible(LockError):
653
_fmt = "A commit was attempted but we do not have a write lock open."
659
class AlreadyCommitted(LockError):
661
_fmt = "A rollback was requested, but is not able to be accomplished."
667
class ReadOnlyError(LockError):
669
_fmt = "A write attempt was made in a read only transaction on %(obj)s"
671
def __init__(self, obj):
675
class OutSideTransaction(BzrError):
677
_fmt = ("A transaction related operation was attempted after"
678
" the transaction finished.")
681
class ObjectNotLocked(LockError):
683
_fmt = "%(obj)r is not locked"
685
# this can indicate that any particular object is not locked; see also
686
# LockNotHeld which means that a particular *lock* object is not held by
687
# the caller -- perhaps they should be unified.
688
def __init__(self, obj):
692
class ReadOnlyObjectDirtiedError(ReadOnlyError):
694
_fmt = "Cannot change object %(obj)r in read only transaction"
696
def __init__(self, obj):
700
class UnlockableTransport(LockError):
702
_fmt = "Cannot lock: transport is read only: %(transport)s"
704
def __init__(self, transport):
705
self.transport = transport
708
class LockContention(LockError):
710
_fmt = "Could not acquire lock %(lock)s"
711
# TODO: show full url for lock, combining the transport and relative
714
internal_error = False
716
def __init__(self, lock):
720
class LockBroken(LockError):
722
_fmt = ("Lock was broken while still open: %(lock)s"
723
" - check storage consistency!")
725
internal_error = False
727
def __init__(self, lock):
731
class LockBreakMismatch(LockError):
733
_fmt = ("Lock was released and re-acquired before being broken:"
734
" %(lock)s: held by %(holder)r, wanted to break %(target)r")
736
internal_error = False
738
def __init__(self, lock, holder, target):
744
class LockNotHeld(LockError):
746
_fmt = "Lock not held: %(lock)s"
748
internal_error = False
750
def __init__(self, lock):
754
class PointlessCommit(BzrError):
756
_fmt = "No changes to commit"
759
class UpgradeReadonly(BzrError):
761
_fmt = "Upgrade URL cannot work with readonly URLs."
764
class UpToDateFormat(BzrError):
766
_fmt = "The branch format %(format)s is already at the most recent format."
768
def __init__(self, format):
769
BzrError.__init__(self)
773
class StrictCommitFailed(Exception):
775
_fmt = "Commit refused because there are unknowns in the tree."
778
class NoSuchRevision(BzrError):
780
_fmt = "Branch %(branch)s has no revision %(revision)s"
782
internal_error = True
784
def __init__(self, branch, revision):
785
BzrError.__init__(self, branch=branch, revision=revision)
788
class NotLeftParentDescendant(BzrError):
790
_fmt = ("Revision %(old_revision)s is not the left parent of"
791
" %(new_revision)s, but branch %(branch_location)s expects this")
793
internal_error = True
795
def __init__(self, branch, old_revision, new_revision):
796
BzrError.__init__(self, branch_location=branch.base,
797
old_revision=old_revision,
798
new_revision=new_revision)
801
class NoSuchRevisionSpec(BzrError):
803
_fmt = "No namespace registered for string: %(spec)r"
805
def __init__(self, spec):
806
BzrError.__init__(self, spec=spec)
809
class InvalidRevisionSpec(BzrError):
811
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
812
" %(branch)s%(extra)s")
814
def __init__(self, spec, branch, extra=None):
815
BzrError.__init__(self, branch=branch, spec=spec)
817
self.extra = '\n' + str(extra)
822
class HistoryMissing(BzrError):
824
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
827
class AppendRevisionsOnlyViolation(BzrError):
829
_fmt = ('Operation denied because it would change the main history,'
830
' which is not permitted by the append_revisions_only setting on'
831
' branch "%(location)s".')
833
def __init__(self, location):
834
import bzrlib.urlutils as urlutils
835
location = urlutils.unescape_for_display(location, 'ascii')
836
BzrError.__init__(self, location=location)
839
class DivergedBranches(BzrError):
841
_fmt = ("These branches have diverged."
842
" Use the merge command to reconcile them.")
844
internal_error = False
846
def __init__(self, branch1, branch2):
847
self.branch1 = branch1
848
self.branch2 = branch2
851
class NotLefthandHistory(BzrError):
853
_fmt = "Supplied history does not follow left-hand parents"
855
internal_error = True
857
def __init__(self, history):
858
BzrError.__init__(self, history=history)
861
class UnrelatedBranches(BzrError):
863
_fmt = ("Branches have no common ancestor, and"
864
" no merge base revision was specified.")
866
internal_error = False
869
class NoCommonAncestor(BzrError):
871
_fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
873
def __init__(self, revision_a, revision_b):
874
self.revision_a = revision_a
875
self.revision_b = revision_b
878
class NoCommonRoot(BzrError):
880
_fmt = ("Revisions are not derived from the same root: "
881
"%(revision_a)s %(revision_b)s.")
883
def __init__(self, revision_a, revision_b):
884
BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
887
class NotAncestor(BzrError):
889
_fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
891
def __init__(self, rev_id, not_ancestor_id):
892
BzrError.__init__(self, rev_id=rev_id,
893
not_ancestor_id=not_ancestor_id)
896
class InstallFailed(BzrError):
898
def __init__(self, revisions):
899
revision_str = ", ".join(str(r) for r in revisions)
900
msg = "Could not install revisions:\n%s" % revision_str
901
BzrError.__init__(self, msg)
902
self.revisions = revisions
905
class AmbiguousBase(BzrError):
907
def __init__(self, bases):
908
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
910
msg = ("The correct base is unclear, because %s are all equally close"
912
BzrError.__init__(self, msg)
916
class NoCommits(BzrError):
918
_fmt = "Branch %(branch)s has no commits."
920
def __init__(self, branch):
921
BzrError.__init__(self, branch=branch)
924
class UnlistableStore(BzrError):
926
def __init__(self, store):
927
BzrError.__init__(self, "Store %s is not listable" % store)
931
class UnlistableBranch(BzrError):
933
def __init__(self, br):
934
BzrError.__init__(self, "Stores for branch %s are not listable" % br)
937
class BoundBranchOutOfDate(BzrError):
939
_fmt = ("Bound branch %(branch)s is out of date"
940
" with master branch %(master)s.")
942
def __init__(self, branch, master):
943
BzrError.__init__(self)
948
class CommitToDoubleBoundBranch(BzrError):
950
_fmt = ("Cannot commit to branch %(branch)s."
951
" It is bound to %(master)s, which is bound to %(remote)s.")
953
def __init__(self, branch, master, remote):
954
BzrError.__init__(self)
960
class OverwriteBoundBranch(BzrError):
962
_fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
964
def __init__(self, branch):
965
BzrError.__init__(self)
969
class BoundBranchConnectionFailure(BzrError):
971
_fmt = ("Unable to connect to target of bound branch %(branch)s"
972
" => %(target)s: %(error)s")
974
def __init__(self, branch, target, error):
975
BzrError.__init__(self)
981
class WeaveError(BzrError):
983
_fmt = "Error in processing weave: %(message)s"
985
def __init__(self, message=None):
986
BzrError.__init__(self)
987
self.message = message
990
class WeaveRevisionAlreadyPresent(WeaveError):
992
_fmt = "Revision {%(revision_id)s} already present in %(weave)s"
994
def __init__(self, revision_id, weave):
996
WeaveError.__init__(self)
997
self.revision_id = revision_id
1001
class WeaveRevisionNotPresent(WeaveError):
1003
_fmt = "Revision {%(revision_id)s} not present in %(weave)s"
1005
def __init__(self, revision_id, weave):
1006
WeaveError.__init__(self)
1007
self.revision_id = revision_id
1011
class WeaveFormatError(WeaveError):
1013
_fmt = "Weave invariant violated: %(what)s"
1015
def __init__(self, what):
1016
WeaveError.__init__(self)
1020
class WeaveParentMismatch(WeaveError):
1022
_fmt = "Parents are mismatched between two revisions."
1025
class WeaveInvalidChecksum(WeaveError):
1027
_fmt = "Text did not match it's checksum: %(message)s"
1030
class WeaveTextDiffers(WeaveError):
1032
_fmt = ("Weaves differ on text content. Revision:"
1033
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1035
def __init__(self, revision_id, weave_a, weave_b):
1036
WeaveError.__init__(self)
1037
self.revision_id = revision_id
1038
self.weave_a = weave_a
1039
self.weave_b = weave_b
1042
class WeaveTextDiffers(WeaveError):
1044
_fmt = ("Weaves differ on text content. Revision:"
1045
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1047
def __init__(self, revision_id, weave_a, weave_b):
1048
WeaveError.__init__(self)
1049
self.revision_id = revision_id
1050
self.weave_a = weave_a
1051
self.weave_b = weave_b
1054
class VersionedFileError(BzrError):
1056
_fmt = "Versioned file error"
1059
class RevisionNotPresent(VersionedFileError):
1061
_fmt = "Revision {%(revision_id)s} not present in %(file_id)s."
1063
def __init__(self, revision_id, file_id):
1064
VersionedFileError.__init__(self)
1065
self.revision_id = revision_id
1066
self.file_id = file_id
1069
class RevisionAlreadyPresent(VersionedFileError):
1071
_fmt = "Revision {%(revision_id)s} already present in %(file_id)s."
1073
def __init__(self, revision_id, file_id):
1074
VersionedFileError.__init__(self)
1075
self.revision_id = revision_id
1076
self.file_id = file_id
1079
class KnitError(BzrError):
1083
internal_error = True
1086
class KnitHeaderError(KnitError):
1088
_fmt = "Knit header error: %(badline)r unexpected for file %(filename)s"
1090
def __init__(self, badline, filename):
1091
KnitError.__init__(self)
1092
self.badline = badline
1093
self.filename = filename
1096
class KnitCorrupt(KnitError):
1098
_fmt = "Knit %(filename)s corrupt: %(how)s"
1100
def __init__(self, filename, how):
1101
KnitError.__init__(self)
1102
self.filename = filename
1106
class KnitIndexUnknownMethod(KnitError):
1107
"""Raised when we don't understand the storage method.
1109
Currently only 'fulltext' and 'line-delta' are supported.
1112
_fmt = ("Knit index %(filename)s does not have a known method"
1113
" in options: %(options)r")
1115
def __init__(self, filename, options):
1116
KnitError.__init__(self)
1117
self.filename = filename
1118
self.options = options
1121
class NoSuchExportFormat(BzrError):
1123
_fmt = "Export format %(format)r not supported"
1125
def __init__(self, format):
1126
BzrError.__init__(self)
1127
self.format = format
1130
class TransportError(BzrError):
1132
_fmt = "Transport error: %(msg)s %(orig_error)s"
1134
def __init__(self, msg=None, orig_error=None):
1135
if msg is None and orig_error is not None:
1136
msg = str(orig_error)
1137
if orig_error is None:
1142
self.orig_error = orig_error
1143
BzrError.__init__(self)
1146
class TooManyConcurrentRequests(BzrError):
1148
_fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
1149
" Be sure to finish_writing and finish_reading on the"
1150
" current request that is open.")
1152
internal_error = True
1154
def __init__(self, medium):
1155
self.medium = medium
1158
class SmartProtocolError(TransportError):
1160
_fmt = "Generic bzr smart protocol error: %(details)s"
1162
def __init__(self, details):
1163
self.details = details
1166
# A set of semi-meaningful errors which can be thrown
1167
class TransportNotPossible(TransportError):
1169
_fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
1172
class ConnectionError(TransportError):
1174
_fmt = "Connection error: %(msg)s %(orig_error)s"
1177
class SocketConnectionError(ConnectionError):
1179
_fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
1181
def __init__(self, host, port=None, msg=None, orig_error=None):
1183
msg = 'Failed to connect to'
1184
if orig_error is None:
1187
orig_error = '; ' + str(orig_error)
1188
ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
1193
self.port = ':%s' % port
1196
class ConnectionReset(TransportError):
1198
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1201
class InvalidRange(TransportError):
1203
_fmt = "Invalid range access in %(path)s at %(offset)s."
1205
def __init__(self, path, offset):
1206
TransportError.__init__(self, ("Invalid range access in %s at %d"
1209
self.offset = offset
1212
class InvalidHttpResponse(TransportError):
1214
_fmt = "Invalid http response for %(path)s: %(msg)s"
1216
def __init__(self, path, msg, orig_error=None):
1218
TransportError.__init__(self, msg, orig_error=orig_error)
1221
class InvalidHttpRange(InvalidHttpResponse):
1223
_fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1225
def __init__(self, path, range, msg):
1227
InvalidHttpResponse.__init__(self, path, msg)
1230
class InvalidHttpContentType(InvalidHttpResponse):
1232
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1234
def __init__(self, path, ctype, msg):
1236
InvalidHttpResponse.__init__(self, path, msg)
1239
class ConflictsInTree(BzrError):
1241
_fmt = "Working tree has conflicts."
1244
class ParseConfigError(BzrError):
1246
def __init__(self, errors, filename):
1247
if filename is None:
1249
message = "Error(s) parsing config file %s:\n%s" % \
1250
(filename, ('\n'.join(e.message for e in errors)))
1251
BzrError.__init__(self, message)
1254
class NoEmailInUsername(BzrError):
1256
_fmt = "%(username)r does not seem to contain a reasonable email address"
1258
def __init__(self, username):
1259
BzrError.__init__(self)
1260
self.username = username
1263
class SigningFailed(BzrError):
1265
_fmt = "Failed to gpg sign data with command %(command_line)r"
1267
def __init__(self, command_line):
1268
BzrError.__init__(self, command_line=command_line)
1271
class WorkingTreeNotRevision(BzrError):
1273
_fmt = ("The working tree for %(basedir)s has changed since"
1274
" the last commit, but weave merge requires that it be"
1277
def __init__(self, tree):
1278
BzrError.__init__(self, basedir=tree.basedir)
1281
class CantReprocessAndShowBase(BzrError):
1283
_fmt = ("Can't reprocess and show base, because reprocessing obscures "
1284
"the relationship of conflicting lines to the base")
1287
class GraphCycleError(BzrError):
1289
_fmt = "Cycle in graph %(graph)r"
1291
def __init__(self, graph):
1292
BzrError.__init__(self)
1296
class WritingCompleted(BzrError):
1298
_fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
1299
"called upon it - accept bytes may not be called anymore.")
1301
internal_error = True
1303
def __init__(self, request):
1304
self.request = request
1307
class WritingNotComplete(BzrError):
1309
_fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
1310
"called upon it - until the write phase is complete no "
1311
"data may be read.")
1313
internal_error = True
1315
def __init__(self, request):
1316
self.request = request
1319
class NotConflicted(BzrError):
1321
_fmt = "File %(filename)s is not conflicted."
1323
def __init__(self, filename):
1324
BzrError.__init__(self)
1325
self.filename = filename
1328
class MediumNotConnected(BzrError):
1330
_fmt = """The medium '%(medium)s' is not connected."""
1332
internal_error = True
1334
def __init__(self, medium):
1335
self.medium = medium
1338
class MustUseDecorated(Exception):
1340
_fmt = "A decorating function has requested its original command be used."
1343
class NoBundleFound(BzrError):
1345
_fmt = "No bundle was found in %(filename)s"
1347
def __init__(self, filename):
1348
BzrError.__init__(self)
1349
self.filename = filename
1352
class BundleNotSupported(BzrError):
1354
_fmt = "Unable to handle bundle version %(version)s: %(msg)s"
1356
def __init__(self, version, msg):
1357
BzrError.__init__(self)
1358
self.version = version
1362
class MissingText(BzrError):
1364
_fmt = ("Branch %(base)s is missing revision"
1365
" %(text_revision)s of %(file_id)s")
1367
def __init__(self, branch, text_revision, file_id):
1368
BzrError.__init__(self)
1369
self.branch = branch
1370
self.base = branch.base
1371
self.text_revision = text_revision
1372
self.file_id = file_id
1375
class DuplicateKey(BzrError):
1377
_fmt = "Key %(key)s is already present in map"
1380
class MalformedTransform(BzrError):
1382
_fmt = "Tree transform is malformed %(conflicts)r"
1385
class NoFinalPath(BzrError):
1387
_fmt = ("No final name for trans_id %(trans_id)r\n"
1388
"file-id: %(file_id)r\n"
1389
"root trans-id: %(root_trans_id)r\n")
1391
def __init__(self, trans_id, transform):
1392
self.trans_id = trans_id
1393
self.file_id = transform.final_file_id(trans_id)
1394
self.root_trans_id = transform.root
1397
class BzrBadParameter(BzrError):
1399
_fmt = "Bad parameter: %(param)r"
1401
# This exception should never be thrown, but it is a base class for all
1402
# parameter-to-function errors.
1404
def __init__(self, param):
1405
BzrError.__init__(self)
1409
class BzrBadParameterNotUnicode(BzrBadParameter):
1411
_fmt = "Parameter %(param)s is neither unicode nor utf8."
1414
class ReusingTransform(BzrError):
1416
_fmt = "Attempt to reuse a transform that has already been applied."
1419
class CantMoveRoot(BzrError):
1421
_fmt = "Moving the root directory is not supported at this time"
1424
class BzrMoveFailedError(BzrError):
1426
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1428
def __init__(self, from_path='', to_path='', extra=None):
1429
BzrError.__init__(self)
1431
self.extra = ': ' + str(extra)
1435
has_from = len(from_path) > 0
1436
has_to = len(to_path) > 0
1438
self.from_path = osutils.splitpath(from_path)[-1]
1443
self.to_path = osutils.splitpath(to_path)[-1]
1448
if has_from and has_to:
1449
self.operator = " =>"
1451
self.from_path = "from " + from_path
1453
self.operator = "to"
1455
self.operator = "file"
1458
class BzrRenameFailedError(BzrMoveFailedError):
1460
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1462
def __init__(self, from_path, to_path, extra=None):
1463
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1466
class BzrBadParameterNotString(BzrBadParameter):
1468
_fmt = "Parameter %(param)s is not a string or unicode string."
1471
class BzrBadParameterMissing(BzrBadParameter):
1473
_fmt = "Parameter $(param)s is required but not present."
1476
class BzrBadParameterUnicode(BzrBadParameter):
1478
_fmt = ("Parameter %(param)s is unicode but"
1479
" only byte-strings are permitted.")
1482
class BzrBadParameterContainsNewline(BzrBadParameter):
1484
_fmt = "Parameter %(param)s contains a newline."
1487
class DependencyNotPresent(BzrError):
1489
_fmt = 'Unable to import library "%(library)s": %(error)s'
1491
def __init__(self, library, error):
1492
BzrError.__init__(self, library=library, error=error)
1495
class ParamikoNotPresent(DependencyNotPresent):
1497
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
1499
def __init__(self, error):
1500
DependencyNotPresent.__init__(self, 'paramiko', error)
1503
class PointlessMerge(BzrError):
1505
_fmt = "Nothing to merge."
1508
class UninitializableFormat(BzrError):
1510
_fmt = "Format %(format)s cannot be initialised by this version of bzr."
1512
def __init__(self, format):
1513
BzrError.__init__(self)
1514
self.format = format
1517
class BadConversionTarget(BzrError):
1519
_fmt = "Cannot convert to format %(format)s. %(problem)s"
1521
def __init__(self, problem, format):
1522
BzrError.__init__(self)
1523
self.problem = problem
1524
self.format = format
1527
class NoDiff(BzrError):
1529
_fmt = "Diff is not installed on this machine: %(msg)s"
1531
def __init__(self, msg):
1532
BzrError.__init__(self, msg=msg)
1535
class NoDiff3(BzrError):
1537
_fmt = "Diff3 is not installed on this machine."
1540
class ExistingLimbo(BzrError):
1542
_fmt = """This tree contains left-over files from a failed operation.
1543
Please examine %(limbo_dir)s to see if it contains any files you wish to
1544
keep, and delete it when you are done."""
1546
def __init__(self, limbo_dir):
1547
BzrError.__init__(self)
1548
self.limbo_dir = limbo_dir
1551
class ImmortalLimbo(BzrError):
1553
_fmt = """Unable to delete transform temporary directory $(limbo_dir)s.
1554
Please examine %(limbo_dir)s to see if it contains any files you wish to
1555
keep, and delete it when you are done."""
1557
def __init__(self, limbo_dir):
1558
BzrError.__init__(self)
1559
self.limbo_dir = limbo_dir
1562
class OutOfDateTree(BzrError):
1564
_fmt = "Working tree is out of date, please run 'bzr update'."
1566
def __init__(self, tree):
1567
BzrError.__init__(self)
1571
class MergeModifiedFormatError(BzrError):
1573
_fmt = "Error in merge modified format"
1576
class ConflictFormatError(BzrError):
1578
_fmt = "Format error in conflict listings"
1581
class CorruptRepository(BzrError):
1583
_fmt = ("An error has been detected in the repository %(repo_path)s.\n"
1584
"Please run bzr reconcile on this repository.")
1586
def __init__(self, repo):
1587
BzrError.__init__(self)
1588
self.repo_path = repo.bzrdir.root_transport.base
1591
class UpgradeRequired(BzrError):
1593
_fmt = "To use this feature you must upgrade your branch at %(path)s."
1595
def __init__(self, path):
1596
BzrError.__init__(self)
1600
class LocalRequiresBoundBranch(BzrError):
1602
_fmt = "Cannot perform local-only commits on unbound branches."
1605
class MissingProgressBarFinish(BzrError):
1607
_fmt = "A nested progress bar was not 'finished' correctly."
1610
class InvalidProgressBarType(BzrError):
1612
_fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
1613
" is not a supported type Select one of: %(valid_types)s")
1615
def __init__(self, bar_type, valid_types):
1616
BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1619
class UnsupportedOperation(BzrError):
1621
_fmt = ("The method %(mname)s is not supported on"
1622
" objects of type %(tname)s.")
1624
def __init__(self, method, method_self):
1625
self.method = method
1626
self.mname = method.__name__
1627
self.tname = type(method_self).__name__
1630
class CannotSetRevisionId(UnsupportedOperation):
1631
"""Raised when a commit is attempting to set a revision id but cant."""
1634
class NonAsciiRevisionId(UnsupportedOperation):
1635
"""Raised when a commit is attempting to set a non-ascii revision id
1640
class BinaryFile(BzrError):
1642
_fmt = "File is binary but should be text."
1645
class IllegalPath(BzrError):
1647
_fmt = "The path %(path)s is not permitted on this platform"
1649
def __init__(self, path):
1650
BzrError.__init__(self)
1654
class TestamentMismatch(BzrError):
1656
_fmt = """Testament did not match expected value.
1657
For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
1660
def __init__(self, revision_id, expected, measured):
1661
self.revision_id = revision_id
1662
self.expected = expected
1663
self.measured = measured
1666
class NotABundle(BzrError):
1668
_fmt = "Not a bzr revision-bundle: %(text)r"
1670
def __init__(self, text):
1671
BzrError.__init__(self)
1675
class BadBundle(BzrError):
1677
_fmt = "Bad bzr revision-bundle: %(text)r"
1679
def __init__(self, text):
1680
BzrError.__init__(self)
1684
class MalformedHeader(BadBundle):
1686
_fmt = "Malformed bzr revision-bundle header: %(text)r"
1689
class MalformedPatches(BadBundle):
1691
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
1694
class MalformedFooter(BadBundle):
1696
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
1699
class UnsupportedEOLMarker(BadBundle):
1701
_fmt = "End of line marker was not \\n in bzr revision-bundle"
1704
# XXX: BadBundle's constructor assumes there's explanatory text,
1705
# but for this there is not
1706
BzrError.__init__(self)
1709
class IncompatibleBundleFormat(BzrError):
1711
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
1713
def __init__(self, bundle_format, other):
1714
BzrError.__init__(self)
1715
self.bundle_format = bundle_format
1719
class BadInventoryFormat(BzrError):
1721
_fmt = "Root class for inventory serialization errors"
1724
class UnexpectedInventoryFormat(BadInventoryFormat):
1726
_fmt = "The inventory was not in the expected format:\n %(msg)s"
1728
def __init__(self, msg):
1729
BadInventoryFormat.__init__(self, msg=msg)
1732
class NoSmartMedium(BzrError):
1734
_fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
1735
internal_error = True
1737
def __init__(self, transport):
1738
self.transport = transport
1741
class NoSmartServer(NotBranchError):
1743
_fmt = "No smart server available at %(url)s"
1745
def __init__(self, url):
1749
class UnknownSSH(BzrError):
1751
_fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
1753
def __init__(self, vendor):
1754
BzrError.__init__(self)
1755
self.vendor = vendor
1758
class SSHVendorNotFound(BzrError):
1760
_fmt = ("Don't know how to handle SSH connections."
1761
" Please set BZR_SSH environment variable.")
1764
class GhostRevisionUnusableHere(BzrError):
1766
_fmt = "Ghost revision {%(revision_id)s} cannot be used here."
1768
def __init__(self, revision_id):
1769
BzrError.__init__(self)
1770
self.revision_id = revision_id
1773
class IllegalUseOfScopeReplacer(BzrError):
1775
_fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
1776
" %(msg)s%(extra)s")
1778
internal_error = True
1780
def __init__(self, name, msg, extra=None):
1781
BzrError.__init__(self)
1785
self.extra = ': ' + str(extra)
1790
class InvalidImportLine(BzrError):
1792
_fmt = "Not a valid import statement: %(msg)\n%(text)s"
1794
internal_error = True
1796
def __init__(self, text, msg):
1797
BzrError.__init__(self)
1802
class ImportNameCollision(BzrError):
1804
_fmt = ("Tried to import an object to the same name as"
1805
" an existing object. %(name)s")
1807
internal_error = True
1809
def __init__(self, name):
1810
BzrError.__init__(self)
1814
class NoSuchTag(BzrError):
1816
_fmt = "No such tag: %(tag_name)s"
1818
def __init__(self, tag_name):
1819
self.tag_name = tag_name
1822
class TagsNotSupported(BzrError):
1824
_fmt = ("Tags not supported by %(branch)s;"
1825
" you may be able to use bzr upgrade.")
1827
def __init__(self, branch):
1828
self.branch = branch
1831
class TagAlreadyExists(BzrError):
1833
_fmt = "Tag %(tag_name)s already exists."
1835
def __init__(self, tag_name):
1836
self.tag_name = tag_name