1
# Copyright (C) 2005, 2006, 2007, 2008 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. 'msg' is used instead of 'message' because
 
 
85
           python evolved and, in 2.6, forbids the use of 'message'.
 
 
87
        StandardError.__init__(self)
 
 
89
            # I was going to deprecate this, but it actually turns out to be
 
 
90
            # quite handy - mbp 20061103.
 
 
91
            self._preformatted_string = msg
 
 
93
            self._preformatted_string = None
 
 
94
            for key, value in kwds.items():
 
 
95
                setattr(self, key, value)
 
 
98
        s = getattr(self, '_preformatted_string', None)
 
 
100
            # contains a preformatted message
 
 
103
            fmt = self._get_format_string()
 
 
105
                d = dict(self.__dict__)
 
 
107
                # __str__() should always return a 'str' object
 
 
108
                # never a 'unicode' object.
 
 
110
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
 
111
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
 
112
                % (self.__class__.__name__,
 
 
114
                   getattr(self, '_fmt', None),
 
 
117
    def __unicode__(self):
 
 
119
        if isinstance(u, str):
 
 
120
            # Try decoding the str using the default encoding.
 
 
122
        elif not isinstance(u, unicode):
 
 
123
            # Try to make a unicode object from it, because __unicode__ must
 
 
124
            # return a unicode object.
 
 
130
        if isinstance(s, unicode):
 
 
133
            # __str__ must return a str.
 
 
138
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
 
140
    def _get_format_string(self):
 
 
141
        """Return format string for this exception or None"""
 
 
142
        fmt = getattr(self, '_fmt', None)
 
 
145
        fmt = getattr(self, '__doc__', None)
 
 
147
            symbol_versioning.warn("%s uses its docstring as a format, "
 
 
148
                    "it should use _fmt instead" % self.__class__.__name__,
 
 
151
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
 
152
            % (self.__class__.__name__,
 
 
154
               getattr(self, '_fmt', None),
 
 
157
    def __eq__(self, other):
 
 
158
        if self.__class__ != other.__class__:
 
 
159
            return NotImplemented
 
 
160
        return self.__dict__ == other.__dict__
 
 
163
class InternalBzrError(BzrError):
 
 
164
    """Base class for errors that are internal in nature.
 
 
166
    This is a convenience class for errors that are internal. The
 
 
167
    internal_error attribute can still be altered in subclasses, if needed.
 
 
168
    Using this class is simply an easy way to get internal errors.
 
 
171
    internal_error = True
 
 
174
class BzrNewError(BzrError):
 
 
175
    """Deprecated error base class."""
 
 
176
    # base classes should override the docstring with their human-
 
 
177
    # readable explanation
 
 
179
    def __init__(self, *args, **kwds):
 
 
180
        # XXX: Use the underlying BzrError to always generate the args
 
 
181
        # attribute if it doesn't exist.  We can't use super here, because
 
 
182
        # exceptions are old-style classes in python2.4 (but new in 2.5).
 
 
184
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
 
185
             'please convert %s to use BzrError instead'
 
 
186
             % self.__class__.__name__,
 
 
189
        BzrError.__init__(self, *args)
 
 
190
        for key, value in kwds.items():
 
 
191
            setattr(self, key, value)
 
 
195
            # __str__() should always return a 'str' object
 
 
196
            # never a 'unicode' object.
 
 
197
            s = self.__doc__ % self.__dict__
 
 
198
            if isinstance(s, unicode):
 
 
199
                return s.encode('utf8')
 
 
201
        except (TypeError, NameError, ValueError, KeyError), e:
 
 
202
            return 'Unprintable exception %s(%r): %r' \
 
 
203
                % (self.__class__.__name__,
 
 
207
class AlreadyBuilding(BzrError):
 
 
209
    _fmt = "The tree builder is already building a tree."
 
 
212
class BranchError(BzrError):
 
 
213
    """Base class for concrete 'errors about a branch'."""
 
 
215
    def __init__(self, branch):
 
 
216
        BzrError.__init__(self, branch=branch)
 
 
219
class BzrCheckError(InternalBzrError):
 
 
221
    _fmt = "Internal check failed: %(msg)s"
 
 
223
    def __init__(self, msg):
 
 
224
        BzrError.__init__(self)
 
 
228
class DirstateCorrupt(BzrError):
 
 
230
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
 
232
    def __init__(self, state, msg):
 
 
233
        BzrError.__init__(self)
 
 
238
class DisabledMethod(InternalBzrError):
 
 
240
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
 
242
    def __init__(self, class_name):
 
 
243
        BzrError.__init__(self)
 
 
244
        self.class_name = class_name
 
 
247
class IncompatibleAPI(BzrError):
 
 
249
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
 
250
        'It supports versions "%(minimum)s" to "%(current)s".'
 
 
252
    def __init__(self, api, wanted, minimum, current):
 
 
255
        self.minimum = minimum
 
 
256
        self.current = current
 
 
259
class InProcessTransport(BzrError):
 
 
261
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
 
264
    def __init__(self, transport):
 
 
265
        self.transport = transport
 
 
268
class InvalidEntryName(InternalBzrError):
 
 
270
    _fmt = "Invalid entry name: %(name)s"
 
 
272
    def __init__(self, name):
 
 
273
        BzrError.__init__(self)
 
 
277
class InvalidRevisionNumber(BzrError):
 
 
279
    _fmt = "Invalid revision number %(revno)s"
 
 
281
    def __init__(self, revno):
 
 
282
        BzrError.__init__(self)
 
 
286
class InvalidRevisionId(BzrError):
 
 
288
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
 
290
    def __init__(self, revision_id, branch):
 
 
291
        # branch can be any string or object with __str__ defined
 
 
292
        BzrError.__init__(self)
 
 
293
        self.revision_id = revision_id
 
 
297
class ReservedId(BzrError):
 
 
299
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
 
301
    def __init__(self, revision_id):
 
 
302
        self.revision_id = revision_id
 
 
305
class RootMissing(InternalBzrError):
 
 
307
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
 
308
        "record_entry_contents.")
 
 
311
class NoPublicBranch(BzrError):
 
 
313
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
 
315
    def __init__(self, branch):
 
 
316
        import bzrlib.urlutils as urlutils
 
 
317
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
318
        BzrError.__init__(self, branch_url=public_location)
 
 
321
class NoHelpTopic(BzrError):
 
 
323
    _fmt = ("No help could be found for '%(topic)s'. "
 
 
324
        "Please use 'bzr help topics' to obtain a list of topics.")
 
 
326
    def __init__(self, topic):
 
 
330
class NoSuchId(BzrError):
 
 
332
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
 
 
334
    def __init__(self, tree, file_id):
 
 
335
        BzrError.__init__(self)
 
 
336
        self.file_id = file_id
 
 
340
class NoSuchIdInRepository(NoSuchId):
 
 
342
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
 
345
    def __init__(self, repository, file_id):
 
 
346
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
 
349
class NotStacked(BranchError):
 
 
351
    _fmt = "The branch '%(branch)s' is not stacked."
 
 
354
class InventoryModified(InternalBzrError):
 
 
356
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
 
357
            " so a clean inventory cannot be read without data loss.")
 
 
359
    def __init__(self, tree):
 
 
363
class NoWorkingTree(BzrError):
 
 
365
    _fmt = 'No WorkingTree exists for "%(base)s".'
 
 
367
    def __init__(self, base):
 
 
368
        BzrError.__init__(self)
 
 
372
class NotBuilding(BzrError):
 
 
374
    _fmt = "Not currently building a tree."
 
 
377
class NotLocalUrl(BzrError):
 
 
379
    _fmt = "%(url)s is not a local path."
 
 
381
    def __init__(self, url):
 
 
385
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
 
387
    _fmt = 'Working tree already populated in "%(base)s"'
 
 
389
    def __init__(self, base):
 
 
393
class BzrCommandError(BzrError):
 
 
394
    """Error from user command"""
 
 
396
    # Error from malformed user command; please avoid raising this as a
 
 
397
    # generic exception not caused by user input.
 
 
399
    # I think it's a waste of effort to differentiate between errors that
 
 
400
    # are not intended to be caught anyway.  UI code need not subclass
 
 
401
    # BzrCommandError, and non-UI code should not throw a subclass of
 
 
402
    # BzrCommandError.  ADHB 20051211
 
 
405
class NotWriteLocked(BzrError):
 
 
407
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
 
409
    def __init__(self, not_locked):
 
 
410
        self.not_locked = not_locked
 
 
413
class BzrOptionError(BzrCommandError):
 
 
415
    _fmt = "Error in command line options"
 
 
418
class BadIndexFormatSignature(BzrError):
 
 
420
    _fmt = "%(value)s is not an index of type %(_type)s."
 
 
422
    def __init__(self, value, _type):
 
 
423
        BzrError.__init__(self)
 
 
428
class BadIndexData(BzrError):
 
 
430
    _fmt = "Error in data for index %(value)s."
 
 
432
    def __init__(self, value):
 
 
433
        BzrError.__init__(self)
 
 
437
class BadIndexDuplicateKey(BzrError):
 
 
439
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
 
441
    def __init__(self, key, index):
 
 
442
        BzrError.__init__(self)
 
 
447
class BadIndexKey(BzrError):
 
 
449
    _fmt = "The key '%(key)s' is not a valid key."
 
 
451
    def __init__(self, key):
 
 
452
        BzrError.__init__(self)
 
 
456
class BadIndexOptions(BzrError):
 
 
458
    _fmt = "Could not parse options for index %(value)s."
 
 
460
    def __init__(self, value):
 
 
461
        BzrError.__init__(self)
 
 
465
class BadIndexValue(BzrError):
 
 
467
    _fmt = "The value '%(value)s' is not a valid value."
 
 
469
    def __init__(self, value):
 
 
470
        BzrError.__init__(self)
 
 
474
class BadOptionValue(BzrError):
 
 
476
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
 
478
    def __init__(self, name, value):
 
 
479
        BzrError.__init__(self, name=name, value=value)
 
 
482
class StrictCommitFailed(BzrError):
 
 
484
    _fmt = "Commit refused because there are unknown files in the tree"
 
 
487
# XXX: Should be unified with TransportError; they seem to represent the
 
 
489
# RBC 20060929: I think that unifiying with TransportError would be a mistake
 
 
490
# - this is finer than a TransportError - and more useful as such. It 
 
 
491
# differentiates between 'transport has failed' and 'operation on a transport
 
 
493
class PathError(BzrError):
 
 
495
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
 
497
    def __init__(self, path, extra=None):
 
 
498
        BzrError.__init__(self)
 
 
501
            self.extra = ': ' + str(extra)
 
 
506
class NoSuchFile(PathError):
 
 
508
    _fmt = "No such file: %(path)r%(extra)s"
 
 
511
class FileExists(PathError):
 
 
513
    _fmt = "File exists: %(path)r%(extra)s"
 
 
516
class RenameFailedFilesExist(BzrError):
 
 
517
    """Used when renaming and both source and dest exist."""
 
 
519
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
 
520
            " (Use --after to tell bzr about a rename that has already"
 
 
521
            " happened)%(extra)s")
 
 
523
    def __init__(self, source, dest, extra=None):
 
 
524
        BzrError.__init__(self)
 
 
525
        self.source = str(source)
 
 
526
        self.dest = str(dest)
 
 
528
            self.extra = ' ' + str(extra)
 
 
533
class NotADirectory(PathError):
 
 
535
    _fmt = '"%(path)s" is not a directory %(extra)s'
 
 
538
class NotInWorkingDirectory(PathError):
 
 
540
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
 
 
543
class DirectoryNotEmpty(PathError):
 
 
545
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
 
548
class HardLinkNotSupported(PathError):
 
 
550
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
 
553
class ReadingCompleted(InternalBzrError):
 
 
555
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
 
556
            "called upon it - the request has been completed and no more "
 
 
559
    def __init__(self, request):
 
 
560
        self.request = request
 
 
563
class ResourceBusy(PathError):
 
 
565
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
 
 
568
class PermissionDenied(PathError):
 
 
570
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
 
573
class InvalidURL(PathError):
 
 
575
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
 
578
class InvalidURLJoin(PathError):
 
 
580
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
 
582
    def __init__(self, reason, base, join_args):
 
 
585
        self.join_args = join_args
 
 
586
        PathError.__init__(self, base, reason)
 
 
589
class InvalidRebaseURLs(PathError):
 
 
591
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
 
593
    def __init__(self, from_, to):
 
 
596
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
 
599
class UnavailableRepresentation(InternalBzrError):
 
 
601
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
 
602
        "is encoded as '%(native)s'.")
 
 
604
    def __init__(self, key, wanted, native):
 
 
605
        InternalBzrError.__init__(self)
 
 
611
class UnknownHook(BzrError):
 
 
613
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
 
615
    def __init__(self, hook_type, hook_name):
 
 
616
        BzrError.__init__(self)
 
 
617
        self.type = hook_type
 
 
618
        self.hook = hook_name
 
 
621
class UnsupportedProtocol(PathError):
 
 
623
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
 
625
    def __init__(self, url, extra):
 
 
626
        PathError.__init__(self, url, extra=extra)
 
 
629
class UnstackableBranchFormat(BzrError):
 
 
631
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
 
632
        "You will need to upgrade the branch to permit branch stacking.")
 
 
634
    def __init__(self, format, url):
 
 
635
        BzrError.__init__(self)
 
 
640
class UnstackableRepositoryFormat(BzrError):
 
 
642
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
 
643
        "You will need to upgrade the repository to permit branch stacking.")
 
 
645
    def __init__(self, format, url):
 
 
646
        BzrError.__init__(self)
 
 
651
class ReadError(PathError):
 
 
653
    _fmt = """Error reading from %(path)r."""
 
 
656
class ShortReadvError(PathError):
 
 
658
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
 
659
            ' at %(offset)s for "%(path)s"%(extra)s')
 
 
661
    internal_error = True
 
 
663
    def __init__(self, path, offset, length, actual, extra=None):
 
 
664
        PathError.__init__(self, path, extra=extra)
 
 
670
class PathNotChild(PathError):
 
 
672
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
 
674
    internal_error = True
 
 
676
    def __init__(self, path, base, extra=None):
 
 
677
        BzrError.__init__(self)
 
 
681
            self.extra = ': ' + str(extra)
 
 
686
class InvalidNormalization(PathError):
 
 
688
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
 
691
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
 
692
# the exception object is a bit undesirable.
 
 
693
# TODO: Probably this behavior of should be a common superclass 
 
 
694
class NotBranchError(PathError):
 
 
696
    _fmt = 'Not a branch: "%(path)s".'
 
 
698
    def __init__(self, path):
 
 
699
       import bzrlib.urlutils as urlutils
 
 
700
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
 
703
class NoSubmitBranch(PathError):
 
 
705
    _fmt = 'No submit branch available for branch "%(path)s"'
 
 
707
    def __init__(self, branch):
 
 
708
       import bzrlib.urlutils as urlutils
 
 
709
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
712
class AlreadyBranchError(PathError):
 
 
714
    _fmt = 'Already a branch: "%(path)s".'
 
 
717
class BranchExistsWithoutWorkingTree(PathError):
 
 
719
    _fmt = 'Directory contains a branch, but no working tree \
 
 
720
(use bzr checkout if you wish to build a working tree): "%(path)s"'
 
 
723
class AtomicFileAlreadyClosed(PathError):
 
 
725
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
 
728
    def __init__(self, path, function):
 
 
729
        PathError.__init__(self, path=path, extra=None)
 
 
730
        self.function = function
 
 
733
class InaccessibleParent(PathError):
 
 
735
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
 
736
            ' relative path "%(path)s"')
 
 
738
    def __init__(self, path, base):
 
 
739
        PathError.__init__(self, path)
 
 
743
class NoRepositoryPresent(BzrError):
 
 
745
    _fmt = 'No repository present: "%(path)s"'
 
 
746
    def __init__(self, bzrdir):
 
 
747
        BzrError.__init__(self)
 
 
748
        self.path = bzrdir.transport.clone('..').base
 
 
751
class FileInWrongBranch(BzrError):
 
 
753
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
 
 
755
    def __init__(self, branch, path):
 
 
756
        BzrError.__init__(self)
 
 
758
        self.branch_base = branch.base
 
 
762
class UnsupportedFormatError(BzrError):
 
 
764
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
 
767
class UnknownFormatError(BzrError):
 
 
769
    _fmt = "Unknown %(kind)s format: %(format)r"
 
 
771
    def __init__(self, format, kind='branch'):
 
 
776
class IncompatibleFormat(BzrError):
 
 
778
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
780
    def __init__(self, format, bzrdir_format):
 
 
781
        BzrError.__init__(self)
 
 
783
        self.bzrdir = bzrdir_format
 
 
786
class IncompatibleRepositories(BzrError):
 
 
788
    _fmt = "%(target)s\n" \
 
 
789
            "is not compatible with\n" \
 
 
793
    def __init__(self, source, target, details=None):
 
 
795
            details = "(no details)"
 
 
796
        BzrError.__init__(self, target=target, source=source, details=details)
 
 
799
class IncompatibleRevision(BzrError):
 
 
801
    _fmt = "Revision is not compatible with %(repo_format)s"
 
 
803
    def __init__(self, repo_format):
 
 
804
        BzrError.__init__(self)
 
 
805
        self.repo_format = repo_format
 
 
808
class AlreadyVersionedError(BzrError):
 
 
809
    """Used when a path is expected not to be versioned, but it is."""
 
 
811
    _fmt = "%(context_info)s%(path)s is already versioned."
 
 
813
    def __init__(self, path, context_info=None):
 
 
814
        """Construct a new AlreadyVersionedError.
 
 
816
        :param path: This is the path which is versioned,
 
 
817
        which should be in a user friendly form.
 
 
818
        :param context_info: If given, this is information about the context,
 
 
819
        which could explain why this is expected to not be versioned.
 
 
821
        BzrError.__init__(self)
 
 
823
        if context_info is None:
 
 
824
            self.context_info = ''
 
 
826
            self.context_info = context_info + ". "
 
 
829
class NotVersionedError(BzrError):
 
 
830
    """Used when a path is expected to be versioned, but it is not."""
 
 
832
    _fmt = "%(context_info)s%(path)s is not versioned."
 
 
834
    def __init__(self, path, context_info=None):
 
 
835
        """Construct a new NotVersionedError.
 
 
837
        :param path: This is the path which is not versioned,
 
 
838
        which should be in a user friendly form.
 
 
839
        :param context_info: If given, this is information about the context,
 
 
840
        which could explain why this is expected to be versioned.
 
 
842
        BzrError.__init__(self)
 
 
844
        if context_info is None:
 
 
845
            self.context_info = ''
 
 
847
            self.context_info = context_info + ". "
 
 
850
class PathsNotVersionedError(BzrError):
 
 
851
    """Used when reporting several paths which are not versioned"""
 
 
853
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
 
855
    def __init__(self, paths):
 
 
856
        from bzrlib.osutils import quotefn
 
 
857
        BzrError.__init__(self)
 
 
859
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
862
class PathsDoNotExist(BzrError):
 
 
864
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
 
866
    # used when reporting that paths are neither versioned nor in the working
 
 
869
    def __init__(self, paths, extra=None):
 
 
871
        from bzrlib.osutils import quotefn
 
 
872
        BzrError.__init__(self)
 
 
874
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
876
            self.extra = ': ' + str(extra)
 
 
881
class BadFileKindError(BzrError):
 
 
883
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
 
885
    def __init__(self, filename, kind):
 
 
886
        BzrError.__init__(self, filename=filename, kind=kind)
 
 
889
class BadFilenameEncoding(BzrError):
 
 
891
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
 
892
            ' encoding %(fs_encoding)s')
 
 
894
    def __init__(self, filename, fs_encoding):
 
 
895
        BzrError.__init__(self)
 
 
896
        self.filename = filename
 
 
897
        self.fs_encoding = fs_encoding
 
 
900
class ForbiddenControlFileError(BzrError):
 
 
902
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
 
905
class LockError(InternalBzrError):
 
 
907
    _fmt = "Lock error: %(msg)s"
 
 
909
    # All exceptions from the lock/unlock functions should be from
 
 
910
    # this exception class.  They will be translated as necessary. The
 
 
911
    # original exception is available as e.original_error
 
 
913
    # New code should prefer to raise specific subclasses
 
 
914
    def __init__(self, message):
 
 
915
        # Python 2.5 uses a slot for StandardError.message,
 
 
916
        # so use a different variable name.  We now work around this in
 
 
917
        # BzrError.__str__, but this member name is kept for compatability.
 
 
921
class LockActive(LockError):
 
 
923
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
 
925
    internal_error = False
 
 
927
    def __init__(self, lock_description):
 
 
928
        self.lock_description = lock_description
 
 
931
class CommitNotPossible(LockError):
 
 
933
    _fmt = "A commit was attempted but we do not have a write lock open."
 
 
939
class AlreadyCommitted(LockError):
 
 
941
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
 
947
class ReadOnlyError(LockError):
 
 
949
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
 
951
    # TODO: There should also be an error indicating that you need a write
 
 
952
    # lock and don't have any lock at all... mbp 20070226
 
 
954
    def __init__(self, obj):
 
 
958
class LockFailed(LockError):
 
 
960
    internal_error = False
 
 
962
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
 
964
    def __init__(self, lock, why):
 
 
965
        LockError.__init__(self, '')
 
 
970
class OutSideTransaction(BzrError):
 
 
972
    _fmt = ("A transaction related operation was attempted after"
 
 
973
            " the transaction finished.")
 
 
976
class ObjectNotLocked(LockError):
 
 
978
    _fmt = "%(obj)r is not locked"
 
 
980
    # this can indicate that any particular object is not locked; see also
 
 
981
    # LockNotHeld which means that a particular *lock* object is not held by
 
 
982
    # the caller -- perhaps they should be unified.
 
 
983
    def __init__(self, obj):
 
 
987
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
 
989
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
 
991
    def __init__(self, obj):
 
 
995
class UnlockableTransport(LockError):
 
 
997
    internal_error = False
 
 
999
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
 
1001
    def __init__(self, transport):
 
 
1002
        self.transport = transport
 
 
1005
class LockContention(LockError):
 
 
1007
    _fmt = 'Could not acquire lock "%(lock)s"'
 
 
1008
    # TODO: show full url for lock, combining the transport and relative
 
 
1011
    internal_error = False
 
 
1013
    def __init__(self, lock):
 
 
1017
class LockBroken(LockError):
 
 
1019
    _fmt = ("Lock was broken while still open: %(lock)s"
 
 
1020
            " - check storage consistency!")
 
 
1022
    internal_error = False
 
 
1024
    def __init__(self, lock):
 
 
1028
class LockBreakMismatch(LockError):
 
 
1030
    _fmt = ("Lock was released and re-acquired before being broken:"
 
 
1031
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
 
1033
    internal_error = False
 
 
1035
    def __init__(self, lock, holder, target):
 
 
1037
        self.holder = holder
 
 
1038
        self.target = target
 
 
1041
class LockNotHeld(LockError):
 
 
1043
    _fmt = "Lock not held: %(lock)s"
 
 
1045
    internal_error = False
 
 
1047
    def __init__(self, lock):
 
 
1051
class TokenLockingNotSupported(LockError):
 
 
1053
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
 
1055
    def __init__(self, obj):
 
 
1059
class TokenMismatch(LockBroken):
 
 
1061
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
 
1063
    internal_error = True
 
 
1065
    def __init__(self, given_token, lock_token):
 
 
1066
        self.given_token = given_token
 
 
1067
        self.lock_token = lock_token
 
 
1070
class PointlessCommit(BzrError):
 
 
1072
    _fmt = "No changes to commit"
 
 
1075
class CannotCommitSelectedFileMerge(BzrError):
 
 
1077
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
 
1078
        ' files %(files_str)s'
 
 
1080
    def __init__(self, files):
 
 
1081
        files_str = ', '.join(files)
 
 
1082
        BzrError.__init__(self, files=files, files_str=files_str)
 
 
1085
class BadCommitMessageEncoding(BzrError):
 
 
1087
    _fmt = 'The specified commit message contains characters unsupported by '\
 
 
1088
        'the current encoding.'
 
 
1091
class UpgradeReadonly(BzrError):
 
 
1093
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
 
1096
class UpToDateFormat(BzrError):
 
 
1098
    _fmt = "The branch format %(format)s is already at the most recent format."
 
 
1100
    def __init__(self, format):
 
 
1101
        BzrError.__init__(self)
 
 
1102
        self.format = format
 
 
1105
class StrictCommitFailed(Exception):
 
 
1107
    _fmt = "Commit refused because there are unknowns in the tree."
 
 
1110
class NoSuchRevision(InternalBzrError):
 
 
1112
    _fmt = "%(branch)s has no revision %(revision)s"
 
 
1114
    def __init__(self, branch, revision):
 
 
1115
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
 
1116
        BzrError.__init__(self, branch=branch, revision=revision)
 
 
1119
class RangeInChangeOption(BzrError):
 
 
1121
    _fmt = "Option --change does not accept revision ranges"
 
 
1124
class NoSuchRevisionSpec(BzrError):
 
 
1126
    _fmt = "No namespace registered for string: %(spec)r"
 
 
1128
    def __init__(self, spec):
 
 
1129
        BzrError.__init__(self, spec=spec)
 
 
1132
class NoSuchRevisionInTree(NoSuchRevision):
 
 
1133
    """When using Tree.revision_tree, and the revision is not accessible."""
 
 
1135
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
 
1137
    def __init__(self, tree, revision_id):
 
 
1138
        BzrError.__init__(self)
 
 
1140
        self.revision_id = revision_id
 
 
1143
class InvalidRevisionSpec(BzrError):
 
 
1145
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
1146
            " %(branch)s%(extra)s")
 
 
1148
    def __init__(self, spec, branch, extra=None):
 
 
1149
        BzrError.__init__(self, branch=branch, spec=spec)
 
 
1151
            self.extra = '\n' + str(extra)
 
 
1156
class HistoryMissing(BzrError):
 
 
1158
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
 
1161
class AppendRevisionsOnlyViolation(BzrError):
 
 
1163
    _fmt = ('Operation denied because it would change the main history,'
 
 
1164
           ' which is not permitted by the append_revisions_only setting on'
 
 
1165
           ' branch "%(location)s".')
 
 
1167
    def __init__(self, location):
 
 
1168
       import bzrlib.urlutils as urlutils
 
 
1169
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
1170
       BzrError.__init__(self, location=location)
 
 
1173
class DivergedBranches(BzrError):
 
 
1175
    _fmt = ("These branches have diverged."
 
 
1176
            " Use the merge command to reconcile them.")
 
 
1178
    def __init__(self, branch1, branch2):
 
 
1179
        self.branch1 = branch1
 
 
1180
        self.branch2 = branch2
 
 
1183
class NotLefthandHistory(InternalBzrError):
 
 
1185
    _fmt = "Supplied history does not follow left-hand parents"
 
 
1187
    def __init__(self, history):
 
 
1188
        BzrError.__init__(self, history=history)
 
 
1191
class UnrelatedBranches(BzrError):
 
 
1193
    _fmt = ("Branches have no common ancestor, and"
 
 
1194
            " no merge base revision was specified.")
 
 
1197
class CannotReverseCherrypick(BzrError):
 
 
1199
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
 
1203
class NoCommonAncestor(BzrError):
 
 
1205
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
 
1207
    def __init__(self, revision_a, revision_b):
 
 
1208
        self.revision_a = revision_a
 
 
1209
        self.revision_b = revision_b
 
 
1212
class NoCommonRoot(BzrError):
 
 
1214
    _fmt = ("Revisions are not derived from the same root: "
 
 
1215
           "%(revision_a)s %(revision_b)s.")
 
 
1217
    def __init__(self, revision_a, revision_b):
 
 
1218
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
 
1221
class NotAncestor(BzrError):
 
 
1223
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
 
1225
    def __init__(self, rev_id, not_ancestor_id):
 
 
1226
        BzrError.__init__(self, rev_id=rev_id,
 
 
1227
            not_ancestor_id=not_ancestor_id)
 
 
1230
class InstallFailed(BzrError):
 
 
1232
    def __init__(self, revisions):
 
 
1233
        revision_str = ", ".join(str(r) for r in revisions)
 
 
1234
        msg = "Could not install revisions:\n%s" % revision_str
 
 
1235
        BzrError.__init__(self, msg)
 
 
1236
        self.revisions = revisions
 
 
1239
class AmbiguousBase(BzrError):
 
 
1241
    def __init__(self, bases):
 
 
1242
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
 
1244
        msg = ("The correct base is unclear, because %s are all equally close"
 
 
1246
        BzrError.__init__(self, msg)
 
 
1250
class NoCommits(BranchError):
 
 
1252
    _fmt = "Branch %(branch)s has no commits."
 
 
1255
class UnlistableStore(BzrError):
 
 
1257
    def __init__(self, store):
 
 
1258
        BzrError.__init__(self, "Store %s is not listable" % store)
 
 
1262
class UnlistableBranch(BzrError):
 
 
1264
    def __init__(self, br):
 
 
1265
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
 
1268
class BoundBranchOutOfDate(BzrError):
 
 
1270
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
 
1273
    def __init__(self, branch, master):
 
 
1274
        BzrError.__init__(self)
 
 
1275
        self.branch = branch
 
 
1276
        self.master = master
 
 
1279
class CommitToDoubleBoundBranch(BzrError):
 
 
1281
    _fmt = ("Cannot commit to branch %(branch)s."
 
 
1282
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
 
1284
    def __init__(self, branch, master, remote):
 
 
1285
        BzrError.__init__(self)
 
 
1286
        self.branch = branch
 
 
1287
        self.master = master
 
 
1288
        self.remote = remote
 
 
1291
class OverwriteBoundBranch(BzrError):
 
 
1293
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
 
1295
    def __init__(self, branch):
 
 
1296
        BzrError.__init__(self)
 
 
1297
        self.branch = branch
 
 
1300
class BoundBranchConnectionFailure(BzrError):
 
 
1302
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
 
1303
            " => %(target)s: %(error)s")
 
 
1305
    def __init__(self, branch, target, error):
 
 
1306
        BzrError.__init__(self)
 
 
1307
        self.branch = branch
 
 
1308
        self.target = target
 
 
1312
class WeaveError(BzrError):
 
 
1314
    _fmt = "Error in processing weave: %(msg)s"
 
 
1316
    def __init__(self, msg=None):
 
 
1317
        BzrError.__init__(self)
 
 
1321
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1323
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1325
    def __init__(self, revision_id, weave):
 
 
1327
        WeaveError.__init__(self)
 
 
1328
        self.revision_id = revision_id
 
 
1332
class WeaveRevisionNotPresent(WeaveError):
 
 
1334
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1336
    def __init__(self, revision_id, weave):
 
 
1337
        WeaveError.__init__(self)
 
 
1338
        self.revision_id = revision_id
 
 
1342
class WeaveFormatError(WeaveError):
 
 
1344
    _fmt = "Weave invariant violated: %(what)s"
 
 
1346
    def __init__(self, what):
 
 
1347
        WeaveError.__init__(self)
 
 
1351
class WeaveParentMismatch(WeaveError):
 
 
1353
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
 
1356
class WeaveInvalidChecksum(WeaveError):
 
 
1358
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1361
class WeaveTextDiffers(WeaveError):
 
 
1363
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1364
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1366
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1367
        WeaveError.__init__(self)
 
 
1368
        self.revision_id = revision_id
 
 
1369
        self.weave_a = weave_a
 
 
1370
        self.weave_b = weave_b
 
 
1373
class WeaveTextDiffers(WeaveError):
 
 
1375
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1376
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1378
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1379
        WeaveError.__init__(self)
 
 
1380
        self.revision_id = revision_id
 
 
1381
        self.weave_a = weave_a
 
 
1382
        self.weave_b = weave_b
 
 
1385
class VersionedFileError(BzrError):
 
 
1387
    _fmt = "Versioned file error"
 
 
1390
class RevisionNotPresent(VersionedFileError):
 
 
1392
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
 
1394
    def __init__(self, revision_id, file_id):
 
 
1395
        VersionedFileError.__init__(self)
 
 
1396
        self.revision_id = revision_id
 
 
1397
        self.file_id = file_id
 
 
1400
class RevisionAlreadyPresent(VersionedFileError):
 
 
1402
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
 
1404
    def __init__(self, revision_id, file_id):
 
 
1405
        VersionedFileError.__init__(self)
 
 
1406
        self.revision_id = revision_id
 
 
1407
        self.file_id = file_id
 
 
1410
class VersionedFileInvalidChecksum(VersionedFileError):
 
 
1412
    _fmt = "Text did not match its checksum: %(message)s"
 
 
1415
class KnitError(InternalBzrError):
 
 
1420
class KnitCorrupt(KnitError):
 
 
1422
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1424
    def __init__(self, filename, how):
 
 
1425
        KnitError.__init__(self)
 
 
1426
        self.filename = filename
 
 
1430
class SHA1KnitCorrupt(KnitCorrupt):
 
 
1432
    _fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
 
 
1433
        "match expected sha-1. key %(key)s expected sha %(expected)s actual "
 
 
1436
    def __init__(self, filename, actual, expected, key, content):
 
 
1437
        KnitError.__init__(self)
 
 
1438
        self.filename = filename
 
 
1439
        self.actual = actual
 
 
1440
        self.expected = expected
 
 
1442
        self.content = content
 
 
1445
class KnitDataStreamIncompatible(KnitError):
 
 
1446
    # Not raised anymore, as we can convert data streams.  In future we may
 
 
1447
    # need it again for more exotic cases, so we're keeping it around for now.
 
 
1449
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
 
1451
    def __init__(self, stream_format, target_format):
 
 
1452
        self.stream_format = stream_format
 
 
1453
        self.target_format = target_format
 
 
1456
class KnitDataStreamUnknown(KnitError):
 
 
1457
    # Indicates a data stream we don't know how to handle.
 
 
1459
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
 
1461
    def __init__(self, stream_format):
 
 
1462
        self.stream_format = stream_format
 
 
1465
class KnitHeaderError(KnitError):
 
 
1467
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
 
1469
    def __init__(self, badline, filename):
 
 
1470
        KnitError.__init__(self)
 
 
1471
        self.badline = badline
 
 
1472
        self.filename = filename
 
 
1474
class KnitIndexUnknownMethod(KnitError):
 
 
1475
    """Raised when we don't understand the storage method.
 
 
1477
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1480
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1481
            " in options: %(options)r")
 
 
1483
    def __init__(self, filename, options):
 
 
1484
        KnitError.__init__(self)
 
 
1485
        self.filename = filename
 
 
1486
        self.options = options
 
 
1489
class NoSuchExportFormat(BzrError):
 
 
1491
    _fmt = "Export format %(format)r not supported"
 
 
1493
    def __init__(self, format):
 
 
1494
        BzrError.__init__(self)
 
 
1495
        self.format = format
 
 
1498
class TransportError(BzrError):
 
 
1500
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1502
    def __init__(self, msg=None, orig_error=None):
 
 
1503
        if msg is None and orig_error is not None:
 
 
1504
            msg = str(orig_error)
 
 
1505
        if orig_error is None:
 
 
1510
        self.orig_error = orig_error
 
 
1511
        BzrError.__init__(self)
 
 
1514
class TooManyConcurrentRequests(InternalBzrError):
 
 
1516
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1517
            " Be sure to finish_writing and finish_reading on the"
 
 
1518
            " currently open request.")
 
 
1520
    def __init__(self, medium):
 
 
1521
        self.medium = medium
 
 
1524
class SmartProtocolError(TransportError):
 
 
1526
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1528
    def __init__(self, details):
 
 
1529
        self.details = details
 
 
1532
class UnexpectedProtocolVersionMarker(TransportError):
 
 
1534
    _fmt = "Received bad protocol version marker: %(marker)r"
 
 
1536
    def __init__(self, marker):
 
 
1537
        self.marker = marker
 
 
1540
class UnknownSmartMethod(InternalBzrError):
 
 
1542
    _fmt = "The server does not recognise the '%(verb)s' request."
 
 
1544
    def __init__(self, verb):
 
 
1548
class SmartMessageHandlerError(InternalBzrError):
 
 
1550
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
 
1552
    def __init__(self, exc_info):
 
 
1553
        self.exc_type, self.exc_value, self.tb = exc_info
 
 
1556
# A set of semi-meaningful errors which can be thrown
 
 
1557
class TransportNotPossible(TransportError):
 
 
1559
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1562
class ConnectionError(TransportError):
 
 
1564
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1567
class SocketConnectionError(ConnectionError):
 
 
1569
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1571
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1573
            msg = 'Failed to connect to'
 
 
1574
        if orig_error is None:
 
 
1577
            orig_error = '; ' + str(orig_error)
 
 
1578
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1583
            self.port = ':%s' % port
 
 
1586
class ConnectionReset(TransportError):
 
 
1588
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1591
class InvalidRange(TransportError):
 
 
1593
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
 
1595
    def __init__(self, path, offset, msg=None):
 
 
1596
        TransportError.__init__(self, msg)
 
 
1598
        self.offset = offset
 
 
1601
class InvalidHttpResponse(TransportError):
 
 
1603
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1605
    def __init__(self, path, msg, orig_error=None):
 
 
1607
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1610
class InvalidHttpRange(InvalidHttpResponse):
 
 
1612
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1614
    def __init__(self, path, range, msg):
 
 
1616
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1619
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1621
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1623
    def __init__(self, path, ctype, msg):
 
 
1625
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1628
class RedirectRequested(TransportError):
 
 
1630
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1632
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
 
1633
        self.source = source
 
 
1634
        self.target = target
 
 
1636
            self.permanently = ' permanently'
 
 
1638
            self.permanently = ''
 
 
1639
        self._qualified_proto = qual_proto
 
 
1640
        TransportError.__init__(self)
 
 
1642
    def _requalify_url(self, url):
 
 
1643
        """Restore the qualified proto in front of the url"""
 
 
1644
        # When this exception is raised, source and target are in
 
 
1645
        # user readable format. But some transports may use a
 
 
1646
        # different proto (http+urllib:// will present http:// to
 
 
1647
        # the user. If a qualified proto is specified, the code
 
 
1648
        # trapping the exception can get the qualified urls to
 
 
1649
        # properly handle the redirection themself (creating a
 
 
1650
        # new transport object from the target url for example).
 
 
1651
        # But checking that the scheme of the original and
 
 
1652
        # redirected urls are the same can be tricky. (see the
 
 
1653
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1655
        if self._qualified_proto is None:
 
 
1658
        # The TODO related to NotBranchError mention that doing
 
 
1659
        # that kind of manipulation on the urls may not be the
 
 
1660
        # exception object job. On the other hand, this object is
 
 
1661
        # the interface between the code and the user so
 
 
1662
        # presenting the urls in different ways is indeed its
 
 
1665
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1666
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1669
    def get_source_url(self):
 
 
1670
        return self._requalify_url(self.source)
 
 
1672
    def get_target_url(self):
 
 
1673
        return self._requalify_url(self.target)
 
 
1676
class TooManyRedirections(TransportError):
 
 
1678
    _fmt = "Too many redirections"
 
 
1681
class ConflictsInTree(BzrError):
 
 
1683
    _fmt = "Working tree has conflicts."
 
 
1686
class ParseConfigError(BzrError):
 
 
1688
    def __init__(self, errors, filename):
 
 
1689
        if filename is None:
 
 
1691
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1692
            (filename, ('\n'.join(e.msg for e in errors)))
 
 
1693
        BzrError.__init__(self, message)
 
 
1696
class NoEmailInUsername(BzrError):
 
 
1698
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1700
    def __init__(self, username):
 
 
1701
        BzrError.__init__(self)
 
 
1702
        self.username = username
 
 
1705
class SigningFailed(BzrError):
 
 
1707
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
 
1709
    def __init__(self, command_line):
 
 
1710
        BzrError.__init__(self, command_line=command_line)
 
 
1713
class WorkingTreeNotRevision(BzrError):
 
 
1715
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1716
            " the last commit, but weave merge requires that it be"
 
 
1719
    def __init__(self, tree):
 
 
1720
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1723
class CantReprocessAndShowBase(BzrError):
 
 
1725
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1726
           "the relationship of conflicting lines to the base")
 
 
