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 RetryWithNewPacks(BzrError):
 
 
1490
    """Raised when we realize that the packs on disk have changed.
 
 
1492
    This is meant as more of a signaling exception, to trap between where a
 
 
1493
    local error occurred and the code that can actually handle the error and
 
 
1494
    code that can retry appropriately.
 
 
1497
    internal_error = True
 
 
1499
    _fmt = ("Pack files have changed, reload and retry. %(orig_error)s")
 
 
1501
    def __init__(self, reload_occurred, exc_info):
 
 
1502
        """create a new RestartWithNewPacks error.
 
 
1504
        :param reload_occurred: Set to True if we know that the packs have
 
 
1505
            already been reloaded, and we are failing because of an in-memory
 
 
1506
            cache miss. If set to True then we will ignore if a reload says
 
 
1507
            nothing has changed, because we assume it has already reloaded. If
 
 
1508
            False, then a reload with nothing changed will force an error.
 
 
1509
        :param exc_info: The original exception traceback, so if there is a
 
 
1510
            problem we can raise the original error (value from sys.exc_info())
 
 
1512
        BzrError.__init__(self)
 
 
1513
        self.reload_occurred = reload_occurred
 
 
1514
        self.exc_info = exc_info
 
 
1515
        self.orig_error = exc_info[1]
 
 
1516
        # TODO: The global error handler should probably treat this by
 
 
1517
        #       raising/printing the original exception with a bit about
 
 
1518
        #       RetryWithNewPacks also not being caught
 
 
1521
class NoSuchExportFormat(BzrError):
 
 
1523
    _fmt = "Export format %(format)r not supported"
 
 
1525
    def __init__(self, format):
 
 
1526
        BzrError.__init__(self)
 
 
1527
        self.format = format
 
 
1530
class TransportError(BzrError):
 
 
1532
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1534
    def __init__(self, msg=None, orig_error=None):
 
 
1535
        if msg is None and orig_error is not None:
 
 
1536
            msg = str(orig_error)
 
 
1537
        if orig_error is None:
 
 
1542
        self.orig_error = orig_error
 
 
1543
        BzrError.__init__(self)
 
 
1546
class TooManyConcurrentRequests(InternalBzrError):
 
 
1548
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1549
            " Be sure to finish_writing and finish_reading on the"
 
 
1550
            " currently open request.")
 
 
1552
    def __init__(self, medium):
 
 
1553
        self.medium = medium
 
 
1556
class SmartProtocolError(TransportError):
 
 
1558
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1560
    def __init__(self, details):
 
 
1561
        self.details = details
 
 
1564
class UnexpectedProtocolVersionMarker(TransportError):
 
 
1566
    _fmt = "Received bad protocol version marker: %(marker)r"
 
 
1568
    def __init__(self, marker):
 
 
1569
        self.marker = marker
 
 
1572
class UnknownSmartMethod(InternalBzrError):
 
 
1574
    _fmt = "The server does not recognise the '%(verb)s' request."
 
 
1576
    def __init__(self, verb):
 
 
1580
class SmartMessageHandlerError(InternalBzrError):
 
 
1582
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
 
1584
    def __init__(self, exc_info):
 
 
1585
        self.exc_type, self.exc_value, self.tb = exc_info
 
 
1588
# A set of semi-meaningful errors which can be thrown
 
 
1589
class TransportNotPossible(TransportError):
 
 
1591
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1594
class ConnectionError(TransportError):
 
 
1596
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1599
class SocketConnectionError(ConnectionError):
 
 
1601
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1603
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1605
            msg = 'Failed to connect to'
 
 
1606
        if orig_error is None:
 
 
1609
            orig_error = '; ' + str(orig_error)
 
 
1610
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1615
            self.port = ':%s' % port
 
 
1618
class ConnectionReset(TransportError):
 
 
1620
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1623
class InvalidRange(TransportError):
 
 
1625
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
 
1627
    def __init__(self, path, offset, msg=None):
 
 
1628
        TransportError.__init__(self, msg)
 
 
1630
        self.offset = offset
 
 
1633
class InvalidHttpResponse(TransportError):
 
 
1635
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1637
    def __init__(self, path, msg, orig_error=None):
 
 
1639
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1642
class InvalidHttpRange(InvalidHttpResponse):
 
 
1644
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1646
    def __init__(self, path, range, msg):
 
 
1648
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1651
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1653
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1655
    def __init__(self, path, ctype, msg):
 
 
1657
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1660
class RedirectRequested(TransportError):
 
 
1662
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1664
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
 
1665
        self.source = source
 
 
1666
        self.target = target
 
 
1668
            self.permanently = ' permanently'
 
 
1670
            self.permanently = ''
 
 
1671
        self._qualified_proto = qual_proto
 
 
