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
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 NoSubmitBranch(PathError):
 
 
476
    _fmt = 'No submit branch available for branch "%(path)s"'
 
 
478
    def __init__(self, branch):
 
 
479
       import bzrlib.urlutils as urlutils
 
 
480
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
483
class AlreadyBranchError(PathError):
 
 
485
    _fmt = "Already a branch: %(path)s."
 
 
488
class BranchExistsWithoutWorkingTree(PathError):
 
 
490
    _fmt = "Directory contains a branch, but no working tree \
 
 
491
(use bzr checkout if you wish to build a working tree): %(path)s"
 
 
494
class AtomicFileAlreadyClosed(PathError):
 
 
496
    _fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
 
 
499
    def __init__(self, path, function):
 
 
500
        PathError.__init__(self, path=path, extra=None)
 
 
501
        self.function = function
 
 
504
class InaccessibleParent(PathError):
 
 
506
    _fmt = ("Parent not accessible given base %(base)s and"
 
 
507
            " relative path %(path)s")
 
 
509
    def __init__(self, path, base):
 
 
510
        PathError.__init__(self, path)
 
 
514
class NoRepositoryPresent(BzrError):
 
 
516
    _fmt = "No repository present: %(path)r"
 
 
517
    def __init__(self, bzrdir):
 
 
518
        BzrError.__init__(self)
 
 
519
        self.path = bzrdir.transport.clone('..').base
 
 
522
class FileInWrongBranch(BzrError):
 
 
524
    _fmt = "File %(path)s in not in branch %(branch_base)s."
 
 
526
    def __init__(self, branch, path):
 
 
527
        BzrError.__init__(self)
 
 
529
        self.branch_base = branch.base
 
 
533
class UnsupportedFormatError(BzrError):
 
 
535
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
 
538
class UnknownFormatError(BzrError):
 
 
540
    _fmt = "Unknown branch format: %(format)r"
 
 
543
class IncompatibleFormat(BzrError):
 
 
545
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
547
    def __init__(self, format, bzrdir_format):
 
 
548
        BzrError.__init__(self)
 
 
550
        self.bzrdir = bzrdir_format
 
 
553
class IncompatibleRepositories(BzrError):
 
 
555
    _fmt = "Repository %(target)s is not compatible with repository"\
 
 
558
    def __init__(self, source, target):
 
 
559
        BzrError.__init__(self, target=target, source=source)
 
 
562
class IncompatibleRevision(BzrError):
 
 
564
    _fmt = "Revision is not compatible with %(repo_format)s"
 
 
566
    def __init__(self, repo_format):
 
 
567
        BzrError.__init__(self)
 
 
568
        self.repo_format = repo_format
 
 
571
class AlreadyVersionedError(BzrError):
 
 
572
    """Used when a path is expected not to be versioned, but it is."""
 
 
574
    _fmt = "%(context_info)s%(path)s is already versioned"
 
 
576
    def __init__(self, path, context_info=None):
 
 
577
        """Construct a new AlreadyVersionedError.
 
 
579
        :param path: This is the path which is versioned,
 
 
580
        which should be in a user friendly form.
 
 
581
        :param context_info: If given, this is information about the context,
 
 
582
        which could explain why this is expected to not be versioned.
 
 
584
        BzrError.__init__(self)
 
 
586
        if context_info is None:
 
 
587
            self.context_info = ''
 
 
589
            self.context_info = context_info + ". "
 
 
592
class NotVersionedError(BzrError):
 
 
593
    """Used when a path is expected to be versioned, but it is not."""
 
 
595
    _fmt = "%(context_info)s%(path)s is not versioned"
 
 
597
    def __init__(self, path, context_info=None):
 
 
598
        """Construct a new NotVersionedError.
 
 
600
        :param path: This is the path which is not versioned,
 
 
601
        which should be in a user friendly form.
 
 
602
        :param context_info: If given, this is information about the context,
 
 
603
        which could explain why this is expected to be versioned.
 
 
605
        BzrError.__init__(self)
 
 
607
        if context_info is None:
 
 
608
            self.context_info = ''
 
 
610
            self.context_info = context_info + ". "
 
 
613
class PathsNotVersionedError(BzrError):
 
 
614
    """Used when reporting several paths which are not versioned"""
 
 
616
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
 
618
    def __init__(self, paths):
 
 
619
        from bzrlib.osutils import quotefn
 
 
620
        BzrError.__init__(self)
 
 
622
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
625
class PathsDoNotExist(BzrError):
 
 
627
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
 
629
    # used when reporting that paths are neither versioned nor in the working
 
 
632
    def __init__(self, paths, extra=None):
 
 
634
        from bzrlib.osutils import quotefn
 
 
635
        BzrError.__init__(self)
 
 
637
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
639
            self.extra = ': ' + str(extra)
 
 
644
class BadFileKindError(BzrError):
 
 
646
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
 
648
    def __init__(self, filename, kind):
 
 