1729
class GraphCycleError(BzrError):
 
 
1731
    _fmt = "Cycle in graph %(graph)r"
 
 
1733
    def __init__(self, graph):
 
 
1734
        BzrError.__init__(self)
 
 
1738
class WritingCompleted(InternalBzrError):
 
 
1740
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1741
            "called upon it - accept bytes may not be called anymore.")
 
 
1743
    def __init__(self, request):
 
 
1744
        self.request = request
 
 
1747
class WritingNotComplete(InternalBzrError):
 
 
1749
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1750
            "called upon it - until the write phase is complete no "
 
 
1751
            "data may be read.")
 
 
1753
    def __init__(self, request):
 
 
1754
        self.request = request
 
 
1757
class NotConflicted(BzrError):
 
 
1759
    _fmt = "File %(filename)s is not conflicted."
 
 
1761
    def __init__(self, filename):
 
 
1762
        BzrError.__init__(self)
 
 
1763
        self.filename = filename
 
 
1766
class MediumNotConnected(InternalBzrError):
 
 
1768
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1770
    def __init__(self, medium):
 
 
1771
        self.medium = medium
 
 
1774
class MustUseDecorated(Exception):
 
 
1776
    _fmt = "A decorating function has requested its original command be used."
 
 
1779
class NoBundleFound(BzrError):
 
 
1781
    _fmt = 'No bundle was found in "%(filename)s".'
 
 