1672
        TransportError.__init__(self)
 
 
1674
    def _requalify_url(self, url):
 
 
1675
        """Restore the qualified proto in front of the url"""
 
 
1676
        # When this exception is raised, source and target are in
 
 
1677
        # user readable format. But some transports may use a
 
 
1678
        # different proto (http+urllib:// will present http:// to
 
 
1679
        # the user. If a qualified proto is specified, the code
 
 
1680
        # trapping the exception can get the qualified urls to
 
 
1681
        # properly handle the redirection themself (creating a
 
 
1682
        # new transport object from the target url for example).
 
 
1683
        # But checking that the scheme of the original and
 
 
1684
        # redirected urls are the same can be tricky. (see the
 
 
1685
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1687
        if self._qualified_proto is None:
 
 
1690
        # The TODO related to NotBranchError mention that doing
 
 
1691
        # that kind of manipulation on the urls may not be the
 
 
1692
        # exception object job. On the other hand, this object is
 
 
1693
        # the interface between the code and the user so
 
 
1694
        # presenting the urls in different ways is indeed its
 
 
1697
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1698
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1701
    def get_source_url(self):
 
 
1702
        return self._requalify_url(self.source)
 
 
1704
    def get_target_url(self):
 
 
1705
        return self._requalify_url(self.target)
 
 
1708
class TooManyRedirections(TransportError):
 
 
1710
    _fmt = "Too many redirections"
 
 
1713
class ConflictsInTree(BzrError):
 
 
1715
    _fmt = "Working tree has conflicts."
 
 
1718
class ParseConfigError(BzrError):
 
 
1720
    def __init__(self, errors, filename):
 
 
1721
        if filename is None:
 
 
1723
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1724
            (filename, ('\n'.join(e.msg for e in errors)))
 
 
1725
        BzrError.__init__(self, message)
 
 
1728
class NoEmailInUsername(BzrError):
 
 
1730
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1732
    def __init__(self, username):
 
 
1733
        BzrError.__init__(self)
 
 
1734
        self.username = username
 
 
1737
class SigningFailed(BzrError):
 
 
1739
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
 
1741
    def __init__(self, command_line):
 
 
1742
        BzrError.__init__(self, command_line=command_line)
 
 
1745
class WorkingTreeNotRevision(BzrError):
 
 
1747
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1748
            " the last commit, but weave merge requires that it be"
 
 
1751
    def __init__(self, tree):
 
 
1752
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1755
class CantReprocessAndShowBase(BzrError):
 
 
1757
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1758
           "the relationship of conflicting lines to the base")
 
 
1761
class GraphCycleError(BzrError):
 
 
1763
    _fmt = "Cycle in graph %(graph)r"
 
 
1765
    def __init__(self, graph):
 
 
1766
        BzrError.__init__(self)
 
 
1770
class WritingCompleted(InternalBzrError):
 
 
1772
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1773
            "called upon it - accept bytes may not be called anymore.")
 
 
1775
    def __init__(self, request):
 
 
1776
        self.request = request
 
 
1779
class WritingNotComplete(InternalBzrError):
 
 
1781
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1782
            "called upon it - until the write phase is complete no "
 
 
1783
            "data may be read.")
 
 
1785
    def __init__(self, request):
 
 
1786
        self.request = request
 
 
1789
class NotConflicted(BzrError):
 
 
1791
    _fmt = "File %(filename)s is not conflicted."
 
 
1793
    def __init__(self, filename):
 
 
1794
        BzrError.__init__(self)
 
 
1795
        self.filename = filename
 
 
1798
class MediumNotConnected(InternalBzrError):
 
 
1800
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1802
    def __init__(self, medium):
 
 
1803
        self.medium = medium
 
 
1806
class MustUseDecorated(Exception):
 
 
1808
    _fmt = "A decorating function has requested its original command be used."
 
 
1811
class NoBundleFound(BzrError):
 
 
1813
    _fmt = 'No bundle was found in "%(filename)s".'
 
 
1815
    def __init__(self, filename):
 
 
1816
        BzrError.__init__(self)
 
 
1817
        self.filename = filename
 
 
1820
class BundleNotSupported(BzrError):
 
 
1822
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1824
    def __init__(self, version, msg):
 
 
1825
        BzrError.__init__(self)
 
 
1826
        self.version = version
 
 
1830
class MissingText(BzrError):
 
 
1832
    _fmt = ("Branch %(base)s is missing revision"
 
 
1833
            " %(text_revision)s of %(file_id)s")
 
 
1835
    def __init__(self, branch, text_revision, file_id):
 
 
1836
        BzrError.__init__(self)
 
 
1837
        self.branch = branch
 
 
1838
        self.base = branch.base
 
 