649
        BzrError.__init__(self, filename=filename, kind=kind)
 
 
652
class ForbiddenControlFileError(BzrError):
 
 
654
    _fmt = "Cannot operate on %(filename)s because it is a control file"
 
 
657
class LockError(BzrError):
 
 
659
    _fmt = "Lock error: %(msg)s"
 
 
661
    internal_error = True
 
 
663
    # All exceptions from the lock/unlock functions should be from
 
 
664
    # this exception class.  They will be translated as necessary. The
 
 
665
    # original exception is available as e.original_error
 
 
667
    # New code should prefer to raise specific subclasses
 
 
668
    def __init__(self, message):
 
 
669
        # Python 2.5 uses a slot for StandardError.message,
 
 
670
        # so use a different variable name
 
 
671
        # so it is exposed in self.__dict__
 
 
675
class LockActive(LockError):
 
 
677
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
 
679
    internal_error = False
 
 
681
    def __init__(self, lock_description):
 
 
682
        self.lock_description = lock_description
 
 
685
class CommitNotPossible(LockError):
 
 
687
    _fmt = "A commit was attempted but we do not have a write lock open."
 
 
693
class AlreadyCommitted(LockError):
 
 
695
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
 
701
class ReadOnlyError(LockError):
 
 
703
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
 
705
    # TODO: There should also be an error indicating that you need a write
 
 
706
    # lock and don't have any lock at all... mbp 20070226
 
 
708
    def __init__(self, obj):
 
 
712
class ReadOnlyLockError(LockError):
 
 
714
    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
 
 
716
    def __init__(self, fname, msg):
 
 
717
        LockError.__init__(self, '')
 
 
722
class OutSideTransaction(BzrError):
 
 
724
    _fmt = ("A transaction related operation was attempted after"
 
 
725
            " the transaction finished.")
 
 
728
class ObjectNotLocked(LockError):
 
 
730
    _fmt = "%(obj)r is not locked"
 
 
732
    # this can indicate that any particular object is not locked; see also
 
 
733
    # LockNotHeld which means that a particular *lock* object is not held by
 
 
734
    # the caller -- perhaps they should be unified.
 
 
735
    def __init__(self, obj):
 
 
739
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
 
741
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
 
743
    def __init__(self, obj):
 
 
747
class UnlockableTransport(LockError):
 
 
749
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
 
751
    def __init__(self, transport):
 
 
752
        self.transport = transport
 
 
755
class LockContention(LockError):
 
 
757
    _fmt = "Could not acquire lock %(lock)s"
 
 
758
    # TODO: show full url for lock, combining the transport and relative
 
 
761
    internal_error = False
 
 
763
    def __init__(self, lock):
 
 
767
class LockBroken(LockError):
 
 
769
    _fmt = ("Lock was broken while still open: %(lock)s"
 
 
770
            " - check storage consistency!")
 
 
772
    internal_error = False
 
 
774
    def __init__(self, lock):
 
 
778
class LockBreakMismatch(LockError):
 
 
780
    _fmt = ("Lock was released and re-acquired before being broken:"
 
 
781
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
 
783
    internal_error = False
 
 
785
    def __init__(self, lock, holder, target):
 
 
791
class LockNotHeld(LockError):
 
 
793
    _fmt = "Lock not held: %(lock)s"
 
 
795
    internal_error = False
 
 
797
    def __init__(self, lock):
 
 
801
class PointlessCommit(BzrError):
 
 
803
    _fmt = "No changes to commit"
 
 
806
class UpgradeReadonly(BzrError):
 
 
808
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
 
811
class UpToDateFormat(BzrError):
 
 
813
    _fmt = "The branch format %(format)s is already at the most recent format."
 
 
815
    def __init__(self, format):
 
 
816
        BzrError.__init__(self)
 
 
820
class StrictCommitFailed(Exception):
 
 
822
    _fmt = "Commit refused because there are unknowns in the tree."
 
 
825
class NoSuchRevision(BzrError):
 
 
827
    _fmt = "Branch %(branch)s has no revision %(revision)s"
 
 
829
    internal_error = True
 
 
831
    def __init__(self, branch, revision):
 
 
832
        BzrError.__init__(self, branch=branch, revision=revision)
 
 
835
class NotLeftParentDescendant(BzrError):
 
 
837
    _fmt = ("Revision %(old_revision)s is not the left parent of"
 
 
838
            " %(new_revision)s, but branch %(branch_location)s expects this")
 
 
840
    internal_error = True
 
 
842
    def __init__(self, branch, old_revision, new_revision):
 
 
843
        BzrError.__init__(self, branch_location=branch.base,
 
 
844
                          old_revision=old_revision,
 
 
845
                          new_revision=new_revision)
 
 
848
class NoSuchRevisionSpec(BzrError):
 
 
850
    _fmt = "No namespace registered for string: %(spec)r"
 
 
852
    def __init__(self, spec):
 
 
853
        BzrError.__init__(self, spec=spec)
 
 
856
class NoSuchRevisionInTree(NoSuchRevision):
 
 
857
    """When using Tree.revision_tree, and the revision is not accessible."""
 
 
859
    _fmt = "The revision id %(revision_id)s is not present in the tree %(tree)s."
 
 
861
    def __init__(self, tree, revision_id):
 
 
862
        BzrError.__init__(self)
 
 
864
        self.revision_id = revision_id
 
 
867
class InvalidRevisionSpec(BzrError):
 
 
869
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
870
            " %(branch)s%(extra)s")
 
 
