1
# Copyright (C) 2005, 2006, 2007 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
# return codes from the bzr program
50
EXIT_INTERNAL_ERROR = 4
53
class BzrError(StandardError):
55
Base class for errors raised by bzrlib.
57
:cvar internal_error: if True this was probably caused by a bzr bug and
58
should be displayed with a traceback; if False (or absent) this was
59
probably a user or environment error and they don't need the gory details.
60
(That can be overridden by -Derror on the command line.)
62
:cvar _fmt: Format string to display the error; this is expanded
63
by the instance's dict.
66
internal_error = False
68
def __init__(self, msg=None, **kwds):
69
"""Construct a new BzrError.
71
There are two alternative forms for constructing these objects.
72
Either a preformatted string may be passed, or a set of named
73
arguments can be given. The first is for generic "user" errors which
74
are not intended to be caught and so do not need a specific subclass.
75
The second case is for use with subclasses that provide a _fmt format
76
string to print the arguments.
78
Keyword arguments are taken as parameters to the error, which can
79
be inserted into the format string template. It's recommended
80
that subclasses override the __init__ method to require specific
83
:param msg: If given, this is the literal complete text for the error,
84
not subject to expansion.
86
StandardError.__init__(self)
88
# I was going to deprecate this, but it actually turns out to be
89
# quite handy - mbp 20061103.
90
self._preformatted_string = msg
92
self._preformatted_string = None
93
for key, value in kwds.items():
94
setattr(self, key, value)
97
s = getattr(self, '_preformatted_string', None)
99
# contains a preformatted message; must be cast to plain str
102
fmt = self._get_format_string()
104
d = dict(self.__dict__)
105
# special case: python2.5 puts the 'message' attribute in a
106
# slot, so it isn't seen in __dict__
107
d['message'] = getattr(self, 'message', 'no message')
109
# __str__() should always return a 'str' object
110
# never a 'unicode' object.
111
if isinstance(s, unicode):
112
return s.encode('utf8')
114
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
115
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
116
% (self.__class__.__name__,
118
getattr(self, '_fmt', None),
121
def _get_format_string(self):
122
"""Return format string for this exception or None"""
123
fmt = getattr(self, '_fmt', None)
126
fmt = getattr(self, '__doc__', None)
128
symbol_versioning.warn("%s uses its docstring as a format, "
129
"it should use _fmt instead" % self.__class__.__name__,
132
return 'Unprintable exception %s: dict=%r, fmt=%r' \
133
% (self.__class__.__name__,
135
getattr(self, '_fmt', None),
139
class InternalBzrError(BzrError):
140
"""Base class for errors that are internal in nature.
142
This is a convenience class for errors that are internal. The
143
internal_error attribute can still be altered in subclasses, if needed.
144
Using this class is simply an easy way to get internal errors.
147
internal_error = True
150
class BzrNewError(BzrError):
151
"""Deprecated error base class."""
152
# base classes should override the docstring with their human-
153
# readable explanation
155
def __init__(self, *args, **kwds):
156
# XXX: Use the underlying BzrError to always generate the args
157
# attribute if it doesn't exist. We can't use super here, because
158
# exceptions are old-style classes in python2.4 (but new in 2.5).
160
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
161
'please convert %s to use BzrError instead'
162
% self.__class__.__name__,
165
BzrError.__init__(self, *args)
166
for key, value in kwds.items():
167
setattr(self, key, value)
171
# __str__() should always return a 'str' object
172
# never a 'unicode' object.
173
s = self.__doc__ % self.__dict__
174
if isinstance(s, unicode):
175
return s.encode('utf8')
177
except (TypeError, NameError, ValueError, KeyError), e:
178
return 'Unprintable exception %s(%r): %r' \
179
% (self.__class__.__name__,
183
class AlreadyBuilding(BzrError):
185
_fmt = "The tree builder is already building a tree."
188
class BzrCheckError(InternalBzrError):
190
_fmt = "Internal check failed: %(message)s"
192
def __init__(self, message):
193
BzrError.__init__(self)
194
self.message = message
197
class DisabledMethod(InternalBzrError):
199
_fmt = "The smart server method '%(class_name)s' is disabled."
201
def __init__(self, class_name):
202
BzrError.__init__(self)
203
self.class_name = class_name
206
class IncompatibleAPI(BzrError):
208
_fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
209
'It supports versions "%(minimum)s" to "%(current)s".'
211
def __init__(self, api, wanted, minimum, current):
214
self.minimum = minimum
215
self.current = current
218
class InProcessTransport(BzrError):
220
_fmt = "The transport '%(transport)s' is only accessible within this " \
223
def __init__(self, transport):
224
self.transport = transport
227
class InvalidEntryName(InternalBzrError):
229
_fmt = "Invalid entry name: %(name)s"
231
def __init__(self, name):
232
BzrError.__init__(self)
236
class InvalidRevisionNumber(BzrError):
238
_fmt = "Invalid revision number %(revno)s"
240
def __init__(self, revno):
241
BzrError.__init__(self)
245
class InvalidRevisionId(BzrError):
247
_fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
249
def __init__(self, revision_id, branch):
250
# branch can be any string or object with __str__ defined
251
BzrError.__init__(self)
252
self.revision_id = revision_id
256
class ReservedId(BzrError):
258
_fmt = "Reserved revision-id {%(revision_id)s}"
260
def __init__(self, revision_id):
261
self.revision_id = revision_id
264
class RootMissing(InternalBzrError):
266
_fmt = ("The root entry of a tree must be the first entry supplied to "
267
"record_entry_contents.")
270
class NoHelpTopic(BzrError):
272
_fmt = ("No help could be found for '%(topic)s'. "
273
"Please use 'bzr help topics' to obtain a list of topics.")
275
def __init__(self, topic):
279
class NoSuchId(BzrError):
281
_fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
283
def __init__(self, tree, file_id):
284
BzrError.__init__(self)
285
self.file_id = file_id
289
class NoSuchIdInRepository(NoSuchId):
291
_fmt = ('The file id "%(file_id)s" is not present in the repository'
294
def __init__(self, repository, file_id):
295
BzrError.__init__(self, repository=repository, file_id=file_id)
298
class InventoryModified(InternalBzrError):
300
_fmt = ("The current inventory for the tree %(tree)r has been modified,"
301
" so a clean inventory cannot be read without data loss.")
303
def __init__(self, tree):
307
class NoWorkingTree(BzrError):
309
_fmt = 'No WorkingTree exists for "%(base)s".'
311
def __init__(self, base):
312
BzrError.__init__(self)
316
class NotBuilding(BzrError):
318
_fmt = "Not currently building a tree."
321
class NotLocalUrl(BzrError):
323
_fmt = "%(url)s is not a local path."
325
def __init__(self, url):
329
class WorkingTreeAlreadyPopulated(InternalBzrError):
331
_fmt = 'Working tree already populated in "%(base)s"'
333
def __init__(self, base):
337
class BzrCommandError(BzrError):
338
"""Error from user command"""
340
# Error from malformed user command; please avoid raising this as a
341
# generic exception not caused by user input.
343
# I think it's a waste of effort to differentiate between errors that
344
# are not intended to be caught anyway. UI code need not subclass
345
# BzrCommandError, and non-UI code should not throw a subclass of
346
# BzrCommandError. ADHB 20051211
347
def __init__(self, msg):
348
# Object.__str__() must return a real string
349
# returning a Unicode string is a python error.
350
if isinstance(msg, unicode):
351
self.msg = msg.encode('utf8')
359
class NotWriteLocked(BzrError):
361
_fmt = """%(not_locked)r is not write locked but needs to be."""
363
def __init__(self, not_locked):
364
self.not_locked = not_locked
367
class BzrOptionError(BzrCommandError):
369
_fmt = "Error in command line options"
372
class BadIndexFormatSignature(BzrError):
374
_fmt = "%(value)s is not an index of type %(_type)s."
376
def __init__(self, value, _type):
377
BzrError.__init__(self)
382
class BadIndexData(BzrError):
384
_fmt = "Error in data for index %(value)s."
386
def __init__(self, value):
387
BzrError.__init__(self)
391
class BadIndexDuplicateKey(BzrError):
393
_fmt = "The key '%(key)s' is already in index '%(index)s'."
395
def __init__(self, key, index):
396
BzrError.__init__(self)
401
class BadIndexKey(BzrError):
403
_fmt = "The key '%(key)s' is not a valid key."
405
def __init__(self, key):
406
BzrError.__init__(self)
410
class BadIndexOptions(BzrError):
412
_fmt = "Could not parse options for index %(value)s."
414
def __init__(self, value):
415
BzrError.__init__(self)
419
class BadIndexValue(BzrError):
421
_fmt = "The value '%(value)s' is not a valid value."
423
def __init__(self, value):
424
BzrError.__init__(self)
428
class BadOptionValue(BzrError):
430
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
432
def __init__(self, name, value):
433
BzrError.__init__(self, name=name, value=value)
436
class StrictCommitFailed(BzrError):
438
_fmt = "Commit refused because there are unknown files in the tree"
441
# XXX: Should be unified with TransportError; they seem to represent the
443
# RBC 20060929: I think that unifiying with TransportError would be a mistake
444
# - this is finer than a TransportError - and more useful as such. It
445
# differentiates between 'transport has failed' and 'operation on a transport
447
class PathError(BzrError):
449
_fmt = "Generic path error: %(path)r%(extra)s)"
451
def __init__(self, path, extra=None):
452
BzrError.__init__(self)
455
self.extra = ': ' + str(extra)
460
class NoSuchFile(PathError):
462
_fmt = "No such file: %(path)r%(extra)s"
465
class FileExists(PathError):
467
_fmt = "File exists: %(path)r%(extra)s"
470
class RenameFailedFilesExist(BzrError):
471
"""Used when renaming and both source and dest exist."""
473
_fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
474
" (Use --after to tell bzr about a rename that has already"
475
" happened)%(extra)s")
477
def __init__(self, source, dest, extra=None):
478
BzrError.__init__(self)
479
self.source = str(source)
480
self.dest = str(dest)
482
self.extra = ' ' + str(extra)
487
class NotADirectory(PathError):
489
_fmt = '"%(path)s" is not a directory %(extra)s'
492
class NotInWorkingDirectory(PathError):
494
_fmt = '"%(path)s" is not in the working directory %(extra)s'
497
class DirectoryNotEmpty(PathError):
499
_fmt = 'Directory not empty: "%(path)s"%(extra)s'
502
class ReadingCompleted(InternalBzrError):
504
_fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
505
"called upon it - the request has been completed and no more "
508
def __init__(self, request):
509
self.request = request
512
class ResourceBusy(PathError):
514
_fmt = 'Device or resource busy: "%(path)s"%(extra)s'
517
class PermissionDenied(PathError):
519
_fmt = 'Permission denied: "%(path)s"%(extra)s'
522
class InvalidURL(PathError):
524
_fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
527
class InvalidURLJoin(PathError):
529
_fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
531
def __init__(self, reason, base, join_args):
534
self.join_args = join_args
535
PathError.__init__(self, base, reason)
538
class UnknownHook(BzrError):
540
_fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
542
def __init__(self, hook_type, hook_name):
543
BzrError.__init__(self)
544
self.type = hook_type
545
self.hook = hook_name
548
class UnsupportedProtocol(PathError):
550
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
552
def __init__(self, url, extra):
553
PathError.__init__(self, url, extra=extra)
556
class ReadError(PathError):
558
_fmt = """Error reading from %(path)r."""
561
class ShortReadvError(PathError):
563
_fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
564
' at %(offset)s for "%(path)s"%(extra)s')
566
internal_error = True
568
def __init__(self, path, offset, length, actual, extra=None):
569
PathError.__init__(self, path, extra=extra)
575
class PathNotChild(PathError):
577
_fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
579
internal_error = True
581
def __init__(self, path, base, extra=None):
582
BzrError.__init__(self)
586
self.extra = ': ' + str(extra)
591
class InvalidNormalization(PathError):
593
_fmt = 'Path "%(path)s" is not unicode normalized'
596
# TODO: This is given a URL; we try to unescape it but doing that from inside
597
# the exception object is a bit undesirable.
598
# TODO: Probably this behavior of should be a common superclass
599
class NotBranchError(PathError):
601
_fmt = 'Not a branch: "%(path)s".'
603
def __init__(self, path):
604
import bzrlib.urlutils as urlutils
605
self.path = urlutils.unescape_for_display(path, 'ascii')
608
class NoSubmitBranch(PathError):
610
_fmt = 'No submit branch available for branch "%(path)s"'
612
def __init__(self, branch):
613
import bzrlib.urlutils as urlutils
614
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
617
class AlreadyBranchError(PathError):
619
_fmt = 'Already a branch: "%(path)s".'
622
class BranchExistsWithoutWorkingTree(PathError):
624
_fmt = 'Directory contains a branch, but no working tree \
625
(use bzr checkout if you wish to build a working tree): "%(path)s"'
628
class AtomicFileAlreadyClosed(PathError):
630
_fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
633
def __init__(self, path, function):
634
PathError.__init__(self, path=path, extra=None)
635
self.function = function
638
class InaccessibleParent(PathError):
640
_fmt = ('Parent not accessible given base "%(base)s" and'
641
' relative path "%(path)s"')
643
def __init__(self, path, base):
644
PathError.__init__(self, path)
648
class NoRepositoryPresent(BzrError):
650
_fmt = 'No repository present: "%(path)s"'
651
def __init__(self, bzrdir):
652
BzrError.__init__(self)
653
self.path = bzrdir.transport.clone('..').base
656
class FileInWrongBranch(BzrError):
658
_fmt = 'File "%(path)s" in not in branch %(branch_base)s.'
660
def __init__(self, branch, path):
661
BzrError.__init__(self)
663
self.branch_base = branch.base
667
class UnsupportedFormatError(BzrError):
669
_fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
672
class UnknownFormatError(BzrError):
674
_fmt = "Unknown branch format: %(format)r"
677
class IncompatibleFormat(BzrError):
679
_fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
681
def __init__(self, format, bzrdir_format):
682
BzrError.__init__(self)
684
self.bzrdir = bzrdir_format
687
class IncompatibleRepositories(BzrError):
689
_fmt = "Repository %(target)s is not compatible with repository"\
692
def __init__(self, source, target):
693
BzrError.__init__(self, target=target, source=source)
696
class IncompatibleRevision(BzrError):
698
_fmt = "Revision is not compatible with %(repo_format)s"
700
def __init__(self, repo_format):
701
BzrError.__init__(self)
702
self.repo_format = repo_format
705
class AlreadyVersionedError(BzrError):
706
"""Used when a path is expected not to be versioned, but it is."""
708
_fmt = "%(context_info)s%(path)s is already versioned."
710
def __init__(self, path, context_info=None):
711
"""Construct a new AlreadyVersionedError.
713
:param path: This is the path which is versioned,
714
which should be in a user friendly form.
715
:param context_info: If given, this is information about the context,
716
which could explain why this is expected to not be versioned.
718
BzrError.__init__(self)
720
if context_info is None:
721
self.context_info = ''
723
self.context_info = context_info + ". "
726
class NotVersionedError(BzrError):
727
"""Used when a path is expected to be versioned, but it is not."""
729
_fmt = "%(context_info)s%(path)s is not versioned."
731
def __init__(self, path, context_info=None):
732
"""Construct a new NotVersionedError.
734
:param path: This is the path which is not versioned,
735
which should be in a user friendly form.
736
:param context_info: If given, this is information about the context,
737
which could explain why this is expected to be versioned.
739
BzrError.__init__(self)
741
if context_info is None:
742
self.context_info = ''
744
self.context_info = context_info + ". "
747
class PathsNotVersionedError(BzrError):
748
"""Used when reporting several paths which are not versioned"""
750
_fmt = "Path(s) are not versioned: %(paths_as_string)s"
752
def __init__(self, paths):
753
from bzrlib.osutils import quotefn
754
BzrError.__init__(self)
756
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
759
class PathsDoNotExist(BzrError):
761
_fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
763
# used when reporting that paths are neither versioned nor in the working
766
def __init__(self, paths, extra=None):
768
from bzrlib.osutils import quotefn
769
BzrError.__init__(self)
771
self.paths_as_string = ' '.join([quotefn(p) for p in paths])
773
self.extra = ': ' + str(extra)
778
class BadFileKindError(BzrError):
780
_fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
782
def __init__(self, filename, kind):
783
BzrError.__init__(self, filename=filename, kind=kind)
786
class ForbiddenControlFileError(BzrError):
788
_fmt = 'Cannot operate on "%(filename)s" because it is a control file'
791
class LockError(InternalBzrError):
793
_fmt = "Lock error: %(msg)s"
795
# All exceptions from the lock/unlock functions should be from
796
# this exception class. They will be translated as necessary. The
797
# original exception is available as e.original_error
799
# New code should prefer to raise specific subclasses
800
def __init__(self, message):
801
# Python 2.5 uses a slot for StandardError.message,
802
# so use a different variable name. We now work around this in
803
# BzrError.__str__, but this member name is kept for compatability.
807
class LockActive(LockError):
809
_fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
811
internal_error = False
813
def __init__(self, lock_description):
814
self.lock_description = lock_description
817
class CommitNotPossible(LockError):
819
_fmt = "A commit was attempted but we do not have a write lock open."
825
class AlreadyCommitted(LockError):
827
_fmt = "A rollback was requested, but is not able to be accomplished."
833
class ReadOnlyError(LockError):
835
_fmt = "A write attempt was made in a read only transaction on %(obj)s"
837
# TODO: There should also be an error indicating that you need a write
838
# lock and don't have any lock at all... mbp 20070226
840
def __init__(self, obj):
844
class ReadOnlyLockError(LockError):
846
_fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
848
@symbol_versioning.deprecated_method(symbol_versioning.zero_ninetytwo)
849
def __init__(self, fname, msg):
850
LockError.__init__(self, '')
855
class LockFailed(LockError):
857
internal_error = False
859
_fmt = "Cannot lock %(lock)s: %(why)s"
861
def __init__(self, lock, why):
862
LockError.__init__(self, '')
867
class OutSideTransaction(BzrError):
869
_fmt = ("A transaction related operation was attempted after"
870
" the transaction finished.")
873
class ObjectNotLocked(LockError):
875
_fmt = "%(obj)r is not locked"
877
# this can indicate that any particular object is not locked; see also
878
# LockNotHeld which means that a particular *lock* object is not held by
879
# the caller -- perhaps they should be unified.
880
def __init__(self, obj):
884
class ReadOnlyObjectDirtiedError(ReadOnlyError):
886
_fmt = "Cannot change object %(obj)r in read only transaction"
888
def __init__(self, obj):
892
class UnlockableTransport(LockError):
894
internal_error = False
896
_fmt = "Cannot lock: transport is read only: %(transport)s"
898
def __init__(self, transport):
899
self.transport = transport
902
class LockContention(LockError):
904
_fmt = 'Could not acquire lock "%(lock)s"'
905
# TODO: show full url for lock, combining the transport and relative
908
internal_error = False
910
def __init__(self, lock):
914
class LockBroken(LockError):
916
_fmt = ("Lock was broken while still open: %(lock)s"
917
" - check storage consistency!")
919
internal_error = False
921
def __init__(self, lock):
925
class LockBreakMismatch(LockError):
927
_fmt = ("Lock was released and re-acquired before being broken:"
928
" %(lock)s: held by %(holder)r, wanted to break %(target)r")
930
internal_error = False
932
def __init__(self, lock, holder, target):
938
class LockNotHeld(LockError):
940
_fmt = "Lock not held: %(lock)s"
942
internal_error = False
944
def __init__(self, lock):
948
class TokenLockingNotSupported(LockError):
950
_fmt = "The object %(obj)s does not support token specifying a token when locking."
952
def __init__(self, obj):
956
class TokenMismatch(LockBroken):
958
_fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
960
internal_error = True
962
def __init__(self, given_token, lock_token):
963
self.given_token = given_token
964
self.lock_token = lock_token
967
class PointlessCommit(BzrError):
969
_fmt = "No changes to commit"
972
class CannotCommitSelectedFileMerge(BzrError):
974
_fmt = 'Selected-file commit of merges is not supported yet:'\
975
' files %(files_str)s'
977
def __init__(self, files):
978
files_str = ', '.join(files)
979
BzrError.__init__(self, files=files, files_str=files_str)
982
class BadCommitMessageEncoding(BzrError):
984
_fmt = 'The specified commit message contains characters unsupported by '\
985
'the current encoding.'
988
class UpgradeReadonly(BzrError):
990
_fmt = "Upgrade URL cannot work with readonly URLs."
993
class UpToDateFormat(BzrError):
995
_fmt = "The branch format %(format)s is already at the most recent format."
997
def __init__(self, format):
998
BzrError.__init__(self)
1002
class StrictCommitFailed(Exception):
1004
_fmt = "Commit refused because there are unknowns in the tree."
1007
class NoSuchRevision(InternalBzrError):
1009
_fmt = "%(branch)s has no revision %(revision)s"
1011
def __init__(self, branch, revision):
1012
# 'branch' may sometimes be an internal object like a KnitRevisionStore
1013
BzrError.__init__(self, branch=branch, revision=revision)
1016
# zero_ninetyone: this exception is no longer raised and should be removed
1017
class NotLeftParentDescendant(InternalBzrError):
1019
_fmt = ("Revision %(old_revision)s is not the left parent of"
1020
" %(new_revision)s, but branch %(branch_location)s expects this")
1022
def __init__(self, branch, old_revision, new_revision):
1023
BzrError.__init__(self, branch_location=branch.base,
1024
old_revision=old_revision,
1025
new_revision=new_revision)
1028
class RangeInChangeOption(BzrError):
1030
_fmt = "Option --change does not accept revision ranges"
1033
class NoSuchRevisionSpec(BzrError):
1035
_fmt = "No namespace registered for string: %(spec)r"
1037
def __init__(self, spec):
1038
BzrError.__init__(self, spec=spec)
1041
class NoSuchRevisionInTree(NoSuchRevision):
1042
"""When using Tree.revision_tree, and the revision is not accessible."""
1044
_fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
1046
def __init__(self, tree, revision_id):
1047
BzrError.__init__(self)
1049
self.revision_id = revision_id
1052
class InvalidRevisionSpec(BzrError):
1054
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1055
" %(branch)s%(extra)s")
1057
def __init__(self, spec, branch, extra=None):
1058
BzrError.__init__(self, branch=branch, spec=spec)
1060
self.extra = '\n' + str(extra)
1065
class HistoryMissing(BzrError):
1067
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1070
class AppendRevisionsOnlyViolation(BzrError):
1072
_fmt = ('Operation denied because it would change the main history,'
1073
' which is not permitted by the append_revisions_only setting on'
1074
' branch "%(location)s".')
1076
def __init__(self, location):
1077
import bzrlib.urlutils as urlutils
1078
location = urlutils.unescape_for_display(location, 'ascii')
1079
BzrError.__init__(self, location=location)
1082
class DivergedBranches(BzrError):
1084
_fmt = ("These branches have diverged."
1085
" Use the merge command to reconcile them.")
1087
def __init__(self, branch1, branch2):
1088
self.branch1 = branch1
1089
self.branch2 = branch2
1092
class NotLefthandHistory(InternalBzrError):
1094
_fmt = "Supplied history does not follow left-hand parents"
1096
def __init__(self, history):
1097
BzrError.__init__(self, history=history)
1100
class UnrelatedBranches(BzrError):
1102
_fmt = ("Branches have no common ancestor, and"
1103
" no merge base revision was specified.")
1106
class NoCommonAncestor(BzrError):
1108
_fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
1110
def __init__(self, revision_a, revision_b):
1111
self.revision_a = revision_a
1112
self.revision_b = revision_b
1115
class NoCommonRoot(BzrError):
1117
_fmt = ("Revisions are not derived from the same root: "
1118
"%(revision_a)s %(revision_b)s.")
1120
def __init__(self, revision_a, revision_b):
1121
BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
1124
class NotAncestor(BzrError):
1126
_fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
1128
def __init__(self, rev_id, not_ancestor_id):
1129
BzrError.__init__(self, rev_id=rev_id,
1130
not_ancestor_id=not_ancestor_id)
1133
class InstallFailed(BzrError):
1135
def __init__(self, revisions):
1136
revision_str = ", ".join(str(r) for r in revisions)
1137
msg = "Could not install revisions:\n%s" % revision_str
1138
BzrError.__init__(self, msg)
1139
self.revisions = revisions
1142
class AmbiguousBase(BzrError):
1144
def __init__(self, bases):
1145
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1147
msg = ("The correct base is unclear, because %s are all equally close"
1149
BzrError.__init__(self, msg)
1153
class NoCommits(BzrError):
1155
_fmt = "Branch %(branch)s has no commits."
1157
def __init__(self, branch):
1158
BzrError.__init__(self, branch=branch)
1161
class UnlistableStore(BzrError):
1163
def __init__(self, store):
1164
BzrError.__init__(self, "Store %s is not listable" % store)
1168
class UnlistableBranch(BzrError):
1170
def __init__(self, br):
1171
BzrError.__init__(self, "Stores for branch %s are not listable" % br)
1174
class BoundBranchOutOfDate(BzrError):
1176
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1179
def __init__(self, branch, master):
1180
BzrError.__init__(self)
1181
self.branch = branch
1182
self.master = master
1185
class CommitToDoubleBoundBranch(BzrError):
1187
_fmt = ("Cannot commit to branch %(branch)s."
1188
" It is bound to %(master)s, which is bound to %(remote)s.")
1190
def __init__(self, branch, master, remote):
1191
BzrError.__init__(self)
1192
self.branch = branch
1193
self.master = master
1194
self.remote = remote
1197
class OverwriteBoundBranch(BzrError):
1199
_fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
1201
def __init__(self, branch):
1202
BzrError.__init__(self)
1203
self.branch = branch
1206
class BoundBranchConnectionFailure(BzrError):
1208
_fmt = ("Unable to connect to target of bound branch %(branch)s"
1209
" => %(target)s: %(error)s")
1211
def __init__(self, branch, target, error):
1212
BzrError.__init__(self)
1213
self.branch = branch
1214
self.target = target
1218
class WeaveError(BzrError):
1220
_fmt = "Error in processing weave: %(message)s"
1222
def __init__(self, message=None):
1223
BzrError.__init__(self)
1224
self.message = message
1227
class WeaveRevisionAlreadyPresent(WeaveError):
1229
_fmt = "Revision {%(revision_id)s} already present in %(weave)s"
1231
def __init__(self, revision_id, weave):
1233
WeaveError.__init__(self)
1234
self.revision_id = revision_id
1238
class WeaveRevisionNotPresent(WeaveError):
1240
_fmt = "Revision {%(revision_id)s} not present in %(weave)s"
1242
def __init__(self, revision_id, weave):
1243
WeaveError.__init__(self)
1244
self.revision_id = revision_id
1248
class WeaveFormatError(WeaveError):
1250
_fmt = "Weave invariant violated: %(what)s"
1252
def __init__(self, what):
1253
WeaveError.__init__(self)
1257
class WeaveParentMismatch(WeaveError):
1259
_fmt = "Parents are mismatched between two revisions. %(message)s"
1262
class WeaveInvalidChecksum(WeaveError):
1264
_fmt = "Text did not match it's checksum: %(message)s"
1267
class WeaveTextDiffers(WeaveError):
1269
_fmt = ("Weaves differ on text content. Revision:"
1270
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1272
def __init__(self, revision_id, weave_a, weave_b):
1273
WeaveError.__init__(self)
1274
self.revision_id = revision_id
1275
self.weave_a = weave_a
1276
self.weave_b = weave_b
1279
class WeaveTextDiffers(WeaveError):
1281
_fmt = ("Weaves differ on text content. Revision:"
1282
" {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1284
def __init__(self, revision_id, weave_a, weave_b):
1285
WeaveError.__init__(self)
1286
self.revision_id = revision_id
1287
self.weave_a = weave_a
1288
self.weave_b = weave_b
1291
class VersionedFileError(BzrError):
1293
_fmt = "Versioned file error"
1296
class RevisionNotPresent(VersionedFileError):
1298
_fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
1300
def __init__(self, revision_id, file_id):
1301
VersionedFileError.__init__(self)
1302
self.revision_id = revision_id
1303
self.file_id = file_id
1306
class RevisionAlreadyPresent(VersionedFileError):
1308
_fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
1310
def __init__(self, revision_id, file_id):
1311
VersionedFileError.__init__(self)
1312
self.revision_id = revision_id
1313
self.file_id = file_id
1316
class VersionedFileInvalidChecksum(VersionedFileError):
1318
_fmt = "Text did not match its checksum: %(message)s"
1321
class KnitError(InternalBzrError):
1326
class KnitCorrupt(KnitError):
1328
_fmt = "Knit %(filename)s corrupt: %(how)s"
1330
def __init__(self, filename, how):
1331
KnitError.__init__(self)
1332
self.filename = filename
1336
class KnitDataStreamIncompatible(KnitError):
1337
# Not raised anymore, as we can convert data streams. In future we may
1338
# need it again for more exotic cases, so we're keeping it around for now.
1340
_fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
1342
def __init__(self, stream_format, target_format):
1343
self.stream_format = stream_format
1344
self.target_format = target_format
1347
class KnitDataStreamUnknown(KnitError):
1348
# Indicates a data stream we don't know how to handle.
1350
_fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
1352
def __init__(self, stream_format):
1353
self.stream_format = stream_format
1356
class KnitHeaderError(KnitError):
1358
_fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
1360
def __init__(self, badline, filename):
1361
KnitError.__init__(self)
1362
self.badline = badline
1363
self.filename = filename
1365
class KnitIndexUnknownMethod(KnitError):
1366
"""Raised when we don't understand the storage method.
1368
Currently only 'fulltext' and 'line-delta' are supported.
1371
_fmt = ("Knit index %(filename)s does not have a known method"
1372
" in options: %(options)r")
1374
def __init__(self, filename, options):
1375
KnitError.__init__(self)
1376
self.filename = filename
1377
self.options = options
1380
class NoSuchExportFormat(BzrError):
1382
_fmt = "Export format %(format)r not supported"
1384
def __init__(self, format):
1385
BzrError.__init__(self)
1386
self.format = format
1389
class TransportError(BzrError):
1391
_fmt = "Transport error: %(msg)s %(orig_error)s"
1393
def __init__(self, msg=None, orig_error=None):
1394
if msg is None and orig_error is not None:
1395
msg = str(orig_error)
1396
if orig_error is None:
1401
self.orig_error = orig_error
1402
BzrError.__init__(self)
1405
class TooManyConcurrentRequests(InternalBzrError):
1407
_fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
1408
" Be sure to finish_writing and finish_reading on the"
1409
" currently open request.")
1411
def __init__(self, medium):
1412
self.medium = medium
1415
class SmartProtocolError(TransportError):
1417
_fmt = "Generic bzr smart protocol error: %(details)s"
1419
def __init__(self, details):
1420
self.details = details
1423
# A set of semi-meaningful errors which can be thrown
1424
class TransportNotPossible(TransportError):
1426
_fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
1429
class ConnectionError(TransportError):
1431
_fmt = "Connection error: %(msg)s %(orig_error)s"
1434
class SocketConnectionError(ConnectionError):
1436
_fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
1438
def __init__(self, host, port=None, msg=None, orig_error=None):
1440
msg = 'Failed to connect to'
1441
if orig_error is None:
1444
orig_error = '; ' + str(orig_error)
1445
ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
1450
self.port = ':%s' % port
1453
class ConnectionReset(TransportError):
1455
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1458
class InvalidRange(TransportError):
1460
_fmt = "Invalid range access in %(path)s at %(offset)s."
1462
def __init__(self, path, offset):
1463
TransportError.__init__(self, ("Invalid range access in %s at %d"
1466
self.offset = offset
1469
class InvalidHttpResponse(TransportError):
1471
_fmt = "Invalid http response for %(path)s: %(msg)s"
1473
def __init__(self, path, msg, orig_error=None):
1475
TransportError.__init__(self, msg, orig_error=orig_error)
1478
class InvalidHttpRange(InvalidHttpResponse):
1480
_fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1482
def __init__(self, path, range, msg):
1484
InvalidHttpResponse.__init__(self, path, msg)
1487
class InvalidHttpContentType(InvalidHttpResponse):
1489
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1491
def __init__(self, path, ctype, msg):
1493
InvalidHttpResponse.__init__(self, path, msg)
1496
class RedirectRequested(TransportError):
1498
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1500
def __init__(self, source, target, is_permanent=False, qual_proto=None):
1501
self.source = source
1502
self.target = target
1504
self.permanently = ' permanently'
1506
self.permanently = ''
1507
self._qualified_proto = qual_proto
1508
TransportError.__init__(self)
1510
def _requalify_url(self, url):
1511
"""Restore the qualified proto in front of the url"""
1512
# When this exception is raised, source and target are in
1513
# user readable format. But some transports may use a
1514
# different proto (http+urllib:// will present http:// to
1515
# the user. If a qualified proto is specified, the code
1516
# trapping the exception can get the qualified urls to
1517
# properly handle the redirection themself (creating a
1518
# new transport object from the target url for example).
1519
# But checking that the scheme of the original and
1520
# redirected urls are the same can be tricky. (see the
1521
# FIXME in BzrDir.open_from_transport for the unique use
1523
if self._qualified_proto is None:
1526
# The TODO related to NotBranchError mention that doing
1527
# that kind of manipulation on the urls may not be the
1528
# exception object job. On the other hand, this object is
1529
# the interface between the code and the user so
1530
# presenting the urls in different ways is indeed its
1533
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1534
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1537
def get_source_url(self):
1538
return self._requalify_url(self.source)
1540
def get_target_url(self):
1541
return self._requalify_url(self.target)
1544
class TooManyRedirections(TransportError):
1546
_fmt = "Too many redirections"
1549
class ConflictsInTree(BzrError):
1551
_fmt = "Working tree has conflicts."
1554
class ParseConfigError(BzrError):
1556
def __init__(self, errors, filename):
1557
if filename is None:
1559
message = "Error(s) parsing config file %s:\n%s" % \
1560
(filename, ('\n'.join(e.message for e in errors)))
1561
BzrError.__init__(self, message)
1564
class NoEmailInUsername(BzrError):
1566
_fmt = "%(username)r does not seem to contain a reasonable email address"
1568
def __init__(self, username):
1569
BzrError.__init__(self)
1570
self.username = username
1573
class SigningFailed(BzrError):
1575
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1577
def __init__(self, command_line):
1578
BzrError.__init__(self, command_line=command_line)
1581
class WorkingTreeNotRevision(BzrError):
1583
_fmt = ("The working tree for %(basedir)s has changed since"
1584
" the last commit, but weave merge requires that it be"
1587
def __init__(self, tree):
1588
BzrError.__init__(self, basedir=tree.basedir)
1591
class CantReprocessAndShowBase(BzrError):
1593
_fmt = ("Can't reprocess and show base, because reprocessing obscures "
1594
"the relationship of conflicting lines to the base")
1597
class GraphCycleError(BzrError):
1599
_fmt = "Cycle in graph %(graph)r"
1601
def __init__(self, graph):
1602
BzrError.__init__(self)
1606
class WritingCompleted(InternalBzrError):
1608
_fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
1609
"called upon it - accept bytes may not be called anymore.")
1611
def __init__(self, request):
1612
self.request = request
1615
class WritingNotComplete(InternalBzrError):
1617
_fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
1618
"called upon it - until the write phase is complete no "
1619
"data may be read.")
1621
def __init__(self, request):
1622
self.request = request
1625
class NotConflicted(BzrError):
1627
_fmt = "File %(filename)s is not conflicted."
1629
def __init__(self, filename):
1630
BzrError.__init__(self)
1631
self.filename = filename
1634
class MediumNotConnected(InternalBzrError):
1636
_fmt = """The medium '%(medium)s' is not connected."""
1638
def __init__(self, medium):
1639
self.medium = medium
1642
class MustUseDecorated(Exception):
1644
_fmt = "A decorating function has requested its original command be used."
1647
class NoBundleFound(BzrError):
1649
_fmt = 'No bundle was found in "%(filename)s".'
1651
def __init__(self, filename):
1652
BzrError.__init__(self)
1653
self.filename = filename
1656
class BundleNotSupported(BzrError):
1658
_fmt = "Unable to handle bundle version %(version)s: %(msg)s"
1660
def __init__(self, version, msg):
1661
BzrError.__init__(self)
1662
self.version = version
1666
class MissingText(BzrError):
1668
_fmt = ("Branch %(base)s is missing revision"
1669
" %(text_revision)s of %(file_id)s")
1671
def __init__(self, branch, text_revision, file_id):
1672
BzrError.__init__(self)
1673
self.branch = branch
1674
self.base = branch.base
1675
self.text_revision = text_revision
1676
self.file_id = file_id
1679
class DuplicateFileId(BzrError):
1681
_fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
1683
def __init__(self, file_id, entry):
1684
BzrError.__init__(self)
1685
self.file_id = file_id
1689
class DuplicateKey(BzrError):
1691
_fmt = "Key %(key)s is already present in map"
1694
class DuplicateHelpPrefix(BzrError):
1696
_fmt = "The prefix %(prefix)s is in the help search path twice."
1698
def __init__(self, prefix):
1699
self.prefix = prefix
1702
class MalformedTransform(BzrError):
1704
_fmt = "Tree transform is malformed %(conflicts)r"
1707
class NoFinalPath(BzrError):
1709
_fmt = ("No final name for trans_id %(trans_id)r\n"
1710
"file-id: %(file_id)r\n"
1711
"root trans-id: %(root_trans_id)r\n")
1713
def __init__(self, trans_id, transform):
1714
self.trans_id = trans_id
1715
self.file_id = transform.final_file_id(trans_id)
1716
self.root_trans_id = transform.root
1719
class BzrBadParameter(InternalBzrError):
1721
_fmt = "Bad parameter: %(param)r"
1723
# This exception should never be thrown, but it is a base class for all
1724
# parameter-to-function errors.
1726
def __init__(self, param):
1727
BzrError.__init__(self)
1731
class BzrBadParameterNotUnicode(BzrBadParameter):
1733
_fmt = "Parameter %(param)s is neither unicode nor utf8."
1736
class ReusingTransform(BzrError):
1738
_fmt = "Attempt to reuse a transform that has already been applied."
1741
class CantMoveRoot(BzrError):
1743
_fmt = "Moving the root directory is not supported at this time"
1746
class BzrMoveFailedError(BzrError):
1748
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1750
def __init__(self, from_path='', to_path='', extra=None):
1751
BzrError.__init__(self)
1753
self.extra = ': ' + str(extra)
1757
has_from = len(from_path) > 0
1758
has_to = len(to_path) > 0
1760
self.from_path = osutils.splitpath(from_path)[-1]
1765
self.to_path = osutils.splitpath(to_path)[-1]
1770
if has_from and has_to:
1771
self.operator = " =>"
1773
self.from_path = "from " + from_path
1775
self.operator = "to"
1777
self.operator = "file"
1780
class BzrRenameFailedError(BzrMoveFailedError):
1782
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1784
def __init__(self, from_path, to_path, extra=None):
1785
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1787
class BzrRemoveChangedFilesError(BzrError):
1788
"""Used when user is trying to remove changed files."""
1790
_fmt = ("Can't safely remove modified or unknown files:\n"
1791
"%(changes_as_text)s"
1792
"Use --keep to not delete them, or --force to delete them regardless.")
1794
def __init__(self, tree_delta):
1795
BzrError.__init__(self)
1796
self.changes_as_text = tree_delta.get_changes_as_text()
1797
#self.paths_as_string = '\n'.join(changed_files)
1798
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1801
class BzrBadParameterNotString(BzrBadParameter):
1803
_fmt = "Parameter %(param)s is not a string or unicode string."
1806
class BzrBadParameterMissing(BzrBadParameter):
1808
_fmt = "Parameter $(param)s is required but not present."
1811
class BzrBadParameterUnicode(BzrBadParameter):
1813
_fmt = ("Parameter %(param)s is unicode but"
1814
" only byte-strings are permitted.")
1817
class BzrBadParameterContainsNewline(BzrBadParameter):
1819
_fmt = "Parameter %(param)s contains a newline."
1822
class DependencyNotPresent(BzrError):
1824
_fmt = 'Unable to import library "%(library)s": %(error)s'
1826
def __init__(self, library, error):
1827
BzrError.__init__(self, library=library, error=error)
1830
class ParamikoNotPresent(DependencyNotPresent):
1832
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
1834
def __init__(self, error):
1835
DependencyNotPresent.__init__(self, 'paramiko', error)
1838
class PointlessMerge(BzrError):
1840
_fmt = "Nothing to merge."
1843
class UninitializableFormat(BzrError):
1845
_fmt = "Format %(format)s cannot be initialised by this version of bzr."
1847
def __init__(self, format):
1848
BzrError.__init__(self)
1849
self.format = format
1852
class BadConversionTarget(BzrError):
1854
_fmt = "Cannot convert to format %(format)s. %(problem)s"
1856
def __init__(self, problem, format):
1857
BzrError.__init__(self)
1858
self.problem = problem
1859
self.format = format
1862
class NoDiffFound(BzrError):
1864
_fmt = 'Could not find an appropriate Differ for file "%(path)s"'
1866
def __init__(self, path):
1867
BzrError.__init__(self, path)
1870
class NoDiff(BzrError):
1872
_fmt = "Diff is not installed on this machine: %(msg)s"
1874
def __init__(self, msg):
1875
BzrError.__init__(self, msg=msg)
1878
class NoDiff3(BzrError):
1880
_fmt = "Diff3 is not installed on this machine."
1883
class ExistingContent(BzrError):
1884
# Added in bzrlib 0.92, used by VersionedFile.add_lines.
1886
_fmt = "The content being inserted is already present."
1889
class ExistingLimbo(BzrError):
1891
_fmt = """This tree contains left-over files from a failed operation.
1892
Please examine %(limbo_dir)s to see if it contains any files you wish to
1893
keep, and delete it when you are done."""
1895
def __init__(self, limbo_dir):
1896
BzrError.__init__(self)
1897
self.limbo_dir = limbo_dir
1900
class ExistingPendingDeletion(BzrError):
1902
_fmt = """This tree contains left-over files from a failed operation.
1903
Please examine %(pending_deletion)s to see if it contains any files you
1904
wish to keep, and delete it when you are done."""
1906
def __init__(self, pending_deletion):
1907
BzrError.__init__(self, pending_deletion=pending_deletion)
1910
class ImmortalLimbo(BzrError):
1912
_fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
1913
Please examine %(limbo_dir)s to see if it contains any files you wish to
1914
keep, and delete it when you are done."""
1916
def __init__(self, limbo_dir):
1917
BzrError.__init__(self)
1918
self.limbo_dir = limbo_dir
1921
class ImmortalPendingDeletion(BzrError):
1923
_fmt = ("Unable to delete transform temporary directory "
1924
"%(pending_deletion)s. Please examine %(pending_deletion)s to see if it "
1925
"contains any files you wish to keep, and delete it when you are done.")
1927
def __init__(self, pending_deletion):
1928
BzrError.__init__(self, pending_deletion=pending_deletion)
1931
class OutOfDateTree(BzrError):
1933
_fmt = "Working tree is out of date, please run 'bzr update'."
1935
def __init__(self, tree):
1936
BzrError.__init__(self)
1940
class PublicBranchOutOfDate(BzrError):
1942
_fmt = 'Public branch "%(public_location)s" lacks revision '\
1945
def __init__(self, public_location, revstring):
1946
import bzrlib.urlutils as urlutils
1947
public_location = urlutils.unescape_for_display(public_location,
1949
BzrError.__init__(self, public_location=public_location,
1950
revstring=revstring)
1953
class MergeModifiedFormatError(BzrError):
1955
_fmt = "Error in merge modified format"
1958
class ConflictFormatError(BzrError):
1960
_fmt = "Format error in conflict listings"
1963
class CorruptRepository(BzrError):
1965
_fmt = ("An error has been detected in the repository %(repo_path)s.\n"
1966
"Please run bzr reconcile on this repository.")
1968
def __init__(self, repo):
1969
BzrError.__init__(self)
1970
self.repo_path = repo.bzrdir.root_transport.base
1973
class UpgradeRequired(BzrError):
1975
_fmt = "To use this feature you must upgrade your branch at %(path)s."
1977
def __init__(self, path):
1978
BzrError.__init__(self)
1982
class LocalRequiresBoundBranch(BzrError):
1984
_fmt = "Cannot perform local-only commits on unbound branches."
1987
class MissingProgressBarFinish(BzrError):
1989
_fmt = "A nested progress bar was not 'finished' correctly."
1992
class InvalidProgressBarType(BzrError):
1994
_fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
1995
" is not a supported type Select one of: %(valid_types)s")
1997
def __init__(self, bar_type, valid_types):
1998
BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
2001
class UnsupportedOperation(BzrError):
2003
_fmt = ("The method %(mname)s is not supported on"
2004
" objects of type %(tname)s.")
2006
def __init__(self, method, method_self):
2007
self.method = method
2008
self.mname = method.__name__
2009
self.tname = type(method_self).__name__
2012
class CannotSetRevisionId(UnsupportedOperation):
2013
"""Raised when a commit is attempting to set a revision id but cant."""
2016
class NonAsciiRevisionId(UnsupportedOperation):
2017
"""Raised when a commit is attempting to set a non-ascii revision id
2022
class BinaryFile(BzrError):
2024
_fmt = "File is binary but should be text."
2027
class IllegalPath(BzrError):
2029
_fmt = "The path %(path)s is not permitted on this platform"
2031
def __init__(self, path):
2032
BzrError.__init__(self)
2036
class TestamentMismatch(BzrError):
2038
_fmt = """Testament did not match expected value.
2039
For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
2042
def __init__(self, revision_id, expected, measured):
2043
self.revision_id = revision_id
2044
self.expected = expected
2045
self.measured = measured
2048
class NotABundle(BzrError):
2050
_fmt = "Not a bzr revision-bundle: %(text)r"
2052
def __init__(self, text):
2053
BzrError.__init__(self)
2057
class BadBundle(BzrError):
2059
_fmt = "Bad bzr revision-bundle: %(text)r"
2061
def __init__(self, text):
2062
BzrError.__init__(self)
2066
class MalformedHeader(BadBundle):
2068
_fmt = "Malformed bzr revision-bundle header: %(text)r"
2071
class MalformedPatches(BadBundle):
2073
_fmt = "Malformed patches in bzr revision-bundle: %(text)r"
2076
class MalformedFooter(BadBundle):
2078
_fmt = "Malformed footer in bzr revision-bundle: %(text)r"
2081
class UnsupportedEOLMarker(BadBundle):
2083
_fmt = "End of line marker was not \\n in bzr revision-bundle"
2086
# XXX: BadBundle's constructor assumes there's explanatory text,
2087
# but for this there is not
2088
BzrError.__init__(self)
2091
class IncompatibleBundleFormat(BzrError):
2093
_fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
2095
def __init__(self, bundle_format, other):
2096
BzrError.__init__(self)
2097
self.bundle_format = bundle_format
2101
class BadInventoryFormat(BzrError):
2103
_fmt = "Root class for inventory serialization errors"
2106
class UnexpectedInventoryFormat(BadInventoryFormat):
2108
_fmt = "The inventory was not in the expected format:\n %(msg)s"
2110
def __init__(self, msg):
2111
BadInventoryFormat.__init__(self, msg=msg)
2114
class RootNotRich(BzrError):
2116
_fmt = """This operation requires rich root data storage"""
2119
class NoSmartMedium(InternalBzrError):
2121
_fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
2123
def __init__(self, transport):
2124
self.transport = transport
2127
class NoSmartServer(NotBranchError):
2129
_fmt = "No smart server available at %(url)s"
2131
def __init__(self, url):
2135
class UnknownSSH(BzrError):
2137
_fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
2139
def __init__(self, vendor):
2140
BzrError.__init__(self)
2141
self.vendor = vendor
2144
class SSHVendorNotFound(BzrError):
2146
_fmt = ("Don't know how to handle SSH connections."
2147
" Please set BZR_SSH environment variable.")
2150
class GhostRevisionUnusableHere(BzrError):
2152
_fmt = "Ghost revision {%(revision_id)s} cannot be used here."
2154
def __init__(self, revision_id):
2155
BzrError.__init__(self)
2156
self.revision_id = revision_id
2159
class IllegalUseOfScopeReplacer(InternalBzrError):
2161
_fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
2162
" %(msg)s%(extra)s")
2164
def __init__(self, name, msg, extra=None):
2165
BzrError.__init__(self)
2169
self.extra = ': ' + str(extra)
2174
class InvalidImportLine(InternalBzrError):
2176
_fmt = "Not a valid import statement: %(msg)\n%(text)s"
2178
def __init__(self, text, msg):
2179
BzrError.__init__(self)
2184
class ImportNameCollision(InternalBzrError):
2186
_fmt = ("Tried to import an object to the same name as"
2187
" an existing object. %(name)s")
2189
def __init__(self, name):
2190
BzrError.__init__(self)
2194
class NotAMergeDirective(BzrError):
2195
"""File starting with %(firstline)r is not a merge directive"""
2196
def __init__(self, firstline):
2197
BzrError.__init__(self, firstline=firstline)
2200
class NoMergeSource(BzrError):
2201
"""Raise if no merge source was specified for a merge directive"""
2203
_fmt = "A merge directive must provide either a bundle or a public"\
2207
class IllegalMergeDirectivePayload(BzrError):
2208
"""A merge directive contained something other than a patch or bundle"""
2210
_fmt = "Bad merge directive payload %(start)r"
2212
def __init__(self, start):
2217
class PatchVerificationFailed(BzrError):
2218
"""A patch from a merge directive could not be verified"""
2220
_fmt = "Preview patch does not match requested changes."
2223
class PatchMissing(BzrError):
2224
"""Raise a patch type was specified but no patch supplied"""
2226
_fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
2228
def __init__(self, patch_type):
2229
BzrError.__init__(self)
2230
self.patch_type = patch_type
2233
class UnsupportedInventoryKind(BzrError):
2235
_fmt = """Unsupported entry kind %(kind)s"""
2237
def __init__(self, kind):
2241
class BadSubsumeSource(BzrError):
2243
_fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
2245
def __init__(self, tree, other_tree, reason):
2247
self.other_tree = other_tree
2248
self.reason = reason
2251
class SubsumeTargetNeedsUpgrade(BzrError):
2253
_fmt = """Subsume target %(other_tree)s needs to be upgraded."""
2255
def __init__(self, other_tree):
2256
self.other_tree = other_tree
2259
class BadReferenceTarget(InternalBzrError):
2261
_fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
2264
def __init__(self, tree, other_tree, reason):
2266
self.other_tree = other_tree
2267
self.reason = reason
2270
class NoSuchTag(BzrError):
2272
_fmt = "No such tag: %(tag_name)s"
2274
def __init__(self, tag_name):
2275
self.tag_name = tag_name
2278
class TagsNotSupported(BzrError):
2280
_fmt = ("Tags not supported by %(branch)s;"
2281
" you may be able to use bzr upgrade --dirstate-tags.")
2283
def __init__(self, branch):
2284
self.branch = branch
2287
class TagAlreadyExists(BzrError):
2289
_fmt = "Tag %(tag_name)s already exists."
2291
def __init__(self, tag_name):
2292
self.tag_name = tag_name
2295
class MalformedBugIdentifier(BzrError):
2297
_fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
2299
def __init__(self, bug_id, reason):
2300
self.bug_id = bug_id
2301
self.reason = reason
2304
class InvalidBugTrackerURL(BzrError):
2306
_fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
2307
"contain {id}: %(url)s")
2309
def __init__(self, abbreviation, url):
2310
self.abbreviation = abbreviation
2314
class UnknownBugTrackerAbbreviation(BzrError):
2316
_fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
2319
def __init__(self, abbreviation, branch):
2320
self.abbreviation = abbreviation
2321
self.branch = branch
2324
class UnexpectedSmartServerResponse(BzrError):
2326
_fmt = "Could not understand response from smart server: %(response_tuple)r"
2328
def __init__(self, response_tuple):
2329
self.response_tuple = response_tuple
2332
class ContainerError(BzrError):
2333
"""Base class of container errors."""
2336
class UnknownContainerFormatError(ContainerError):
2338
_fmt = "Unrecognised container format: %(container_format)r"
2340
def __init__(self, container_format):
2341
self.container_format = container_format
2344
class UnexpectedEndOfContainerError(ContainerError):
2346
_fmt = "Unexpected end of container stream"
2349
class UnknownRecordTypeError(ContainerError):
2351
_fmt = "Unknown record type: %(record_type)r"
2353
def __init__(self, record_type):
2354
self.record_type = record_type
2357
class InvalidRecordError(ContainerError):
2359
_fmt = "Invalid record: %(reason)s"
2361
def __init__(self, reason):
2362
self.reason = reason
2365
class ContainerHasExcessDataError(ContainerError):
2367
_fmt = "Container has data after end marker: %(excess)r"
2369
def __init__(self, excess):
2370
self.excess = excess
2373
class DuplicateRecordNameError(ContainerError):
2375
_fmt = "Container has multiple records with the same name: %(name)s"
2377
def __init__(self, name):
2381
class NoDestinationAddress(InternalBzrError):
2383
_fmt = "Message does not have a destination address."
2386
class RepositoryDataStreamError(BzrError):
2388
_fmt = "Corrupt or incompatible data stream: %(reason)s"
2390
def __init__(self, reason):
2391
self.reason = reason
2394
class SMTPError(BzrError):
2396
_fmt = "SMTP error: %(error)s"
2398
def __init__(self, error):
2402
class NoMessageSupplied(BzrError):
2404
_fmt = "No message supplied."
2407
class NoMailAddressSpecified(BzrError):
2409
_fmt = "No mail-to address specified."
2412
class UnknownMailClient(BzrError):
2414
_fmt = "Unknown mail client: %(mail_client)s"
2416
def __init__(self, mail_client):
2417
BzrError.__init__(self, mail_client=mail_client)
2420
class MailClientNotFound(BzrError):
2422
_fmt = "Unable to find mail client with the following names:"\
2423
" %(mail_command_list_string)s"
2425
def __init__(self, mail_command_list):
2426
mail_command_list_string = ', '.join(mail_command_list)
2427
BzrError.__init__(self, mail_command_list=mail_command_list,
2428
mail_command_list_string=mail_command_list_string)
2430
class SMTPConnectionRefused(SMTPError):
2432
_fmt = "SMTP connection to %(host)s refused"
2434
def __init__(self, error, host):
2439
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
2441
_fmt = "Please specify smtp_server. No server at default %(host)s."
2444
class BzrDirError(BzrError):
2446
def __init__(self, bzrdir):
2447
import bzrlib.urlutils as urlutils
2448
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2450
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2453
class AlreadyBranch(BzrDirError):
2455
_fmt = "'%(display_url)s' is already a branch."
2458
class AlreadyTree(BzrDirError):
2460
_fmt = "'%(display_url)s' is already a tree."
2463
class AlreadyCheckout(BzrDirError):
2465
_fmt = "'%(display_url)s' is already a checkout."
2468
class AlreadyLightweightCheckout(BzrDirError):
2470
_fmt = "'%(display_url)s' is already a lightweight checkout."
2473
class ReconfigurationNotSupported(BzrDirError):
2475
_fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
2478
class NoBindLocation(BzrDirError):
2480
_fmt = "No location could be found to bind to at %(display_url)s."
2483
class UncommittedChanges(BzrError):
2485
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2487
def __init__(self, tree):
2488
import bzrlib.urlutils as urlutils
2489
display_url = urlutils.unescape_for_display(
2490
tree.bzrdir.root_transport.base, 'ascii')
2491
BzrError.__init__(self, tree=tree, display_url=display_url)
2494
class UnableCreateSymlink(BzrError):
2496
_fmt = 'Unable to create symlink %(path_str)son this platform'
2498
def __init__(self, path=None):
2502
path_str = repr(str(path))
2503
except UnicodeEncodeError:
2504
path_str = repr(path)
2506
self.path_str = path_str