1839
        self.text_revision = text_revision
 
 
1840
        self.file_id = file_id
 
 
1843
class DuplicateFileId(BzrError):
 
 
1845
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1847
    def __init__(self, file_id, entry):
 
 
1848
        BzrError.__init__(self)
 
 
1849
        self.file_id = file_id
 
 
1853
class DuplicateKey(BzrError):
 
 
1855
    _fmt = "Key %(key)s is already present in map"
 
 
1858
class DuplicateHelpPrefix(BzrError):
 
 
1860
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
 
1862
    def __init__(self, prefix):
 
 
1863
        self.prefix = prefix
 
 
1866
class MalformedTransform(BzrError):
 
 
1868
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1871
class NoFinalPath(BzrError):
 
 
1873
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1874
            "file-id: %(file_id)r\n"
 
 
1875
            "root trans-id: %(root_trans_id)r\n")
 
 
1877
    def __init__(self, trans_id, transform):
 
 
1878
        self.trans_id = trans_id
 
 
1879
        self.file_id = transform.final_file_id(trans_id)
 
 
1880
        self.root_trans_id = transform.root
 
 
1883
class BzrBadParameter(InternalBzrError):
 
 
1885
    _fmt = "Bad parameter: %(param)r"
 
 
1887
    # This exception should never be thrown, but it is a base class for all
 
 
1888
    # parameter-to-function errors.
 
 
1890
    def __init__(self, param):
 
 
1891
        BzrError.__init__(self)
 
 
1895
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1897
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1900
class ReusingTransform(BzrError):
 
 
1902
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1905
class CantMoveRoot(BzrError):
 
 
1907
    _fmt = "Moving the root directory is not supported at this time"
 
 
1910
class BzrMoveFailedError(BzrError):
 
 
1912
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1914
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1915
        from bzrlib.osutils import splitpath
 
 
1916
        BzrError.__init__(self)
 
 
1918
            self.extra = ': ' + str(extra)
 
 
1922
        has_from = len(from_path) > 0
 
 
1923
        has_to = len(to_path) > 0
 
 
1925
            self.from_path = splitpath(from_path)[-1]
 
 
1930
            self.to_path = splitpath(to_path)[-1]
 
 
1935
        if has_from and has_to:
 
 
1936
            self.operator = " =>"
 
 
1938
            self.from_path = "from " + from_path
 
 
1940
            self.operator = "to"
 
 
1942
            self.operator = "file"
 
 
1945
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1947
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1949
    def __init__(self, from_path, to_path, extra=None):
 
 
1950
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1952
class BzrRemoveChangedFilesError(BzrError):
 
 
1953
    """Used when user is trying to remove changed files."""
 
 
1955
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
 
1956
        "%(changes_as_text)s"
 
 
1957
        "Use --keep to not delete them, or --force to delete them regardless.")
 
 
1959
    def __init__(self, tree_delta):
 
 
1960
        BzrError.__init__(self)
 
 
1961
        self.changes_as_text = tree_delta.get_changes_as_text()
 
 
1962
        #self.paths_as_string = '\n'.join(changed_files)
 
 
1963
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
 
1966
class BzrBadParameterNotString(BzrBadParameter):
 
 
1968
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1971
class BzrBadParameterMissing(BzrBadParameter):
 
 
1973
    _fmt = "Parameter $(param)s is required but not present."
 
 
1976
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1978
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1979
            " only byte-strings are permitted.")
 
 
1982
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1984
    _fmt = "Parameter %(param)s contains a newline."
 
 
1987
class DependencyNotPresent(BzrError):
 
 
1989
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1991
    def __init__(self, library, error):
 
 
1992
        BzrError.__init__(self, library=library, error=error)
 
 
1995
class ParamikoNotPresent(DependencyNotPresent):
 
 
1997
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1999
    def __init__(self, error):
 
 
2000
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
2003
class PointlessMerge(BzrError):
 
 
2005
    _fmt = "Nothing to merge."
 
 
2008
class UninitializableFormat(BzrError):
 
 
2010
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
2012
    def __init__(self, format):
 
 
2013
        BzrError.__init__(self)
 
 
2014
        self.format = format
 
 
2017
class BadConversionTarget(BzrError):
 
 
2019
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
2021
    def __init__(self, problem, format):
 
 
2022
        BzrError.__init__(self)
 
 
2023
        self.problem = problem
 
 
2024
        self.format = format
 
 
2027
class NoDiffFound(BzrError):
 
 
2029
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
 
2031
    def __init__(self, path):
 
 
2032
        BzrError.__init__(self, path)
 
 
2035
class ExecutableMissing(BzrError):
 
 
2037
    _fmt = "%(exe_name)s could not be found on this machine"
 
 