872
    def __init__(self, spec, branch, extra=None):
 
 
873
        BzrError.__init__(self, branch=branch, spec=spec)
 
 
875
            self.extra = '\n' + str(extra)
 
 
880
class HistoryMissing(BzrError):
 
 
882
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
 
885
class AppendRevisionsOnlyViolation(BzrError):
 
 
887
    _fmt = ('Operation denied because it would change the main history,'
 
 
888
           ' which is not permitted by the append_revisions_only setting on'
 
 
889
           ' branch "%(location)s".')
 
 
891
    def __init__(self, location):
 
 
892
       import bzrlib.urlutils as urlutils
 
 
893
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
894
       BzrError.__init__(self, location=location)
 
 
897
class DivergedBranches(BzrError):
 
 
899
    _fmt = ("These branches have diverged."
 
 
900
            " Use the merge command to reconcile them.")
 
 
902
    internal_error = False
 
 
904
    def __init__(self, branch1, branch2):
 
 
905
        self.branch1 = branch1
 
 
906
        self.branch2 = branch2
 
 
909
class NotLefthandHistory(BzrError):
 
 
911
    _fmt = "Supplied history does not follow left-hand parents"
 
 
913
    internal_error = True
 
 
915
    def __init__(self, history):
 
 
916
        BzrError.__init__(self, history=history)
 
 
919
class UnrelatedBranches(BzrError):
 
 
921
    _fmt = ("Branches have no common ancestor, and"
 
 
922
            " no merge base revision was specified.")
 
 
924
    internal_error = False
 
 
927
class NoCommonAncestor(BzrError):
 
 
929
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
 
931
    def __init__(self, revision_a, revision_b):
 
 
932
        self.revision_a = revision_a
 
 
933
        self.revision_b = revision_b
 
 
936
class NoCommonRoot(BzrError):
 
 
938
    _fmt = ("Revisions are not derived from the same root: "
 
 
939
           "%(revision_a)s %(revision_b)s.")
 
 
941
    def __init__(self, revision_a, revision_b):
 
 
942
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
 
945
class NotAncestor(BzrError):
 
 
947
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
 
949
    def __init__(self, rev_id, not_ancestor_id):
 
 
950
        BzrError.__init__(self, rev_id=rev_id,
 
 
951
            not_ancestor_id=not_ancestor_id)
 
 
954
class InstallFailed(BzrError):
 
 
956
    def __init__(self, revisions):
 
 
957
        revision_str = ", ".join(str(r) for r in revisions)
 
 
958
        msg = "Could not install revisions:\n%s" % revision_str
 
 
959
        BzrError.__init__(self, msg)
 
 
960
        self.revisions = revisions
 
 
963
class AmbiguousBase(BzrError):
 
 
965
    def __init__(self, bases):
 
 
966
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
 