1783
    def __init__(self, filename):
 
 
1784
        BzrError.__init__(self)
 
 
1785
        self.filename = filename
 
 
1788
class BundleNotSupported(BzrError):
 
 
1790
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1792
    def __init__(self, version, msg):
 
 
1793
        BzrError.__init__(self)
 
 
1794
        self.version = version
 
 
1798
class MissingText(BzrError):
 
 
1800
    _fmt = ("Branch %(base)s is missing revision"
 
 
1801
            " %(text_revision)s of %(file_id)s")
 
 
1803
    def __init__(self, branch, text_revision, file_id):
 
 
1804
        BzrError.__init__(self)
 
 
1805
        self.branch = branch
 
 
1806
        self.base = branch.base
 
 
1807
        self.text_revision = text_revision
 
 
1808
        self.file_id = file_id
 
 
1811
class DuplicateFileId(BzrError):
 
 
1813
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1815
    def __init__(self, file_id, entry):
 
 
1816
        BzrError.__init__(self)
 
 
1817
        self.file_id = file_id
 
 
1821
class DuplicateKey(BzrError):
 
 
1823
    _fmt = "Key %(key)s is already present in map"
 
 
1826
class DuplicateHelpPrefix(BzrError):
 
 
1828
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
 
1830
    def __init__(self, prefix):
 
 