2039
    def __init__(self, exe_name):
 
 
2040
        BzrError.__init__(self, exe_name=exe_name)
 
 
2043
class NoDiff(BzrError):
 
 
2045
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
2047
    def __init__(self, msg):
 
 
2048
        BzrError.__init__(self, msg=msg)
 
 
2051
class NoDiff3(BzrError):
 
 
2053
    _fmt = "Diff3 is not installed on this machine."
 
 
2056
class ExistingContent(BzrError):
 
 
2057
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
 
2059
    _fmt = "The content being inserted is already present."
 
 
2062
class ExistingLimbo(BzrError):
 
 
2064
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2065
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2066
    keep, and delete it when you are done."""
 
 
2068
    def __init__(self, limbo_dir):
 
 
2069
       BzrError.__init__(self)
 
 
2070
       self.limbo_dir = limbo_dir
 
 
2073
class ExistingPendingDeletion(BzrError):
 
 
2075
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2076
    Please examine %(pending_deletion)s to see if it contains any files you
 
 
2077
    wish to keep, and delete it when you are done."""
 
 
2079
    def __init__(self, pending_deletion):
 
 
2080
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2083
class ImmortalLimbo(BzrError):
 
 
2085
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
 
2086
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2087
    keep, and delete it when you are done."""
 
 
2089
    def __init__(self, limbo_dir):
 
 
2090
       BzrError.__init__(self)
 
 
2091
       self.limbo_dir = limbo_dir
 
 
2094
class ImmortalPendingDeletion(BzrError):
 
 
2096
    _fmt = ("Unable to delete transform temporary directory "
 
 
2097
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
 
2098
    "contains any files you wish to keep, and delete it when you are done.")
 
 
2100
    def __init__(self, pending_deletion):
 
 
2101
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2104
class OutOfDateTree(BzrError):
 
 
2106
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
2108
    def __init__(self, tree):
 
 
2109
        BzrError.__init__(self)
 
 
2113
class PublicBranchOutOfDate(BzrError):
 
 
2115
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
2118
    def __init__(self, public_location, revstring):
 
 
2119
        import bzrlib.urlutils as urlutils
 
 
2120
        public_location = urlutils.unescape_for_display(public_location,
 
 
2122
        BzrError.__init__(self, public_location=public_location,
 
 
2123
                          revstring=revstring)
 
 
2126
class MergeModifiedFormatError(BzrError):
 
 
2128
    _fmt = "Error in merge modified format"
 
 
2131
class ConflictFormatError(BzrError):
 
 
2133
    _fmt = "Format error in conflict listings"
 
 
2136
class CorruptDirstate(BzrError):
 
 
2138
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
 
2139
            "Error: %(description)s")
 
 
2141
    def __init__(self, dirstate_path, description):
 
 
2142
        BzrError.__init__(self)
 
 
2143
        self.dirstate_path = dirstate_path
 
 
2144
        self.description = description
 
 
2147
class CorruptRepository(BzrError):
 
 
2149
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
2150
            "Please run bzr reconcile on this repository.")
 
 
2152
    def __init__(self, repo):
 
 
2153
        BzrError.__init__(self)
 
 
2154
        self.repo_path = repo.bzrdir.root_transport.base
 
 
2157
class InconsistentDelta(BzrError):
 
 
2158
    """Used when we get a delta that is not valid."""
 
 
2160
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
 
2161
            " %(file_id)r\nreason: %(reason)s")
 
 
2163
    def __init__(self, path, file_id, reason):
 
 
2164
        BzrError.__init__(self)
 
 
2166
        self.file_id = file_id
 
 
2167
        self.reason = reason
 
 
2170
class UpgradeRequired(BzrError):
 
 
2172
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
2174
    def __init__(self, path):
 
 
2175
        BzrError.__init__(self)
 
 
2179
class RepositoryUpgradeRequired(UpgradeRequired):
 
 
2181
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
 
2184
class LocalRequiresBoundBranch(BzrError):
 
 
2186
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
2189
class MissingProgressBarFinish(BzrError):
 
 
2191
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
2194
class InvalidProgressBarType(BzrError):
 
 
2196
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
2197
            " is not a supported type Select one of: %(valid_types)s")
 
 
2199
    def __init__(self, bar_type, valid_types):
 
 
2200
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
2203
class UnsupportedOperation(BzrError):
 
 
2205
    _fmt = ("The method %(mname)s is not supported on"
 
 
2206
            " objects of type %(tname)s.")
 
 
2208
    def __init__(self, method, method_self):
 
 
2209
        self.method = method
 
 
2210
        self.mname = method.__name__
 
 
2211
        self.tname = type(method_self).__name__
 
 
2214
class CannotSetRevisionId(UnsupportedOperation):
 
 
2215
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
2218
class NonAsciiRevisionId(UnsupportedOperation):
 
 
2219
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
2224
class BinaryFile(BzrError):
 
 
2226
    _fmt = "File is binary but should be text."
 
 
2229
class IllegalPath(BzrError):
 
 
2231
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
2233
    def __init__(self, path):
 
 
2234
        BzrError.__init__(self)
 
 
2238
class TestamentMismatch(BzrError):
 
 
2240
    _fmt = """Testament did not match expected value.
 
 