968
        msg = ("The correct base is unclear, because %s are all equally close"
 
 
970
        BzrError.__init__(self, msg)
 
 
974
class NoCommits(BzrError):
 
 
976
    _fmt = "Branch %(branch)s has no commits."
 
 
978
    def __init__(self, branch):
 
 
979
        BzrError.__init__(self, branch=branch)
 
 
982
class UnlistableStore(BzrError):
 
 
984
    def __init__(self, store):
 
 
985
        BzrError.__init__(self, "Store %s is not listable" % store)
 
 
989
class UnlistableBranch(BzrError):
 
 
991
    def __init__(self, br):
 
 
992
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
 
995
class BoundBranchOutOfDate(BzrError):
 
 
997
    _fmt = ("Bound branch %(branch)s is out of date"
 
 
998
            " with master branch %(master)s.")
 
 
1000
    def __init__(self, branch, master):
 
 
1001
        BzrError.__init__(self)
 
 
1002
        self.branch = branch
 
 
1003
        self.master = master
 
 
1006
class CommitToDoubleBoundBranch(BzrError):
 
 
1008
    _fmt = ("Cannot commit to branch %(branch)s."
 
 
1009
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
 
1011
    def __init__(self, branch, master, remote):
 
 
1012
        BzrError.__init__(self)
 
 
1013
        self.branch = branch
 
 
1014
        self.master = master
 
 
1015
        self.remote = remote
 
 
1018
class OverwriteBoundBranch(BzrError):
 
 
1020
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
 
1022
    def __init__(self, branch):
 
 
1023
        BzrError.__init__(self)
 
 
1024
        self.branch = branch
 
 
1027
class BoundBranchConnectionFailure(BzrError):
 
 
1029
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
 
1030
            " => %(target)s: %(error)s")
 
 
1032
    def __init__(self, branch, target, error):
 
 
1033
        BzrError.__init__(self)
 
 
1034
        self.branch = branch
 
 
1035
        self.target = target
 
 
1039
class WeaveError(BzrError):
 
 
1041
    _fmt = "Error in processing weave: %(message)s"
 
 
1043
    def __init__(self, message=None):
 
 
1044
        BzrError.__init__(self)
 
 
1045
        self.message = message
 
 
1048
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1050
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1052
    def __init__(self, revision_id, weave):
 
 
1054
        WeaveError.__init__(self)
 
 
1055
        self.revision_id = revision_id
 
 
1059
class WeaveRevisionNotPresent(WeaveError):
 
 
1061
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1063
    def __init__(self, revision_id, weave):
 
 
1064
        WeaveError.__init__(self)
 
 
1065
        self.revision_id = revision_id
 
 
1069
class WeaveFormatError(WeaveError):
 
 
1071
    _fmt = "Weave invariant violated: %(what)s"
 
 
1073
    def __init__(self, what):
 
 
1074
        WeaveError.__init__(self)
 
 
1078
class WeaveParentMismatch(WeaveError):
 
 
1080
    _fmt = "Parents are mismatched between two revisions."
 
 
1083
class WeaveInvalidChecksum(WeaveError):
 
 
1085
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1088
class WeaveTextDiffers(WeaveError):
 
 
1090
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1091
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1093
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1094
        WeaveError.__init__(self)
 
 
1095
        self.revision_id = revision_id
 
 
1096
        self.weave_a = weave_a
 
 
1097
        self.weave_b = weave_b
 
 
1100
class WeaveTextDiffers(WeaveError):
 
 
1102
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1103
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1105
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1106
        WeaveError.__init__(self)
 
 
1107
        self.revision_id = revision_id
 
 
1108
        self.weave_a = weave_a
 
 
1109
        self.weave_b = weave_b
 
 
1112
class VersionedFileError(BzrError):
 
 
1114
    _fmt = "Versioned file error"
 
 
1117
class RevisionNotPresent(VersionedFileError):
 
 
1119
    _fmt = "Revision {%(revision_id)s} not present in %(file_id)s."
 
 
1121
    def __init__(self, revision_id, file_id):
 
 
1122
        VersionedFileError.__init__(self)
 
 
1123
        self.revision_id = revision_id
 
 
1124
        self.file_id = file_id
 
 
1127
class RevisionAlreadyPresent(VersionedFileError):
 
 
1129
    _fmt = "Revision {%(revision_id)s} already present in %(file_id)s."
 
 
1131
    def __init__(self, revision_id, file_id):
 
 
1132
        VersionedFileError.__init__(self)
 
 
1133
        self.revision_id = revision_id
 
 
1134
        self.file_id = file_id
 
 
1137
class KnitError(BzrError):
 
 
1141
    internal_error = True
 
 
1144
class KnitHeaderError(KnitError):
 
 
1146
    _fmt = "Knit header error: %(badline)r unexpected for file %(filename)s"
 
 
1148
    def __init__(self, badline, filename):
 
 
1149
        KnitError.__init__(self)
 
 
1150
        self.badline = badline
 
 
1151
        self.filename = filename
 
 
1154
class KnitCorrupt(KnitError):
 
 
1156
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1158
    def __init__(self, filename, how):
 
 
1159
        KnitError.__init__(self)
 
 
1160
        self.filename = filename
 
 
1164
class KnitIndexUnknownMethod(KnitError):
 
 
1165
    """Raised when we don't understand the storage method.
 
 
1167
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1170
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1171
            " in options: %(options)r")
 
 
1173
    def __init__(self, filename, options):
 
 
1174
        KnitError.__init__(self)
 
 
1175
        self.filename = filename
 
 
1176
        self.options = options
 
 
1179
class NoSuchExportFormat(BzrError):
 
 
1181
    _fmt = "Export format %(format)r not supported"
 
 
1183
    def __init__(self, format):
 
 
1184
        BzrError.__init__(self)
 
 
1185
        self.format = format
 
 
1188
class TransportError(BzrError):
 
 
1190
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1192
    def __init__(self, msg=None, orig_error=None):
 
 
1193
        if msg is None and orig_error is not None:
 
 
1194
            msg = str(orig_error)
 
 
1195
        if orig_error is None:
 
 
1200
        self.orig_error = orig_error
 
 
1201
        BzrError.__init__(self)
 
 
1204
class TooManyConcurrentRequests(BzrError):
 
 
1206
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1207
            " Be sure to finish_writing and finish_reading on the"
 
 
1208
            " current request that is open.")
 
 
1210
    internal_error = True
 
 
1212
    def __init__(self, medium):
 
 
1213
        self.medium = medium
 
 
1216
class SmartProtocolError(TransportError):
 
 
1218
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1220
    def __init__(self, details):
 
 
1221
        self.details = details
 
 
1224
# A set of semi-meaningful errors which can be thrown
 
 
1225
class TransportNotPossible(TransportError):
 
 
1227
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1230
class ConnectionError(TransportError):
 
 
1232
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1235
class SocketConnectionError(ConnectionError):
 
 
1237
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1239
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1241
            msg = 'Failed to connect to'
 
 
1242
        if orig_error is None:
 
 
1245
            orig_error = '; ' + str(orig_error)
 
 
1246
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1251
            self.port = ':%s' % port
 
 
1254
class ConnectionReset(TransportError):
 
 
1256
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1259
class InvalidRange(TransportError):
 
 
1261
    _fmt = "Invalid range access in %(path)s at %(offset)s."
 
 
1263
    def __init__(self, path, offset):
 
 
1264
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
 
1267
        self.offset = offset
 
 
1270
class InvalidHttpResponse(TransportError):
 
 
1272
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1274
    def __init__(self, path, msg, orig_error=None):
 
 
1276
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1279
class InvalidHttpRange(InvalidHttpResponse):
 
 
1281
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1283
    def __init__(self, path, range, msg):
 
 
1285
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1288
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1290
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1292
    def __init__(self, path, ctype, msg):
 
 
1294
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1297
class RedirectRequested(TransportError):
 
 
1299
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1301
    def __init__(self, source, target, is_permament=False, qual_proto=None):
 
 
1302
        self.source = source
 
 
1303
        self.target = target
 
 
1305
            self.permanently = ' permanently'
 
 
1307
            self.permanently = ''
 
 
1308
        self.is_permament = is_permament
 
 
1309
        self._qualified_proto = qual_proto
 
 
1310
        TransportError.__init__(self)
 
 
1312
    def _requalify_url(self, url):
 
 
1313
        """Restore the qualified proto in front of the url"""
 
 
1314
        # When this exception is raised, source and target are in
 
 
1315
        # user readable format. But some transports may use a
 
 
1316
        # different proto (http+urllib:// will present http:// to
 
 
1317
        # the user. If a qualified proto is specified, the code
 
 
1318
        # trapping the exception can get the qualified urls to
 
 
1319
        # properly handle the redirection themself (creating a
 
 
1320
        # new transport object from the target url for example).
 
 
1321
        # But checking that the scheme of the original and
 
 
1322
        # redirected urls are the same can be tricky. (see the
 
 
1323
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1325
        if self._qualified_proto is None:
 
 
1328
        # The TODO related to NotBranchError mention that doing
 
 
1329
        # that kind of manipulation on the urls may not be the
 
 
1330
        # exception object job. On the other hand, this object is
 
 
1331
        # the interface between the code and the user so
 
 
1332
        # presenting the urls in different ways is indeed its
 
 
1335
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1336
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1339
    def get_source_url(self):
 
 
1340
        return self._requalify_url(self.source)
 
 
1342
    def get_target_url(self):
 
 
1343
        return self._requalify_url(self.target)
 
 
1346
class TooManyRedirections(TransportError):
 
 
1348
    _fmt = "Too many redirections"
 
 
1350
class ConflictsInTree(BzrError):
 
 
1352
    _fmt = "Working tree has conflicts."
 
 
1355
class ParseConfigError(BzrError):
 
 
1357
    def __init__(self, errors, filename):
 
 
1358
        if filename is None:
 
 
1360
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1361
            (filename, ('\n'.join(e.message for e in errors)))
 
 
1362
        BzrError.__init__(self, message)
 
 
1365
class NoEmailInUsername(BzrError):
 
 
1367
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1369
    def __init__(self, username):
 
 
1370
        BzrError.__init__(self)
 
 
1371
        self.username = username
 
 
1374
class SigningFailed(BzrError):
 
 
1376
    _fmt = "Failed to gpg sign data with command %(command_line)r"
 
 
1378
    def __init__(self, command_line):
 
 
1379
        BzrError.__init__(self, command_line=command_line)
 
 
1382
class WorkingTreeNotRevision(BzrError):
 
 
1384
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1385
            " the last commit, but weave merge requires that it be"
 
 
1388
    def __init__(self, tree):
 
 
1389
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1392
class CantReprocessAndShowBase(BzrError):
 
 
1394
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1395
           "the relationship of conflicting lines to the base")
 
 
1398
class GraphCycleError(BzrError):
 
 
1400
    _fmt = "Cycle in graph %(graph)r"
 
 
1402
    def __init__(self, graph):
 
 
1403
        BzrError.__init__(self)
 
 
1407
class WritingCompleted(BzrError):
 
 
1409
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1410
            "called upon it - accept bytes may not be called anymore.")
 
 
1412
    internal_error = True
 
 
1414
    def __init__(self, request):
 
 
1415
        self.request = request
 
 
1418
class WritingNotComplete(BzrError):
 
 
1420
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1421
            "called upon it - until the write phase is complete no "
 
 
1422
            "data may be read.")
 
 
1424
    internal_error = True
 
 
1426
    def __init__(self, request):
 
 
1427
        self.request = request
 
 
1430
class NotConflicted(BzrError):
 
 
1432
    _fmt = "File %(filename)s is not conflicted."
 
 
1434
    def __init__(self, filename):
 
 
1435
        BzrError.__init__(self)
 
 
1436
        self.filename = filename
 
 
1439
class MediumNotConnected(BzrError):
 
 
1441
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1443
    internal_error = True
 
 
1445
    def __init__(self, medium):
 
 
1446
        self.medium = medium
 
 
1449
class MustUseDecorated(Exception):
 
 
1451
    _fmt = "A decorating function has requested its original command be used."
 
 
1454
class NoBundleFound(BzrError):
 
 
1456
    _fmt = "No bundle was found in %(filename)s"
 
 
1458
    def __init__(self, filename):
 
 
1459
        BzrError.__init__(self)
 
 
1460
        self.filename = filename
 
 
1463
class BundleNotSupported(BzrError):
 
 
1465
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1467
    def __init__(self, version, msg):
 
 
1468
        BzrError.__init__(self)
 
 
1469
        self.version = version
 
 
1473
class MissingText(BzrError):
 
 
1475
    _fmt = ("Branch %(base)s is missing revision"
 
 
1476
            " %(text_revision)s of %(file_id)s")
 
 
1478
    def __init__(self, branch, text_revision, file_id):
 
 
1479
        BzrError.__init__(self)
 
 
1480
        self.branch = branch
 
 
1481
        self.base = branch.base
 
 
1482
        self.text_revision = text_revision
 
 
1483
        self.file_id = file_id
 
 
1486
class DuplicateFileId(BzrError):
 
 
1488
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1490
    def __init__(self, file_id, entry):
 
 
1491
        BzrError.__init__(self)
 
 
1492
        self.file_id = file_id
 
 
1496
class DuplicateKey(BzrError):
 
 
1498
    _fmt = "Key %(key)s is already present in map"
 
 
1501
class MalformedTransform(BzrError):
 
 
1503
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1506
class NoFinalPath(BzrError):
 
 
1508
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1509
            "file-id: %(file_id)r\n"
 
 
1510
            "root trans-id: %(root_trans_id)r\n")
 
 
1512
    def __init__(self, trans_id, transform):
 
 
1513
        self.trans_id = trans_id
 
 
1514
        self.file_id = transform.final_file_id(trans_id)
 
 
1515
        self.root_trans_id = transform.root
 
 
1518
class BzrBadParameter(BzrError):
 
 
1520
    _fmt = "Bad parameter: %(param)r"
 
 
1522
    # This exception should never be thrown, but it is a base class for all
 
 
1523
    # parameter-to-function errors.
 
 
1525
    def __init__(self, param):
 
 
1526
        BzrError.__init__(self)
 
 
1530
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1532
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1535
class ReusingTransform(BzrError):
 
 
1537
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1540
class CantMoveRoot(BzrError):
 
 
1542
    _fmt = "Moving the root directory is not supported at this time"
 
 
1545
class BzrMoveFailedError(BzrError):
 
 
1547
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1549
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1550
        BzrError.__init__(self)
 
 
1552
            self.extra = ': ' + str(extra)
 
 
1556
        has_from = len(from_path) > 0
 
 
1557
        has_to = len(to_path) > 0
 
 
1559
            self.from_path = osutils.splitpath(from_path)[-1]
 
 
1564
            self.to_path = osutils.splitpath(to_path)[-1]
 
 
1569
        if has_from and has_to:
 
 
1570
            self.operator = " =>"
 
 
1572
            self.from_path = "from " + from_path
 
 
1574
            self.operator = "to"
 
 
1576
            self.operator = "file"
 
 
1579
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1581
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1583
    def __init__(self, from_path, to_path, extra=None):
 
 
1584
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1587
class BzrBadParameterNotString(BzrBadParameter):
 
 
1589
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1592
class BzrBadParameterMissing(BzrBadParameter):
 
 
1594
    _fmt = "Parameter $(param)s is required but not present."
 
 
1597
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1599
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1600
            " only byte-strings are permitted.")
 
 
1603
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1605
    _fmt = "Parameter %(param)s contains a newline."
 
 
1608
class DependencyNotPresent(BzrError):
 
 
1610
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1612
    def __init__(self, library, error):
 
 
1613
        BzrError.__init__(self, library=library, error=error)
 
 
1616
class ParamikoNotPresent(DependencyNotPresent):
 
 
1618
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1620
    def __init__(self, error):
 
 
1621
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
1624
class PointlessMerge(BzrError):
 
 
1626
    _fmt = "Nothing to merge."
 
 
1629
class UninitializableFormat(BzrError):
 
 
1631
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
1633
    def __init__(self, format):
 
 
1634
        BzrError.__init__(self)
 
 
1635
        self.format = format
 
 
1638
class BadConversionTarget(BzrError):
 
 
1640
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
1642
    def __init__(self, problem, format):
 
 
1643
        BzrError.__init__(self)
 
 
1644
        self.problem = problem
 
 
1645
        self.format = format
 
 
1648
class NoDiff(BzrError):
 
 
1650
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
1652
    def __init__(self, msg):
 
 
1653
        BzrError.__init__(self, msg=msg)
 
 
1656
class NoDiff3(BzrError):
 
 
1658
    _fmt = "Diff3 is not installed on this machine."
 
 
1661
class ExistingLimbo(BzrError):
 
 
1663
    _fmt = """This tree contains left-over files from a failed operation.
 
 
1664
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
1665
    keep, and delete it when you are done."""
 
 
1667
    def __init__(self, limbo_dir):
 
 
1668
       BzrError.__init__(self)
 
 
1669
       self.limbo_dir = limbo_dir
 
 
1672
class ImmortalLimbo(BzrError):
 
 
1674
    _fmt = """Unable to delete transform temporary directory $(limbo_dir)s.
 
 
1675
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
1676
    keep, and delete it when you are done."""
 
 
1678
    def __init__(self, limbo_dir):
 
 
1679
       BzrError.__init__(self)
 
 
1680
       self.limbo_dir = limbo_dir
 
 
1683
class OutOfDateTree(BzrError):
 
 
1685
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
1687
    def __init__(self, tree):
 
 
1688
        BzrError.__init__(self)
 
 
1692
class PublicBranchOutOfDate(BzrError):
 
 
1694
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
1697
    def __init__(self, public_location, revstring):
 
 
1698
        import bzrlib.urlutils as urlutils
 
 
1699
        public_location = urlutils.unescape_for_display(public_location,
 
 
1701
        BzrError.__init__(self, public_location=public_location,
 
 
1702
                          revstring=revstring)
 
 
1705
class MergeModifiedFormatError(BzrError):
 
 
1707
    _fmt = "Error in merge modified format"
 
 
1710
class ConflictFormatError(BzrError):
 
 
1712
    _fmt = "Format error in conflict listings"
 
 
1715
class CorruptRepository(BzrError):
 
 
1717
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
1718
            "Please run bzr reconcile on this repository.")
 
 
1720
    def __init__(self, repo):
 
 
1721
        BzrError.__init__(self)
 
 
1722
        self.repo_path = repo.bzrdir.root_transport.base
 
 
1725
class UpgradeRequired(BzrError):
 
 
1727
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
1729
    def __init__(self, path):
 
 
1730
        BzrError.__init__(self)
 
 
1734
class LocalRequiresBoundBranch(BzrError):
 
 
1736
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
1739
class MissingProgressBarFinish(BzrError):
 
 
1741
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
1744
class InvalidProgressBarType(BzrError):
 
 
1746
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
1747
            " is not a supported type Select one of: %(valid_types)s")
 
 
1749
    def __init__(self, bar_type, valid_types):
 
 
1750
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
1753
class UnsupportedOperation(BzrError):
 
 
1755
    _fmt = ("The method %(mname)s is not supported on"
 
 
1756
            " objects of type %(tname)s.")
 
 
1758
    def __init__(self, method, method_self):
 
 
1759
        self.method = method
 
 
1760
        self.mname = method.__name__
 
 
1761
        self.tname = type(method_self).__name__
 
 
1764
class CannotSetRevisionId(UnsupportedOperation):
 
 
1765
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
1768
class NonAsciiRevisionId(UnsupportedOperation):
 
 
1769
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
1774
class BinaryFile(BzrError):
 
 
1776
    _fmt = "File is binary but should be text."
 
 
1779
class IllegalPath(BzrError):
 
 
1781
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
1783
    def __init__(self, path):
 
 
1784
        BzrError.__init__(self)
 
 
1788
class TestamentMismatch(BzrError):
 
 
1790
    _fmt = """Testament did not match expected value.
 
 
1791
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
1794
    def __init__(self, revision_id, expected, measured):
 
 
1795
        self.revision_id = revision_id
 
 
1796
        self.expected = expected
 
 
1797
        self.measured = measured
 
 
1800
class NotABundle(BzrError):
 
 
1802
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
1804
    def __init__(self, text):
 
 
1805
        BzrError.__init__(self)
 
 
1809
class BadBundle(BzrError): 
 
 
1811
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
1813
    def __init__(self, text):
 
 
1814
        BzrError.__init__(self)
 
 
1818
class MalformedHeader(BadBundle): 
 
 
1820
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
1823
class MalformedPatches(BadBundle): 
 
 
1825
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
1828
class MalformedFooter(BadBundle): 
 
 
1830
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
1833
class UnsupportedEOLMarker(BadBundle):
 
 
1835
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
1838
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
1839
        # but for this there is not
 
 
1840
        BzrError.__init__(self)
 
 
1843
class IncompatibleBundleFormat(BzrError):
 
 
1845
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
1847
    def __init__(self, bundle_format, other):
 
 
1848
        BzrError.__init__(self)
 
 
1849
        self.bundle_format = bundle_format
 
 
1853
class BadInventoryFormat(BzrError):
 
 
1855
    _fmt = "Root class for inventory serialization errors"
 
 
1858
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
1860
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
1862
    def __init__(self, msg):
 
 
1863
        BadInventoryFormat.__init__(self, msg=msg)
 
 
1866
class RootNotRich(BzrError):
 
 
1868
    _fmt = """This operation requires rich root data storage"""
 
 
1871
class NoSmartMedium(BzrError):
 
 
1873
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
1875
    internal_error = True
 
 
1877
    def __init__(self, transport):
 
 
1878
        self.transport = transport
 
 
1881
class NoSmartServer(NotBranchError):
 
 
1883
    _fmt = "No smart server available at %(url)s"
 
 
1885
    def __init__(self, url):
 
 
1889
class UnknownSSH(BzrError):
 
 
1891
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
1893
    def __init__(self, vendor):
 
 
1894
        BzrError.__init__(self)
 
 
1895
        self.vendor = vendor
 
 
1898
class SSHVendorNotFound(BzrError):
 
 
1900
    _fmt = ("Don't know how to handle SSH connections."
 
 
1901
            " Please set BZR_SSH environment variable.")
 
 
1904
class GhostRevisionUnusableHere(BzrError):
 
 
1906
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
1908
    def __init__(self, revision_id):
 
 
1909
        BzrError.__init__(self)
 
 
1910
        self.revision_id = revision_id
 
 
1913
class IllegalUseOfScopeReplacer(BzrError):
 
 
1915
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
1916
            " %(msg)s%(extra)s")
 
 