1831
        self.prefix = prefix
 
 
1834
class MalformedTransform(BzrError):
 
 
1836
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1839
class NoFinalPath(BzrError):
 
 
1841
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1842
            "file-id: %(file_id)r\n"
 
 
1843
            "root trans-id: %(root_trans_id)r\n")
 
 
1845
    def __init__(self, trans_id, transform):
 
 
1846
        self.trans_id = trans_id
 
 
1847
        self.file_id = transform.final_file_id(trans_id)
 
 
1848
        self.root_trans_id = transform.root
 
 
1851
class BzrBadParameter(InternalBzrError):
 
 
1853
    _fmt = "Bad parameter: %(param)r"
 
 
1855
    # This exception should never be thrown, but it is a base class for all
 
 
1856
    # parameter-to-function errors.
 
 
1858
    def __init__(self, param):
 
 
1859
        BzrError.__init__(self)
 
 
1863
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1865
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1868
class ReusingTransform(BzrError):
 
 
1870
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1873
class CantMoveRoot(BzrError):
 
 
1875
    _fmt = "Moving the root directory is not supported at this time"
 
 
1878
class BzrMoveFailedError(BzrError):
 
 
1880
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1882
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1883
        from bzrlib.osutils import splitpath
 
 
1884
        BzrError.__init__(self)
 
 