2241
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
2244
    def __init__(self, revision_id, expected, measured):
 
 
2245
        self.revision_id = revision_id
 
 
2246
        self.expected = expected
 
 
2247
        self.measured = measured
 
 
2250
class NotABundle(BzrError):
 
 
2252
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
2254
    def __init__(self, text):
 
 
2255
        BzrError.__init__(self)
 
 
2259
class BadBundle(BzrError): 
 
 
2261
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
2263
    def __init__(self, text):
 
 
2264
        BzrError.__init__(self)
 
 
2268
class MalformedHeader(BadBundle): 
 
 
2270
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
2273
class MalformedPatches(BadBundle): 
 
 
2275
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
2278
class MalformedFooter(BadBundle): 
 
 
2280
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
2283
class UnsupportedEOLMarker(BadBundle):
 
 
2285
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
2288
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
2289
        # but for this there is not
 
 
2290
        BzrError.__init__(self)
 
 
2293
class IncompatibleBundleFormat(BzrError):
 
 
2295
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
2297
    def __init__(self, bundle_format, other):
 
 
2298
        BzrError.__init__(self)
 
 
2299
        self.bundle_format = bundle_format
 
 
2303
class BadInventoryFormat(BzrError):
 
 
2305
    _fmt = "Root class for inventory serialization errors"
 
 
2308
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
2310
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
2312
    def __init__(self, msg):
 
 
2313
        BadInventoryFormat.__init__(self, msg=msg)
 
 
2316
class RootNotRich(BzrError):
 
 
2318
    _fmt = """This operation requires rich root data storage"""
 
 
2321
class NoSmartMedium(InternalBzrError):
 
 
2323
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
2325
    def __init__(self, transport):
 
 
2326
        self.transport = transport
 
 
2329
class NoSmartServer(NotBranchError):
 
 
2331
    _fmt = "No smart server available at %(url)s"
 
 
2333
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
 
2334
    def __init__(self, url):
 
 
2338
class UnknownSSH(BzrError):
 
 
2340
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
2342
    def __init__(self, vendor):
 
 
2343
        BzrError.__init__(self)
 
 
2344
        self.vendor = vendor
 
 
2347
class SSHVendorNotFound(BzrError):
 
 
2349
    _fmt = ("Don't know how to handle SSH connections."
 
 
2350
            " Please set BZR_SSH environment variable.")
 
 
2353
class GhostRevisionsHaveNoRevno(BzrError):
 
 
2354
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
 
2356
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
 
2357
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
 
2359
    def __init__(self, revision_id, ghost_revision_id):
 
 
2360
        self.revision_id = revision_id
 
 
2361
        self.ghost_revision_id = ghost_revision_id
 
 
2364
class GhostRevisionUnusableHere(BzrError):
 
 
2366
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
2368
    def __init__(self, revision_id):
 
 
2369
        BzrError.__init__(self)
 
 
2370
        self.revision_id = revision_id
 
 
2373
class IllegalUseOfScopeReplacer(InternalBzrError):
 
 
2375
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
2376
            " %(msg)s%(extra)s")
 
 
2378
    def __init__(self, name, msg, extra=None):
 
 
2379
        BzrError.__init__(self)
 
 
2383
            self.extra = ': ' + str(extra)
 
 
2388
class InvalidImportLine(InternalBzrError):
 
 
2390
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
2392
    def __init__(self, text, msg):
 
 
2393
        BzrError.__init__(self)
 
 
2398
class ImportNameCollision(InternalBzrError):
 
 
2400
    _fmt = ("Tried to import an object to the same name as"
 
 
2401
            " an existing object. %(name)s")
 
 
2403
    def __init__(self, name):
 
 
2404
        BzrError.__init__(self)
 
 
2408
class NotAMergeDirective(BzrError):
 
 
2409
    """File starting with %(firstline)r is not a merge directive"""
 
 
2410
    def __init__(self, firstline):
 
 
2411
        BzrError.__init__(self, firstline=firstline)
 
 
2414
class NoMergeSource(BzrError):
 
 
2415
    """Raise if no merge source was specified for a merge directive"""
 
 
2417
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
2421
class IllegalMergeDirectivePayload(BzrError):
 
 
2422
    """A merge directive contained something other than a patch or bundle"""
 
 