1918
    internal_error = True
 
 
1920
    def __init__(self, name, msg, extra=None):
 
 
1921
        BzrError.__init__(self)
 
 
1925
            self.extra = ': ' + str(extra)
 
 
1930
class InvalidImportLine(BzrError):
 
 
1932
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
1934
    internal_error = True
 
 
1936
    def __init__(self, text, msg):
 
 
1937
        BzrError.__init__(self)
 
 
1942
class ImportNameCollision(BzrError):
 
 
1944
    _fmt = ("Tried to import an object to the same name as"
 
 
1945
            " an existing object. %(name)s")
 
 
1947
    internal_error = True
 
 
1949
    def __init__(self, name):
 
 
1950
        BzrError.__init__(self)
 
 
1954
class NotAMergeDirective(BzrError):
 
 
1955
    """File starting with %(firstline)r is not a merge directive"""
 
 
1956
    def __init__(self, firstline):
 
 
1957
        BzrError.__init__(self, firstline=firstline)
 
 
1960
class NoMergeSource(BzrError):
 
 
1961
    """Raise if no merge source was specified for a merge directive"""
 
 
1963
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
1967
class PatchMissing(BzrError):
 
 
1968
    """Raise a patch type was specified but no patch supplied"""
 
 
1970
    _fmt = "patch_type was %(patch_type)s, but no patch was supplied."
 
 