1886
            self.extra = ': ' + str(extra)
 
 
1890
        has_from = len(from_path) > 0
 
 
1891
        has_to = len(to_path) > 0
 
 
1893
            self.from_path = splitpath(from_path)[-1]
 
 
1898
            self.to_path = splitpath(to_path)[-1]
 
 
1903
        if has_from and has_to:
 
 
1904
            self.operator = " =>"
 
 
1906
            self.from_path = "from " + from_path
 
 
1908
            self.operator = "to"
 
 
1910
            self.operator = "file"
 
 
1913
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1915
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1917
    def __init__(self, from_path, to_path, extra=None):
 
 
1918
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1920
class BzrRemoveChangedFilesError(BzrError):
 
 
1921
    """Used when user is trying to remove changed files."""
 
 
1923
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
 
1924
        "%(changes_as_text)s"
 
 
1925
        "Use --keep to not delete them, or --force to delete them regardless.")
 
 
1927
    def __init__(self, tree_delta):
 
 
1928
        BzrError.__init__(self)
 
 
1929
        self.changes_as_text = tree_delta.get_changes_as_text()
 
 
1930
        #self.paths_as_string = '\n'.join(changed_files)
 
 
1931
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
 
1934
class BzrBadParameterNotString(BzrBadParameter):
 
 
1936
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1939
class BzrBadParameterMissing(BzrBadParameter):
 
 
1941
    _fmt = "Parameter $(param)s is required but not present."
 
 