2424
    _fmt = "Bad merge directive payload %(start)r"
 
 
2426
    def __init__(self, start):
 
 
2431
class PatchVerificationFailed(BzrError):
 
 
2432
    """A patch from a merge directive could not be verified"""
 
 
2434
    _fmt = "Preview patch does not match requested changes."
 
 
2437
class PatchMissing(BzrError):
 
 
2438
    """Raise a patch type was specified but no patch supplied"""
 
 
2440
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
 
2442
    def __init__(self, patch_type):
 
 
2443
        BzrError.__init__(self)
 
 
2444
        self.patch_type = patch_type
 
 
2447
class TargetNotBranch(BzrError):
 
 
2448
    """A merge directive's target branch is required, but isn't a branch"""
 
 
2450
    _fmt = ("Your branch does not have all of the revisions required in "
 
 
2451
            "order to merge this merge directive and the target "
 
 
2452
            "location specified in the merge directive is not a branch: "
 
 
2455
    def __init__(self, location):
 
 
2456
        BzrError.__init__(self)
 
 
2457
        self.location = location
 
 
2460
class UnsupportedInventoryKind(BzrError):
 
 
2462
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
2464
    def __init__(self, kind):
 
 
2468
class BadSubsumeSource(BzrError):
 
 
2470
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
 
2472
    def __init__(self, tree, other_tree, reason):
 
 
2474
        self.other_tree = other_tree
 
 
2475
        self.reason = reason
 
 
2478
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
2480
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
2482
    def __init__(self, other_tree):
 
 
2483
        self.other_tree = other_tree
 
 
2486
class BadReferenceTarget(InternalBzrError):
 
 
2488
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
 
2491
    def __init__(self, tree, other_tree, reason):
 
 
2493
        self.other_tree = other_tree
 
 
2494
        self.reason = reason
 
 
2497
class NoSuchTag(BzrError):
 
 
2499
    _fmt = "No such tag: %(tag_name)s"
 
 
2501
    def __init__(self, tag_name):
 
 
2502
        self.tag_name = tag_name
 
 
2505
class TagsNotSupported(BzrError):
 
 
2507
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2508
            " you may be able to use bzr upgrade.")
 
 
2510
    def __init__(self, branch):
 
 
2511
        self.branch = branch
 
 
2514
class TagAlreadyExists(BzrError):
 
 
2516
    _fmt = "Tag %(tag_name)s already exists."
 
 
2518
    def __init__(self, tag_name):
 
 
2519
        self.tag_name = tag_name
 
 
2522
class MalformedBugIdentifier(BzrError):
 
 
2524
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
 
2526
    def __init__(self, bug_id, reason):
 
 
2527
        self.bug_id = bug_id
 
 
2528
        self.reason = reason
 
 
2531
class InvalidBugTrackerURL(BzrError):
 
 
2533
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
 
2534
            "contain {id}: %(url)s")
 
 
2536
    def __init__(self, abbreviation, url):
 
 
2537
        self.abbreviation = abbreviation
 
 
2541
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2543
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2546
    def __init__(self, abbreviation, branch):
 
 
2547
        self.abbreviation = abbreviation
 
 
2548
        self.branch = branch
 
 
2551
class UnexpectedSmartServerResponse(BzrError):
 
 
2553
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2555
    def __init__(self, response_tuple):
 
 
2556
        self.response_tuple = response_tuple
 
 