1972
    def __init__(self, patch_type):
 
 
1973
        BzrError.__init__(self)
 
 
1974
        self.patch_type = patch_type
 
 
1977
class UnsupportedInventoryKind(BzrError):
 
 
1979
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
1981
    def __init__(self, kind):
 
 
1985
class BadSubsumeSource(BzrError):
 
 
1987
    _fmt = """Can't subsume %(other_tree)s into %(tree)s.  %(reason)s"""
 
 
1989
    def __init__(self, tree, other_tree, reason):
 
 
1991
        self.other_tree = other_tree
 
 
1992
        self.reason = reason
 
 
1995
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
1997
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
1999
    def __init__(self, other_tree):
 
 
2000
        self.other_tree = other_tree
 
 
2003
class BadReferenceTarget(BzrError):
 
 
2005
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s.  %(reason)s"
 
 
2007
    internal_error = True
 
 
2009
    def __init__(self, tree, other_tree, reason):
 
 
2011
        self.other_tree = other_tree
 
 
2012
        self.reason = reason
 
 
2015
class NoSuchTag(BzrError):
 
 
2017
    _fmt = "No such tag: %(tag_name)s"
 
 
2019
    def __init__(self, tag_name):
 
 
2020
        self.tag_name = tag_name
 
 
2023
class TagsNotSupported(BzrError):
 
 
2025
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2026
            " you may be able to use bzr upgrade.")
 
 
2028
    def __init__(self, branch):
 
 
2029
        self.branch = branch
 
 
2032
class TagAlreadyExists(BzrError):
 
 
2034
    _fmt = "Tag %(tag_name)s already exists."
 
 
2036
    def __init__(self, tag_name):
 
 
2037
        self.tag_name = tag_name