1944
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1946
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1947
            " only byte-strings are permitted.")
 
 
1950
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1952
    _fmt = "Parameter %(param)s contains a newline."
 
 
1955
class DependencyNotPresent(BzrError):
 
 
1957
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1959
    def __init__(self, library, error):
 
 
1960
        BzrError.__init__(self, library=library, error=error)
 
 
1963
class ParamikoNotPresent(DependencyNotPresent):
 
 
1965
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1967
    def __init__(self, error):
 
 
1968
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
1971
class PointlessMerge(BzrError):
 
 
1973
    _fmt = "Nothing to merge."
 
 
1976
class UninitializableFormat(BzrError):
 
 
1978
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
1980
    def __init__(self, format):
 
 
1981
        BzrError.__init__(self)
 
 
1982
        self.format = format
 
 
1985
class BadConversionTarget(BzrError):
 
 
1987
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
1989
    def __init__(self, problem, format):
 
 
1990
        BzrError.__init__(self)
 
 
1991
        self.problem = problem
 
 
1992
        self.format = format
 
 
1995
class NoDiffFound(BzrError):
 
 
1997
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
 
1999
    def __init__(self, path):
 
 
2000
        BzrError.__init__(self, path)
 
 
2003
class ExecutableMissing(BzrError):
 
 
2005
    _fmt = "%(exe_name)s could not be found on this machine"
 
 
2007
    def __init__(self, exe_name):
 
 
2008
        BzrError.__init__(self, exe_name=exe_name)
 
 
2011
class NoDiff(BzrError):
 
 
2013
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
2015
    def __init__(self, msg):
 
 
2016
        BzrError.__init__(self, msg=msg)
 
 
2019
class NoDiff3(BzrError):
 
 
2021
    _fmt = "Diff3 is not installed on this machine."
 
 
2024
class ExistingContent(BzrError):
 
 
2025
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
 
2027
    _fmt = "The content being inserted is already present."
 
 
2030
class ExistingLimbo(BzrError):
 
 
2032
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2033
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2034
    keep, and delete it when you are done."""
 
 
2036
    def __init__(self, limbo_dir):
 
 
2037
       BzrError.__init__(self)
 
 
2038
       self.limbo_dir = limbo_dir
 
 
2041
class ExistingPendingDeletion(BzrError):
 
 
2043
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2044
    Please examine %(pending_deletion)s to see if it contains any files you
 
 
2045
    wish to keep, and delete it when you are done."""
 
 
2047
    def __init__(self, pending_deletion):
 
 
2048
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2051
class ImmortalLimbo(BzrError):
 
 
2053
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
 
2054
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2055
    keep, and delete it when you are done."""
 
 
2057
    def __init__(self, limbo_dir):
 
 
2058
       BzrError.__init__(self)
 
 
2059
       self.limbo_dir = limbo_dir
 
 
2062
class ImmortalPendingDeletion(BzrError):
 
 
2064
    _fmt = ("Unable to delete transform temporary directory "
 
 
2065
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
 
2066
    "contains any files you wish to keep, and delete it when you are done.")
 
 
2068
    def __init__(self, pending_deletion):
 
 
2069
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2072
class OutOfDateTree(BzrError):
 
 
2074
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
2076
    def __init__(self, tree):
 
 
2077
        BzrError.__init__(self)
 
 
2081
class PublicBranchOutOfDate(BzrError):
 
 
2083
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
2086
    def __init__(self, public_location, revstring):
 
 
2087
        import bzrlib.urlutils as urlutils
 
 
2088
        public_location = urlutils.unescape_for_display(public_location,
 
 
2090
        BzrError.__init__(self, public_location=public_location,
 
 
2091
                          revstring=revstring)
 
 
2094
class MergeModifiedFormatError(BzrError):
 
 
2096
    _fmt = "Error in merge modified format"
 
 
2099
class ConflictFormatError(BzrError):
 
 
2101
    _fmt = "Format error in conflict listings"
 
 
2104
class CorruptDirstate(BzrError):
 
 
2106
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
 
2107
            "Error: %(description)s")
 
 
2109
    def __init__(self, dirstate_path, description):
 
 
2110
        BzrError.__init__(self)
 
 
2111
        self.dirstate_path = dirstate_path
 
 
2112
        self.description = description
 
 
2115
class CorruptRepository(BzrError):
 
 
2117
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
2118
            "Please run bzr reconcile on this repository.")
 
 
2120
    def __init__(self, repo):
 
 
2121
        BzrError.__init__(self)
 
 
2122
        self.repo_path = repo.bzrdir.root_transport.base
 
 
2125
class InconsistentDelta(BzrError):
 
 
2126
    """Used when we get a delta that is not valid."""
 
 
2128
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
 
2129
            " %(file_id)r\nreason: %(reason)s")
 
 
2131
    def __init__(self, path, file_id, reason):
 
 
2132
        BzrError.__init__(self)
 
 
2134
        self.file_id = file_id
 
 
2135
        self.reason = reason
 
 
2138
class UpgradeRequired(BzrError):
 
 
2140
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
2142
    def __init__(self, path):
 
 
2143
        BzrError.__init__(self)
 
 
2147
class RepositoryUpgradeRequired(UpgradeRequired):
 
 
2149
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
 
2152
class LocalRequiresBoundBranch(BzrError):
 
 
2154
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
2157
class MissingProgressBarFinish(BzrError):
 
 
2159
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
2162
class InvalidProgressBarType(BzrError):
 
 
2164
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
2165
            " is not a supported type Select one of: %(valid_types)s")
 
 
2167
    def __init__(self, bar_type, valid_types):
 
 
2168
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
2171
class UnsupportedOperation(BzrError):
 
 
2173
    _fmt = ("The method %(mname)s is not supported on"
 
 
2174
            " objects of type %(tname)s.")
 
 
2176
    def __init__(self, method, method_self):
 
 
2177
        self.method = method
 
 
2178
        self.mname = method.__name__
 
 
2179
        self.tname = type(method_self).__name__
 
 
2182
class CannotSetRevisionId(UnsupportedOperation):
 
 
2183
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
2186
class NonAsciiRevisionId(UnsupportedOperation):
 
 
2187
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
2192
class BinaryFile(BzrError):
 
 
2194
    _fmt = "File is binary but should be text."
 
 
2197
class IllegalPath(BzrError):
 
 
2199
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
2201
    def __init__(self, path):
 
 
2202
        BzrError.__init__(self)
 
 
2206
class TestamentMismatch(BzrError):
 
 
2208
    _fmt = """Testament did not match expected value.
 
 
2209
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
2212
    def __init__(self, revision_id, expected, measured):
 
 
2213
        self.revision_id = revision_id
 
 
2214
        self.expected = expected
 
 
2215
        self.measured = measured
 
 
2218
class NotABundle(BzrError):
 
 
2220
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
2222
    def __init__(self, text):
 
 
2223
        BzrError.__init__(self)
 
 