2559
class ErrorFromSmartServer(BzrError):
 
 
2560
    """An error was received from a smart server.
 
 
2562
    :seealso: UnknownErrorFromSmartServer
 
 
2565
    _fmt = "Error received from smart server: %(error_tuple)r"
 
 
2567
    internal_error = True
 
 
2569
    def __init__(self, error_tuple):
 
 
2570
        self.error_tuple = error_tuple
 
 
2572
            self.error_verb = error_tuple[0]
 
 
2574
            self.error_verb = None
 
 
2575
        self.error_args = error_tuple[1:]
 
 
2578
class UnknownErrorFromSmartServer(BzrError):
 
 
2579
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
 
2582
    This is distinct from ErrorFromSmartServer so that it is possible to
 
 
2583
    distinguish between the following two cases:
 
 
2584
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
 
2585
        and so should provoke a traceback to the user.
 
 
2586
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
 
2587
        translated.  This is probably because the server sent us garbage, and
 
 
2588
        should not provoke a traceback.
 
 
2591
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
 
2593
    internal_error = False
 
 
2595
    def __init__(self, error_from_smart_server):
 
 
2598
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
 
2600
        self.error_from_smart_server = error_from_smart_server
 
 
2601
        self.error_tuple = error_from_smart_server.error_tuple
 
 
2604
class ContainerError(BzrError):
 
 
2605
    """Base class of container errors."""
 
 
2608
class UnknownContainerFormatError(ContainerError):
 
 
2610
    _fmt = "Unrecognised container format: %(container_format)r"
 
 
2612
    def __init__(self, container_format):
 
 
2613
        self.container_format = container_format
 
 
2616
class UnexpectedEndOfContainerError(ContainerError):
 
 
2618
    _fmt = "Unexpected end of container stream"
 
 
2621
class UnknownRecordTypeError(ContainerError):
 
 
2623
    _fmt = "Unknown record type: %(record_type)r"
 
 
2625
    def __init__(self, record_type):
 
 
2626
        self.record_type = record_type
 
 
2629
class InvalidRecordError(ContainerError):
 
 
2631
    _fmt = "Invalid record: %(reason)s"
 
 
2633
    def __init__(self, reason):
 
 
2634
        self.reason = reason
 
 
2637
class ContainerHasExcessDataError(ContainerError):
 
 
2639
    _fmt = "Container has data after end marker: %(excess)r"
 
 
2641
    def __init__(self, excess):
 
 
2642
        self.excess = excess
 
 
2645
class DuplicateRecordNameError(ContainerError):
 
 
2647
    _fmt = "Container has multiple records with the same name: %(name)s"
 
 
2649
    def __init__(self, name):
 
 
2653
class NoDestinationAddress(InternalBzrError):
 
 
2655
    _fmt = "Message does not have a destination address."
 
 
2658
class RepositoryDataStreamError(BzrError):
 
 
2660
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
 
2662
    def __init__(self, reason):
 
 
2663
        self.reason = reason
 
 
2666
class SMTPError(BzrError):
 
 
2668
    _fmt = "SMTP error: %(error)s"
 
 
2670
    def __init__(self, error):
 
 
2674
class NoMessageSupplied(BzrError):
 
 
2676
    _fmt = "No message supplied."
 
 
2679
class NoMailAddressSpecified(BzrError):
 
 
2681
    _fmt = "No mail-to address specified."
 
 
2684
class UnknownMailClient(BzrError):
 
 
2686
    _fmt = "Unknown mail client: %(mail_client)s"
 
 
2688
    def __init__(self, mail_client):
 
 
2689
        BzrError.__init__(self, mail_client=mail_client)
 
 
2692
class MailClientNotFound(BzrError):
 
 
2694
    _fmt = "Unable to find mail client with the following names:"\
 
 
2695
        " %(mail_command_list_string)s"
 
 
2697
    def __init__(self, mail_command_list):
 
 
2698
        mail_command_list_string = ', '.join(mail_command_list)
 
 
2699
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
 
2700
                          mail_command_list_string=mail_command_list_string)
 
 
2702
class SMTPConnectionRefused(SMTPError):
 
 
2704
    _fmt = "SMTP connection to %(host)s refused"
 
 
2706
    def __init__(self, error, host):
 
 
2711
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
 
2713
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
 
2716
class BzrDirError(BzrError):
 
 
2718
    def __init__(self, bzrdir):
 
 
2719
        import bzrlib.urlutils as urlutils
 
 
2720
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
 
2722
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
 
2725
class UnsyncedBranches(BzrDirError):
 
 
2727
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
 
2728
            " bzr help sync-for-reconfigure.")
 
 
2730
    def __init__(self, bzrdir, target_branch):
 
 
2731
        BzrDirError.__init__(self, bzrdir)
 
 
2732
        import bzrlib.urlutils as urlutils
 
 
2733
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
 
2737
class AlreadyBranch(BzrDirError):
 
 
2739
    _fmt = "'%(display_url)s' is already a branch."
 
 
2742
class AlreadyTree(BzrDirError):
 
 
2744
    _fmt = "'%(display_url)s' is already a tree."
 
 
2747
class AlreadyCheckout(BzrDirError):
 
 
2749
    _fmt = "'%(display_url)s' is already a checkout."
 
 
2752
class AlreadyLightweightCheckout(BzrDirError):
 
 
2754
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
 
2757
class AlreadyUsingShared(BzrDirError):
 
 
2759
    _fmt = "'%(display_url)s' is already using a shared repository."
 
 
2762
class AlreadyStandalone(BzrDirError):
 
 
2764
    _fmt = "'%(display_url)s' is already standalone."
 
 
2767
class ReconfigurationNotSupported(BzrDirError):
 
 
2769
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
 
2772
class NoBindLocation(BzrDirError):
 
 
2774
    _fmt = "No location could be found to bind to at %(display_url)s."
 
 
2777
class UncommittedChanges(BzrError):
 
 
2779
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
 
2781
    def __init__(self, tree):
 
 
2782
        import bzrlib.urlutils as urlutils
 
 
2783
        display_url = urlutils.unescape_for_display(
 
 
2784
            tree.bzrdir.root_transport.base, 'ascii')
 
 
2785
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
 
2788
class MissingTemplateVariable(BzrError):
 
 
2790
    _fmt = 'Variable {%(name)s} is not available.'
 
 
2792
    def __init__(self, name):
 
 
2796
class NoTemplate(BzrError):
 
 
2798
    _fmt = 'No template specified.'
 
 
2801
class UnableCreateSymlink(BzrError):
 
 
2803
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
 
2805
    def __init__(self, path=None):
 
 
2809
                path_str = repr(str(path))
 
 
2810
            except UnicodeEncodeError:
 
 
2811
                path_str = repr(path)
 
 
2813
        self.path_str = path_str
 
 
2816
class UnsupportedTimezoneFormat(BzrError):
 
 
2818
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
 
2819
            'options are "utc", "original", "local".')
 
 
2821
    def __init__(self, timezone):
 
 
2822
        self.timezone = timezone
 
 
2825
class CommandAvailableInPlugin(StandardError):
 
 
2827
    internal_error = False
 
 
2829
    def __init__(self, cmd_name, plugin_metadata, provider):
 
 
2831
        self.plugin_metadata = plugin_metadata
 
 
2832
        self.cmd_name = cmd_name
 
 
2833
        self.provider = provider
 
 
2837
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
 
2838
                'However, the following official plugin provides this command: %s\n'
 
 
2839
                'You can install it by going to: %s'
 
 
2840
                % (self.cmd_name, self.plugin_metadata['name'], 
 
 
2841
                    self.plugin_metadata['url']))
 
 
2846
class NoPluginAvailable(BzrError):
 
 
2850
class NotATerminal(BzrError):
 
 
2852
    _fmt = 'Unable to ask for a password without real terminal.'
 
 
2855
class UnableEncodePath(BzrError):
 
 
2857
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
 
2858
            'user encoding %(user_encoding)s')
 
 
2860
    def __init__(self, path, kind):
 
 
2861
        from bzrlib.osutils import get_user_encoding
 
 
2864
        self.user_encoding = osutils.get_user_encoding()
 
 
2867
class NoSuchAlias(BzrError):
 
 
2869
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
 
2871
    def __init__(self, alias_name):
 
 
2872
        BzrError.__init__(self, alias_name=alias_name)
 
 
2875
class DirectoryLookupFailure(BzrError):
 
 
2876
    """Base type for lookup errors."""
 
 
2881
class InvalidLocationAlias(DirectoryLookupFailure):
 
 
2883
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
 
2885
    def __init__(self, alias_name):
 
 
2886
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
 
2889
class UnsetLocationAlias(DirectoryLookupFailure):
 
 
2891
    _fmt = 'No %(alias_name)s location assigned.'
 
 
2893
    def __init__(self, alias_name):
 
 
2894
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
 
2897
class CannotBindAddress(BzrError):
 
 
2899
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
 
2901
    def __init__(self, host, port, orig_error):
 
 
2902
        BzrError.__init__(self, host=host, port=port,
 
 
2903
            orig_error=orig_error[1])
 
 
2906
class UnknownRules(BzrError):
 
 
2908
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
 
2910
    def __init__(self, unknowns):
 
 
2911
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
 
2914
class HookFailed(BzrError):
 
 
2915
    """Raised when a pre_change_branch_tip hook function fails anything other
 
 
2916
    than TipChangeRejected.
 
 
2919
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
 
2920
            "%(traceback_text)s%(exc_value)s")
 
 
2922
    def __init__(self, hook_stage, hook_name, exc_info):
 
 
2924
        self.hook_stage = hook_stage
 
 
2925
        self.hook_name = hook_name
 
 
2926
        self.exc_info = exc_info
 
 
2927
        self.exc_type = exc_info[0]
 
 
2928
        self.exc_value = exc_info[1]
 
 
2929
        self.exc_tb = exc_info[2]
 
 
2930
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
 
2933
class TipChangeRejected(BzrError):
 
 
2934
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
 
2935
    explicitly abort a change to a branch tip.
 
 
2938
    _fmt = u"Tip change rejected: %(msg)s"
 
 
2940
    def __init__(self, msg):
 
 
2944
class ShelfCorrupt(BzrError):
 
 
2946
    _fmt = "Shelf corrupt."
 
 
2949
class NoSuchShelfId(BzrError):
 
 
2951
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
 
 
2953
    def __init__(self, shelf_id):
 
 
2954
        BzrError.__init__(self, shelf_id=shelf_id)
 
 
2957
class UserAbort(BzrError):
 
 
2959
    _fmt = 'The user aborted the operation.'