2227
class BadBundle(BzrError): 
 
 
2229
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
2231
    def __init__(self, text):
 
 
2232
        BzrError.__init__(self)
 
 
2236
class MalformedHeader(BadBundle): 
 
 
2238
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
2241
class MalformedPatches(BadBundle): 
 
 
2243
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
2246
class MalformedFooter(BadBundle): 
 
 
2248
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
2251
class UnsupportedEOLMarker(BadBundle):
 
 
2253
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
2256
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
2257
        # but for this there is not
 
 
2258
        BzrError.__init__(self)
 
 
2261
class IncompatibleBundleFormat(BzrError):
 
 
2263
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
2265
    def __init__(self, bundle_format, other):
 
 
2266
        BzrError.__init__(self)
 
 
2267
        self.bundle_format = bundle_format
 
 
2271
class BadInventoryFormat(BzrError):
 
 
2273
    _fmt = "Root class for inventory serialization errors"
 
 
2276
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
2278
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
2280
    def __init__(self, msg):
 
 
2281
        BadInventoryFormat.__init__(self, msg=msg)
 
 
2284
class RootNotRich(BzrError):
 
 
2286
    _fmt = """This operation requires rich root data storage"""
 
 
2289
class NoSmartMedium(InternalBzrError):
 
 
2291
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
2293
    def __init__(self, transport):
 
 
2294
        self.transport = transport
 
 
2297
class NoSmartServer(NotBranchError):
 
 
2299
    _fmt = "No smart server available at %(url)s"
 
 
2301
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
 
2302
    def __init__(self, url):
 
 
2306
class UnknownSSH(BzrError):
 
 
2308
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
2310
    def __init__(self, vendor):
 
 
2311
        BzrError.__init__(self)
 
 
2312
        self.vendor = vendor
 
 
2315
class SSHVendorNotFound(BzrError):
 
 
2317
    _fmt = ("Don't know how to handle SSH connections."
 
 
2318
            " Please set BZR_SSH environment variable.")
 
 
2321
class GhostRevisionsHaveNoRevno(BzrError):
 
 
2322
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
 
2324
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
 
2325
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
 
2327
    def __init__(self, revision_id, ghost_revision_id):
 
 
2328
        self.revision_id = revision_id
 
 
2329
        self.ghost_revision_id = ghost_revision_id
 
 
2332
class GhostRevisionUnusableHere(BzrError):
 
 
2334
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
2336
    def __init__(self, revision_id):
 
 
2337
        BzrError.__init__(self)
 
 
2338
        self.revision_id = revision_id
 
 
2341
class IllegalUseOfScopeReplacer(InternalBzrError):
 
 
2343
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
2344
            " %(msg)s%(extra)s")
 
 
2346
    def __init__(self, name, msg, extra=None):
 
 
2347
        BzrError.__init__(self)
 
 
2351
            self.extra = ': ' + str(extra)
 
 
2356
class InvalidImportLine(InternalBzrError):
 
 
2358
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
2360
    def __init__(self, text, msg):
 
 
2361
        BzrError.__init__(self)
 
 
2366
class ImportNameCollision(InternalBzrError):
 
 
2368
    _fmt = ("Tried to import an object to the same name as"
 
 
2369
            " an existing object. %(name)s")
 
 
2371
    def __init__(self, name):
 
 
2372
        BzrError.__init__(self)
 
 
2376
class NotAMergeDirective(BzrError):
 
 
2377
    """File starting with %(firstline)r is not a merge directive"""
 
 
2378
    def __init__(self, firstline):
 
 
2379
        BzrError.__init__(self, firstline=firstline)
 
 
2382
class NoMergeSource(BzrError):
 
 
2383
    """Raise if no merge source was specified for a merge directive"""
 
 
2385
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
2389
class IllegalMergeDirectivePayload(BzrError):
 
 
2390
    """A merge directive contained something other than a patch or bundle"""
 
 
2392
    _fmt = "Bad merge directive payload %(start)r"
 
 
2394
    def __init__(self, start):
 
 
2399
class PatchVerificationFailed(BzrError):
 
 
2400
    """A patch from a merge directive could not be verified"""
 
 
2402
    _fmt = "Preview patch does not match requested changes."
 
 
2405
class PatchMissing(BzrError):
 
 
2406
    """Raise a patch type was specified but no patch supplied"""
 
 
2408
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
 
2410
    def __init__(self, patch_type):
 
 
2411
        BzrError.__init__(self)
 
 
2412
        self.patch_type = patch_type
 
 
2415
class TargetNotBranch(BzrError):
 
 
2416
    """A merge directive's target branch is required, but isn't a branch"""
 
 
2418
    _fmt = ("Your branch does not have all of the revisions required in "
 
 
2419
            "order to merge this merge directive and the target "
 
 
2420
            "location specified in the merge directive is not a branch: "
 
 
2423
    def __init__(self, location):
 
 
2424
        BzrError.__init__(self)
 
 
2425
        self.location = location
 
 
2428
class UnsupportedInventoryKind(BzrError):
 
 
2430
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
2432
    def __init__(self, kind):
 
 
2436
class BadSubsumeSource(BzrError):
 
 
2438
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
 
2440
    def __init__(self, tree, other_tree, reason):
 
 
2442
        self.other_tree = other_tree
 
 
2443
        self.reason = reason
 
 
2446
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
2448
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
2450
    def __init__(self, other_tree):
 
 
2451
        self.other_tree = other_tree
 
 
2454
class BadReferenceTarget(InternalBzrError):
 
 
2456
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
 
2459
    def __init__(self, tree, other_tree, reason):
 
 
2461
        self.other_tree = other_tree
 
 
2462
        self.reason = reason
 
 
2465
class NoSuchTag(BzrError):
 
 
2467
    _fmt = "No such tag: %(tag_name)s"
 
 
2469
    def __init__(self, tag_name):
 
 
2470
        self.tag_name = tag_name
 
 
2473
class TagsNotSupported(BzrError):
 
 
2475
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2476
            " you may be able to use bzr upgrade.")
 
 
2478
    def __init__(self, branch):
 
 
2479
        self.branch = branch
 
 
2482
class TagAlreadyExists(BzrError):
 
 
2484
    _fmt = "Tag %(tag_name)s already exists."
 
 
2486
    def __init__(self, tag_name):
 
 
2487
        self.tag_name = tag_name
 
 
2490
class MalformedBugIdentifier(BzrError):
 
 
2492
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
 
2494
    def __init__(self, bug_id, reason):
 
 
2495
        self.bug_id = bug_id
 
 
2496
        self.reason = reason
 
 
2499
class InvalidBugTrackerURL(BzrError):
 
 
2501
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
 
2502
            "contain {id}: %(url)s")
 
 
2504
    def __init__(self, abbreviation, url):
 
 
2505
        self.abbreviation = abbreviation
 
 
2509
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2511
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2514
    def __init__(self, abbreviation, branch):
 
 
2515
        self.abbreviation = abbreviation
 
 
2516
        self.branch = branch
 
 
2519
class UnexpectedSmartServerResponse(BzrError):
 
 
2521
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2523
    def __init__(self, response_tuple):
 
 
2524
        self.response_tuple = response_tuple
 
 
2527
class ErrorFromSmartServer(BzrError):
 
 
2528
    """An error was received from a smart server.
 
 
2530
    :seealso: UnknownErrorFromSmartServer
 
 
2533
    _fmt = "Error received from smart server: %(error_tuple)r"
 
 
2535
    internal_error = True
 
 
2537
    def __init__(self, error_tuple):
 
 
2538
        self.error_tuple = error_tuple
 
 
2540
            self.error_verb = error_tuple[0]
 
 
2542
            self.error_verb = None
 
 
2543
        self.error_args = error_tuple[1:]
 
 
2546
class UnknownErrorFromSmartServer(BzrError):
 
 
2547
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
 
2550
    This is distinct from ErrorFromSmartServer so that it is possible to
 
 
2551
    distinguish between the following two cases:
 
 
2552
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
 
2553
        and so should provoke a traceback to the user.
 
 
2554
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
 
2555
        translated.  This is probably because the server sent us garbage, and
 
 
2556
        should not provoke a traceback.
 
 
2559
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
 
2561
    internal_error = False
 
 
2563
    def __init__(self, error_from_smart_server):
 
 
2566
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
 
2568
        self.error_from_smart_server = error_from_smart_server
 
 
2569
        self.error_tuple = error_from_smart_server.error_tuple
 
 
2572
class ContainerError(BzrError):
 
 
2573
    """Base class of container errors."""
 
 
2576
class UnknownContainerFormatError(ContainerError):
 
 
2578
    _fmt = "Unrecognised container format: %(container_format)r"
 
 
2580
    def __init__(self, container_format):
 
 
2581
        self.container_format = container_format
 
 
2584
class UnexpectedEndOfContainerError(ContainerError):
 
 
2586
    _fmt = "Unexpected end of container stream"
 
 
2589
class UnknownRecordTypeError(ContainerError):
 
 
2591
    _fmt = "Unknown record type: %(record_type)r"
 
 
2593
    def __init__(self, record_type):
 
 
2594
        self.record_type = record_type
 
 
2597
class InvalidRecordError(ContainerError):
 
 
2599
    _fmt = "Invalid record: %(reason)s"
 
 
2601
    def __init__(self, reason):
 
 
2602
        self.reason = reason
 
 
2605
class ContainerHasExcessDataError(ContainerError):
 
 
2607
    _fmt = "Container has data after end marker: %(excess)r"
 
 
2609
    def __init__(self, excess):
 
 
2610
        self.excess = excess
 
 
2613
class DuplicateRecordNameError(ContainerError):
 
 
2615
    _fmt = "Container has multiple records with the same name: %(name)s"
 
 
2617
    def __init__(self, name):
 
 
2621
class NoDestinationAddress(InternalBzrError):
 
 
2623
    _fmt = "Message does not have a destination address."
 
 
2626
class RepositoryDataStreamError(BzrError):
 
 
2628
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
 
2630
    def __init__(self, reason):
 
 
2631
        self.reason = reason
 
 
2634
class SMTPError(BzrError):
 
 
2636
    _fmt = "SMTP error: %(error)s"
 
 
2638
    def __init__(self, error):
 
 
2642
class NoMessageSupplied(BzrError):
 
 
2644
    _fmt = "No message supplied."
 
 
2647
class NoMailAddressSpecified(BzrError):
 
 
2649
    _fmt = "No mail-to address specified."
 
 
2652
class UnknownMailClient(BzrError):
 
 
2654
    _fmt = "Unknown mail client: %(mail_client)s"
 
 
2656
    def __init__(self, mail_client):
 
 
2657
        BzrError.__init__(self, mail_client=mail_client)
 
 
2660
class MailClientNotFound(BzrError):
 
 
2662
    _fmt = "Unable to find mail client with the following names:"\
 
 
2663
        " %(mail_command_list_string)s"
 
 
2665
    def __init__(self, mail_command_list):
 
 
2666
        mail_command_list_string = ', '.join(mail_command_list)
 
 
2667
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
 
2668
                          mail_command_list_string=mail_command_list_string)
 
 
2670
class SMTPConnectionRefused(SMTPError):
 
 
2672
    _fmt = "SMTP connection to %(host)s refused"
 
 
2674
    def __init__(self, error, host):
 
 
2679
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
 
2681
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
 
2684
class BzrDirError(BzrError):
 
 
2686
    def __init__(self, bzrdir):
 
 
2687
        import bzrlib.urlutils as urlutils
 
 
2688
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
 
2690
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
 
2693
class UnsyncedBranches(BzrDirError):
 
 
2695
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
 
2696
            " bzr help sync-for-reconfigure.")
 
 
2698
    def __init__(self, bzrdir, target_branch):
 
 
2699
        BzrDirError.__init__(self, bzrdir)
 
 
2700
        import bzrlib.urlutils as urlutils
 
 
2701
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
 
2705
class AlreadyBranch(BzrDirError):
 
 
2707
    _fmt = "'%(display_url)s' is already a branch."
 
 
2710
class AlreadyTree(BzrDirError):
 
 
2712
    _fmt = "'%(display_url)s' is already a tree."
 
 
2715
class AlreadyCheckout(BzrDirError):
 
 
2717
    _fmt = "'%(display_url)s' is already a checkout."
 
 
2720
class AlreadyLightweightCheckout(BzrDirError):
 
 
2722
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
 
2725
class AlreadyUsingShared(BzrDirError):
 
 
2727
    _fmt = "'%(display_url)s' is already using a shared repository."
 
 
2730
class AlreadyStandalone(BzrDirError):
 
 
2732
    _fmt = "'%(display_url)s' is already standalone."
 
 
2735
class ReconfigurationNotSupported(BzrDirError):
 
 
2737
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
 
2740
class NoBindLocation(BzrDirError):
 
 
2742
    _fmt = "No location could be found to bind to at %(display_url)s."
 
 
2745
class UncommittedChanges(BzrError):
 
 
2747
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
 
2749
    def __init__(self, tree):
 
 
2750
        import bzrlib.urlutils as urlutils
 
 
2751
        display_url = urlutils.unescape_for_display(
 
 
2752
            tree.bzrdir.root_transport.base, 'ascii')
 
 
2753
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
 
2756
class MissingTemplateVariable(BzrError):
 
 
2758
    _fmt = 'Variable {%(name)s} is not available.'
 
 
2760
    def __init__(self, name):
 
 
2764
class NoTemplate(BzrError):
 
 
2766
    _fmt = 'No template specified.'
 
 
2769
class UnableCreateSymlink(BzrError):
 
 
2771
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
 
2773
    def __init__(self, path=None):
 
 
2777
                path_str = repr(str(path))
 
 
2778
            except UnicodeEncodeError:
 
 
2779
                path_str = repr(path)
 
 
2781
        self.path_str = path_str
 
 
2784
class UnsupportedTimezoneFormat(BzrError):
 
 
2786
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
 
2787
            'options are "utc", "original", "local".')
 
 
2789
    def __init__(self, timezone):
 
 
2790
        self.timezone = timezone
 
 
2793
class CommandAvailableInPlugin(StandardError):
 
 
2795
    internal_error = False
 
 
2797
    def __init__(self, cmd_name, plugin_metadata, provider):
 
 
2799
        self.plugin_metadata = plugin_metadata
 
 
2800
        self.cmd_name = cmd_name
 
 
2801
        self.provider = provider
 
 
2805
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
 
2806
                'However, the following official plugin provides this command: %s\n'
 
 
2807
                'You can install it by going to: %s'
 
 
2808
                % (self.cmd_name, self.plugin_metadata['name'], 
 
 
2809
                    self.plugin_metadata['url']))
 
 
2814
class NoPluginAvailable(BzrError):
 
 
2818
class NotATerminal(BzrError):
 
 
2820
    _fmt = 'Unable to ask for a password without real terminal.'
 
 
2823
class UnableEncodePath(BzrError):
 
 
2825
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
 
2826
            'user encoding %(user_encoding)s')
 
 
2828
    def __init__(self, path, kind):
 
 
2829
        from bzrlib.osutils import get_user_encoding
 
 
2832
        self.user_encoding = osutils.get_user_encoding()
 
 
2835
class NoSuchAlias(BzrError):
 
 
2837
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
 
2839
    def __init__(self, alias_name):
 
 
2840
        BzrError.__init__(self, alias_name=alias_name)
 
 
2843
class DirectoryLookupFailure(BzrError):
 
 
2844
    """Base type for lookup errors."""
 
 
2849
class InvalidLocationAlias(DirectoryLookupFailure):
 
 
2851
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
 
2853
    def __init__(self, alias_name):
 
 
2854
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
 
2857
class UnsetLocationAlias(DirectoryLookupFailure):
 
 
2859
    _fmt = 'No %(alias_name)s location assigned.'
 
 
2861
    def __init__(self, alias_name):
 
 
2862
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
 
2865
class CannotBindAddress(BzrError):
 
 
2867
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
 
2869
    def __init__(self, host, port, orig_error):
 
 
2870
        BzrError.__init__(self, host=host, port=port,
 
 
2871
            orig_error=orig_error[1])
 
 
2874
class UnknownRules(BzrError):
 
 
2876
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
 
2878
    def __init__(self, unknowns):
 
 
2879
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
 
2882
class HookFailed(BzrError):
 
 
2883
    """Raised when a pre_change_branch_tip hook function fails anything other
 
 
2884
    than TipChangeRejected.
 
 
2887
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
 
2888
            "%(traceback_text)s%(exc_value)s")
 
 
2890
    def __init__(self, hook_stage, hook_name, exc_info):
 
 
2892
        self.hook_stage = hook_stage
 
 
2893
        self.hook_name = hook_name
 
 
2894
        self.exc_info = exc_info
 
 
2895
        self.exc_type = exc_info[0]
 
 
2896
        self.exc_value = exc_info[1]
 
 
2897
        self.exc_tb = exc_info[2]
 
 
2898
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
 
2901
class TipChangeRejected(BzrError):
 
 
2902
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
 
2903
    explicitly abort a change to a branch tip.
 
 
2906
    _fmt = u"Tip change rejected: %(msg)s"
 
 
2908
    def __init__(self, msg):
 
 
2912
class ShelfCorrupt(BzrError):
 
 
2914
    _fmt = "Shelf corrupt."
 
 
2917
class NoSuchShelfId(BzrError):
 
 
2919
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
 
 
2921
    def __init__(self, shelf_id):
 
 
2922
        BzrError.__init__(self, shelf_id=shelf_id)
 
 
2925
class UserAbort(BzrError):
 
 
2927
    _fmt = 'The user aborted the operation.'