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.
 
 
137
    def _get_format_string(self):
 
 
138
        """Return format string for this exception or None"""
 
 
139
        fmt = getattr(self, '_fmt', None)
 
 
142
        fmt = getattr(self, '__doc__', None)
 
 
144
            symbol_versioning.warn("%s uses its docstring as a format, "
 
 
145
                    "it should use _fmt instead" % self.__class__.__name__,
 
 
148
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
 
149
            % (self.__class__.__name__,
 
 
151
               getattr(self, '_fmt', None),
 
 
154
    def __eq__(self, other):
 
 
155
        if self.__class__ != other.__class__:
 
 
156
            return NotImplemented
 
 
157
        return self.__dict__ == other.__dict__
 
 
160
class InternalBzrError(BzrError):
 
 
161
    """Base class for errors that are internal in nature.
 
 
163
    This is a convenience class for errors that are internal. The
 
 
164
    internal_error attribute can still be altered in subclasses, if needed.
 
 
165
    Using this class is simply an easy way to get internal errors.
 
 
168
    internal_error = True
 
 
171
class BzrNewError(BzrError):
 
 
172
    """Deprecated error base class."""
 
 
173
    # base classes should override the docstring with their human-
 
 
174
    # readable explanation
 
 
176
    def __init__(self, *args, **kwds):
 
 
177
        # XXX: Use the underlying BzrError to always generate the args
 
 
178
        # attribute if it doesn't exist.  We can't use super here, because
 
 
179
        # exceptions are old-style classes in python2.4 (but new in 2.5).
 
 
181
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
 
182
             'please convert %s to use BzrError instead'
 
 
183
             % self.__class__.__name__,
 
 
186
        BzrError.__init__(self, *args)
 
 
187
        for key, value in kwds.items():
 
 
188
            setattr(self, key, value)
 
 
192
            # __str__() should always return a 'str' object
 
 
193
            # never a 'unicode' object.
 
 
194
            s = self.__doc__ % self.__dict__
 
 
195
            if isinstance(s, unicode):
 
 
196
                return s.encode('utf8')
 
 
198
        except (TypeError, NameError, ValueError, KeyError), e:
 
 
199
            return 'Unprintable exception %s(%r): %r' \
 
 
200
                % (self.__class__.__name__,
 
 
204
class AlreadyBuilding(BzrError):
 
 
206
    _fmt = "The tree builder is already building a tree."
 
 
209
class BranchError(BzrError):
 
 
210
    """Base class for concrete 'errors about a branch'."""
 
 
212
    def __init__(self, branch):
 
 
213
        BzrError.__init__(self, branch=branch)
 
 
216
class BzrCheckError(InternalBzrError):
 
 
218
    _fmt = "Internal check failed: %(msg)s"
 
 
220
    def __init__(self, msg):
 
 
221
        BzrError.__init__(self)
 
 
225
class DirstateCorrupt(BzrError):
 
 
227
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
 
229
    def __init__(self, state, msg):
 
 
230
        BzrError.__init__(self)
 
 
235
class DisabledMethod(InternalBzrError):
 
 
237
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
 
239
    def __init__(self, class_name):
 
 
240
        BzrError.__init__(self)
 
 
241
        self.class_name = class_name
 
 
244
class IncompatibleAPI(BzrError):
 
 
246
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
 
247
        'It supports versions "%(minimum)s" to "%(current)s".'
 
 
249
    def __init__(self, api, wanted, minimum, current):
 
 
252
        self.minimum = minimum
 
 
253
        self.current = current
 
 
256
class InProcessTransport(BzrError):
 
 
258
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
 
261
    def __init__(self, transport):
 
 
262
        self.transport = transport
 
 
265
class InvalidEntryName(InternalBzrError):
 
 
267
    _fmt = "Invalid entry name: %(name)s"
 
 
269
    def __init__(self, name):
 
 
270
        BzrError.__init__(self)
 
 
274
class InvalidRevisionNumber(BzrError):
 
 
276
    _fmt = "Invalid revision number %(revno)s"
 
 
278
    def __init__(self, revno):
 
 
279
        BzrError.__init__(self)
 
 
283
class InvalidRevisionId(BzrError):
 
 
285
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
 
287
    def __init__(self, revision_id, branch):
 
 
288
        # branch can be any string or object with __str__ defined
 
 
289
        BzrError.__init__(self)
 
 
290
        self.revision_id = revision_id
 
 
294
class ReservedId(BzrError):
 
 
296
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
 
298
    def __init__(self, revision_id):
 
 
299
        self.revision_id = revision_id
 
 
302
class RootMissing(InternalBzrError):
 
 
304
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
 
305
        "record_entry_contents.")
 
 
308
class NoPublicBranch(BzrError):
 
 
310
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
 
312
    def __init__(self, branch):
 
 
313
        import bzrlib.urlutils as urlutils
 
 
314
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
315
        BzrError.__init__(self, branch_url=public_location)
 
 
318
class NoHelpTopic(BzrError):
 
 
320
    _fmt = ("No help could be found for '%(topic)s'. "
 
 
321
        "Please use 'bzr help topics' to obtain a list of topics.")
 
 
323
    def __init__(self, topic):
 
 
327
class NoSuchId(BzrError):
 
 
329
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
 
 
331
    def __init__(self, tree, file_id):
 
 
332
        BzrError.__init__(self)
 
 
333
        self.file_id = file_id
 
 
337
class NoSuchIdInRepository(NoSuchId):
 
 
339
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
 
342
    def __init__(self, repository, file_id):
 
 
343
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
 
346
class NotStacked(BranchError):
 
 
348
    _fmt = "The branch '%(branch)s' is not stacked."
 
 
351
class InventoryModified(InternalBzrError):
 
 
353
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
 
354
            " so a clean inventory cannot be read without data loss.")
 
 
356
    def __init__(self, tree):
 
 
360
class NoWorkingTree(BzrError):
 
 
362
    _fmt = 'No WorkingTree exists for "%(base)s".'
 
 
364
    def __init__(self, base):
 
 
365
        BzrError.__init__(self)
 
 
369
class NotBuilding(BzrError):
 
 
371
    _fmt = "Not currently building a tree."
 
 
374
class NotLocalUrl(BzrError):
 
 
376
    _fmt = "%(url)s is not a local path."
 
 
378
    def __init__(self, url):
 
 
382
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
 
384
    _fmt = 'Working tree already populated in "%(base)s"'
 
 
386
    def __init__(self, base):
 
 
390
class BzrCommandError(BzrError):
 
 
391
    """Error from user command"""
 
 
393
    # Error from malformed user command; please avoid raising this as a
 
 
394
    # generic exception not caused by user input.
 
 
396
    # I think it's a waste of effort to differentiate between errors that
 
 
397
    # are not intended to be caught anyway.  UI code need not subclass
 
 
398
    # BzrCommandError, and non-UI code should not throw a subclass of
 
 
399
    # BzrCommandError.  ADHB 20051211
 
 
402
class NotWriteLocked(BzrError):
 
 
404
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
 
406
    def __init__(self, not_locked):
 
 
407
        self.not_locked = not_locked
 
 
410
class BzrOptionError(BzrCommandError):
 
 
412
    _fmt = "Error in command line options"
 
 
415
class BadIndexFormatSignature(BzrError):
 
 
417
    _fmt = "%(value)s is not an index of type %(_type)s."
 
 
419
    def __init__(self, value, _type):
 
 
420
        BzrError.__init__(self)
 
 
425
class BadIndexData(BzrError):
 
 
427
    _fmt = "Error in data for index %(value)s."
 
 
429
    def __init__(self, value):
 
 
430
        BzrError.__init__(self)
 
 
434
class BadIndexDuplicateKey(BzrError):
 
 
436
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
 
438
    def __init__(self, key, index):
 
 
439
        BzrError.__init__(self)
 
 
444
class BadIndexKey(BzrError):
 
 
446
    _fmt = "The key '%(key)s' is not a valid key."
 
 
448
    def __init__(self, key):
 
 
449
        BzrError.__init__(self)
 
 
453
class BadIndexOptions(BzrError):
 
 
455
    _fmt = "Could not parse options for index %(value)s."
 
 
457
    def __init__(self, value):
 
 
458
        BzrError.__init__(self)
 
 
462
class BadIndexValue(BzrError):
 
 
464
    _fmt = "The value '%(value)s' is not a valid value."
 
 
466
    def __init__(self, value):
 
 
467
        BzrError.__init__(self)
 
 
471
class BadOptionValue(BzrError):
 
 
473
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
 
475
    def __init__(self, name, value):
 
 
476
        BzrError.__init__(self, name=name, value=value)
 
 
479
class StrictCommitFailed(BzrError):
 
 
481
    _fmt = "Commit refused because there are unknown files in the tree"
 
 
484
# XXX: Should be unified with TransportError; they seem to represent the
 
 
486
# RBC 20060929: I think that unifiying with TransportError would be a mistake
 
 
487
# - this is finer than a TransportError - and more useful as such. It 
 
 
488
# differentiates between 'transport has failed' and 'operation on a transport
 
 
490
class PathError(BzrError):
 
 
492
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
 
494
    def __init__(self, path, extra=None):
 
 
495
        BzrError.__init__(self)
 
 
498
            self.extra = ': ' + str(extra)
 
 
503
class NoSuchFile(PathError):
 
 
505
    _fmt = "No such file: %(path)r%(extra)s"
 
 
508
class FileExists(PathError):
 
 
510
    _fmt = "File exists: %(path)r%(extra)s"
 
 
513
class RenameFailedFilesExist(BzrError):
 
 
514
    """Used when renaming and both source and dest exist."""
 
 
516
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
 
517
            " (Use --after to tell bzr about a rename that has already"
 
 
518
            " happened)%(extra)s")
 
 
520
    def __init__(self, source, dest, extra=None):
 
 
521
        BzrError.__init__(self)
 
 
522
        self.source = str(source)
 
 
523
        self.dest = str(dest)
 
 
525
            self.extra = ' ' + str(extra)
 
 
530
class NotADirectory(PathError):
 
 
532
    _fmt = '"%(path)s" is not a directory %(extra)s'
 
 
535
class NotInWorkingDirectory(PathError):
 
 
537
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
 
 
540
class DirectoryNotEmpty(PathError):
 
 
542
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
 
545
class HardLinkNotSupported(PathError):
 
 
547
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
 
550
class ReadingCompleted(InternalBzrError):
 
 
552
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
 
553
            "called upon it - the request has been completed and no more "
 
 
556
    def __init__(self, request):
 
 
557
        self.request = request
 
 
560
class ResourceBusy(PathError):
 
 
562
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
 
 
565
class PermissionDenied(PathError):
 
 
567
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
 
570
class InvalidURL(PathError):
 
 
572
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
 
575
class InvalidURLJoin(PathError):
 
 
577
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
 
579
    def __init__(self, reason, base, join_args):
 
 
582
        self.join_args = join_args
 
 
583
        PathError.__init__(self, base, reason)
 
 
586
class InvalidRebaseURLs(PathError):
 
 
588
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
 
590
    def __init__(self, from_, to):
 
 
593
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
 
596
class UnavailableRepresentation(InternalBzrError):
 
 
598
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
 
599
        "is encoded as '%(native)s'.")
 
 
601
    def __init__(self, key, wanted, native):
 
 
602
        InternalBzrError.__init__(self)
 
 
608
class UnknownHook(BzrError):
 
 
610
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
 
612
    def __init__(self, hook_type, hook_name):
 
 
613
        BzrError.__init__(self)
 
 
614
        self.type = hook_type
 
 
615
        self.hook = hook_name
 
 
618
class UnsupportedProtocol(PathError):
 
 
620
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
 
622
    def __init__(self, url, extra):
 
 
623
        PathError.__init__(self, url, extra=extra)
 
 
626
class UnstackableBranchFormat(BzrError):
 
 
628
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
 
629
        "You will need to upgrade the branch to permit branch stacking.")
 
 
631
    def __init__(self, format, url):
 
 
632
        BzrError.__init__(self)
 
 
637
class UnstackableRepositoryFormat(BzrError):
 
 
639
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
 
640
        "You will need to upgrade the repository to permit branch stacking.")
 
 
642
    def __init__(self, format, url):
 
 
643
        BzrError.__init__(self)
 
 
648
class ReadError(PathError):
 
 
650
    _fmt = """Error reading from %(path)r."""
 
 
653
class ShortReadvError(PathError):
 
 
655
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
 
656
            ' at %(offset)s for "%(path)s"%(extra)s')
 
 
658
    internal_error = True
 
 
660
    def __init__(self, path, offset, length, actual, extra=None):
 
 
661
        PathError.__init__(self, path, extra=extra)
 
 
667
class PathNotChild(PathError):
 
 
669
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
 
671
    internal_error = True
 
 
673
    def __init__(self, path, base, extra=None):
 
 
674
        BzrError.__init__(self)
 
 
678
            self.extra = ': ' + str(extra)
 
 
683
class InvalidNormalization(PathError):
 
 
685
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
 
688
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
 
689
# the exception object is a bit undesirable.
 
 
690
# TODO: Probably this behavior of should be a common superclass 
 
 
691
class NotBranchError(PathError):
 
 
693
    _fmt = 'Not a branch: "%(path)s".'
 
 
695
    def __init__(self, path):
 
 
696
       import bzrlib.urlutils as urlutils
 
 
697
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
 
700
class NoSubmitBranch(PathError):
 
 
702
    _fmt = 'No submit branch available for branch "%(path)s"'
 
 
704
    def __init__(self, branch):
 
 
705
       import bzrlib.urlutils as urlutils
 
 
706
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
709
class AlreadyBranchError(PathError):
 
 
711
    _fmt = 'Already a branch: "%(path)s".'
 
 
714
class BranchExistsWithoutWorkingTree(PathError):
 
 
716
    _fmt = 'Directory contains a branch, but no working tree \
 
 
717
(use bzr checkout if you wish to build a working tree): "%(path)s"'
 
 
720
class AtomicFileAlreadyClosed(PathError):
 
 
722
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
 
725
    def __init__(self, path, function):
 
 
726
        PathError.__init__(self, path=path, extra=None)
 
 
727
        self.function = function
 
 
730
class InaccessibleParent(PathError):
 
 
732
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
 
733
            ' relative path "%(path)s"')
 
 
735
    def __init__(self, path, base):
 
 
736
        PathError.__init__(self, path)
 
 
740
class NoRepositoryPresent(BzrError):
 
 
742
    _fmt = 'No repository present: "%(path)s"'
 
 
743
    def __init__(self, bzrdir):
 
 
744
        BzrError.__init__(self)
 
 
745
        self.path = bzrdir.transport.clone('..').base
 
 
748
class FileInWrongBranch(BzrError):
 
 
750
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
 
 
752
    def __init__(self, branch, path):
 
 
753
        BzrError.__init__(self)
 
 
755
        self.branch_base = branch.base
 
 
759
class UnsupportedFormatError(BzrError):
 
 
761
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
 
764
class UnknownFormatError(BzrError):
 
 
766
    _fmt = "Unknown %(kind)s format: %(format)r"
 
 
768
    def __init__(self, format, kind='branch'):
 
 
773
class IncompatibleFormat(BzrError):
 
 
775
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
777
    def __init__(self, format, bzrdir_format):
 
 
778
        BzrError.__init__(self)
 
 
780
        self.bzrdir = bzrdir_format
 
 
783
class IncompatibleRepositories(BzrError):
 
 
785
    _fmt = "%(target)s\n" \
 
 
786
            "is not compatible with\n" \
 
 
790
    def __init__(self, source, target, details=None):
 
 
792
            details = "(no details)"
 
 
793
        BzrError.__init__(self, target=target, source=source, details=details)
 
 
796
class IncompatibleRevision(BzrError):
 
 
798
    _fmt = "Revision is not compatible with %(repo_format)s"
 
 
800
    def __init__(self, repo_format):
 
 
801
        BzrError.__init__(self)
 
 
802
        self.repo_format = repo_format
 
 
805
class AlreadyVersionedError(BzrError):
 
 
806
    """Used when a path is expected not to be versioned, but it is."""
 
 
808
    _fmt = "%(context_info)s%(path)s is already versioned."
 
 
810
    def __init__(self, path, context_info=None):
 
 
811
        """Construct a new AlreadyVersionedError.
 
 
813
        :param path: This is the path which is versioned,
 
 
814
        which should be in a user friendly form.
 
 
815
        :param context_info: If given, this is information about the context,
 
 
816
        which could explain why this is expected to not be versioned.
 
 
818
        BzrError.__init__(self)
 
 
820
        if context_info is None:
 
 
821
            self.context_info = ''
 
 
823
            self.context_info = context_info + ". "
 
 
826
class NotVersionedError(BzrError):
 
 
827
    """Used when a path is expected to be versioned, but it is not."""
 
 
829
    _fmt = "%(context_info)s%(path)s is not versioned."
 
 
831
    def __init__(self, path, context_info=None):
 
 
832
        """Construct a new NotVersionedError.
 
 
834
        :param path: This is the path which is not versioned,
 
 
835
        which should be in a user friendly form.
 
 
836
        :param context_info: If given, this is information about the context,
 
 
837
        which could explain why this is expected to be versioned.
 
 
839
        BzrError.__init__(self)
 
 
841
        if context_info is None:
 
 
842
            self.context_info = ''
 
 
844
            self.context_info = context_info + ". "
 
 
847
class PathsNotVersionedError(BzrError):
 
 
848
    """Used when reporting several paths which are not versioned"""
 
 
850
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
 
852
    def __init__(self, paths):
 
 
853
        from bzrlib.osutils import quotefn
 
 
854
        BzrError.__init__(self)
 
 
856
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
859
class PathsDoNotExist(BzrError):
 
 
861
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
 
863
    # used when reporting that paths are neither versioned nor in the working
 
 
866
    def __init__(self, paths, extra=None):
 
 
868
        from bzrlib.osutils import quotefn
 
 
869
        BzrError.__init__(self)
 
 
871
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
873
            self.extra = ': ' + str(extra)
 
 
878
class BadFileKindError(BzrError):
 
 
880
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
 
882
    def __init__(self, filename, kind):
 
 
883
        BzrError.__init__(self, filename=filename, kind=kind)
 
 
886
class BadFilenameEncoding(BzrError):
 
 
888
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
 
889
            ' encoding %(fs_encoding)s')
 
 
891
    def __init__(self, filename, fs_encoding):
 
 
892
        BzrError.__init__(self)
 
 
893
        self.filename = filename
 
 
894
        self.fs_encoding = fs_encoding
 
 
897
class ForbiddenControlFileError(BzrError):
 
 
899
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
 
902
class LockError(InternalBzrError):
 
 
904
    _fmt = "Lock error: %(msg)s"
 
 
906
    # All exceptions from the lock/unlock functions should be from
 
 
907
    # this exception class.  They will be translated as necessary. The
 
 
908
    # original exception is available as e.original_error
 
 
910
    # New code should prefer to raise specific subclasses
 
 
911
    def __init__(self, message):
 
 
912
        # Python 2.5 uses a slot for StandardError.message,
 
 
913
        # so use a different variable name.  We now work around this in
 
 
914
        # BzrError.__str__, but this member name is kept for compatability.
 
 
918
class LockActive(LockError):
 
 
920
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
 
922
    internal_error = False
 
 
924
    def __init__(self, lock_description):
 
 
925
        self.lock_description = lock_description
 
 
928
class CommitNotPossible(LockError):
 
 
930
    _fmt = "A commit was attempted but we do not have a write lock open."
 
 
936
class AlreadyCommitted(LockError):
 
 
938
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
 
944
class ReadOnlyError(LockError):
 
 
946
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
 
948
    # TODO: There should also be an error indicating that you need a write
 
 
949
    # lock and don't have any lock at all... mbp 20070226
 
 
951
    def __init__(self, obj):
 
 
955
class LockFailed(LockError):
 
 
957
    internal_error = False
 
 
959
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
 
961
    def __init__(self, lock, why):
 
 
962
        LockError.__init__(self, '')
 
 
967
class OutSideTransaction(BzrError):
 
 
969
    _fmt = ("A transaction related operation was attempted after"
 
 
970
            " the transaction finished.")
 
 
973
class ObjectNotLocked(LockError):
 
 
975
    _fmt = "%(obj)r is not locked"
 
 
977
    # this can indicate that any particular object is not locked; see also
 
 
978
    # LockNotHeld which means that a particular *lock* object is not held by
 
 
979
    # the caller -- perhaps they should be unified.
 
 
980
    def __init__(self, obj):
 
 
984
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
 
986
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
 
988
    def __init__(self, obj):
 
 
992
class UnlockableTransport(LockError):
 
 
994
    internal_error = False
 
 
996
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
 
998
    def __init__(self, transport):
 
 
999
        self.transport = transport
 
 
1002
class LockContention(LockError):
 
 
1004
    _fmt = 'Could not acquire lock "%(lock)s"'
 
 
1005
    # TODO: show full url for lock, combining the transport and relative
 
 
1008
    internal_error = False
 
 
1010
    def __init__(self, lock):
 
 
1014
class LockBroken(LockError):
 
 
1016
    _fmt = ("Lock was broken while still open: %(lock)s"
 
 
1017
            " - check storage consistency!")
 
 
1019
    internal_error = False
 
 
1021
    def __init__(self, lock):
 
 
1025
class LockBreakMismatch(LockError):
 
 
1027
    _fmt = ("Lock was released and re-acquired before being broken:"
 
 
1028
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
 
1030
    internal_error = False
 
 
1032
    def __init__(self, lock, holder, target):
 
 
1034
        self.holder = holder
 
 
1035
        self.target = target
 
 
1038
class LockNotHeld(LockError):
 
 
1040
    _fmt = "Lock not held: %(lock)s"
 
 
1042
    internal_error = False
 
 
1044
    def __init__(self, lock):
 
 
1048
class TokenLockingNotSupported(LockError):
 
 
1050
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
 
1052
    def __init__(self, obj):
 
 
1056
class TokenMismatch(LockBroken):
 
 
1058
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
 
1060
    internal_error = True
 
 
1062
    def __init__(self, given_token, lock_token):
 
 
1063
        self.given_token = given_token
 
 
1064
        self.lock_token = lock_token
 
 
1067
class PointlessCommit(BzrError):
 
 
1069
    _fmt = "No changes to commit"
 
 
1072
class CannotCommitSelectedFileMerge(BzrError):
 
 
1074
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
 
1075
        ' files %(files_str)s'
 
 
1077
    def __init__(self, files):
 
 
1078
        files_str = ', '.join(files)
 
 
1079
        BzrError.__init__(self, files=files, files_str=files_str)
 
 
1082
class BadCommitMessageEncoding(BzrError):
 
 
1084
    _fmt = 'The specified commit message contains characters unsupported by '\
 
 
1085
        'the current encoding.'
 
 
1088
class UpgradeReadonly(BzrError):
 
 
1090
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
 
1093
class UpToDateFormat(BzrError):
 
 
1095
    _fmt = "The branch format %(format)s is already at the most recent format."
 
 
1097
    def __init__(self, format):
 
 
1098
        BzrError.__init__(self)
 
 
1099
        self.format = format
 
 
1102
class StrictCommitFailed(Exception):
 
 
1104
    _fmt = "Commit refused because there are unknowns in the tree."
 
 
1107
class NoSuchRevision(InternalBzrError):
 
 
1109
    _fmt = "%(branch)s has no revision %(revision)s"
 
 
1111
    def __init__(self, branch, revision):
 
 
1112
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
 
1113
        BzrError.__init__(self, branch=branch, revision=revision)
 
 
1116
class RangeInChangeOption(BzrError):
 
 
1118
    _fmt = "Option --change does not accept revision ranges"
 
 
1121
class NoSuchRevisionSpec(BzrError):
 
 
1123
    _fmt = "No namespace registered for string: %(spec)r"
 
 
1125
    def __init__(self, spec):
 
 
1126
        BzrError.__init__(self, spec=spec)
 
 
1129
class NoSuchRevisionInTree(NoSuchRevision):
 
 
1130
    """When using Tree.revision_tree, and the revision is not accessible."""
 
 
1132
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
 
1134
    def __init__(self, tree, revision_id):
 
 
1135
        BzrError.__init__(self)
 
 
1137
        self.revision_id = revision_id
 
 
1140
class InvalidRevisionSpec(BzrError):
 
 
1142
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
1143
            " %(branch)s%(extra)s")
 
 
1145
    def __init__(self, spec, branch, extra=None):
 
 
1146
        BzrError.__init__(self, branch=branch, spec=spec)
 
 
1148
            self.extra = '\n' + str(extra)
 
 
1153
class HistoryMissing(BzrError):
 
 
1155
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
 
1158
class AppendRevisionsOnlyViolation(BzrError):
 
 
1160
    _fmt = ('Operation denied because it would change the main history,'
 
 
1161
           ' which is not permitted by the append_revisions_only setting on'
 
 
1162
           ' branch "%(location)s".')
 
 
1164
    def __init__(self, location):
 
 
1165
       import bzrlib.urlutils as urlutils
 
 
1166
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
1167
       BzrError.__init__(self, location=location)
 
 
1170
class DivergedBranches(BzrError):
 
 
1172
    _fmt = ("These branches have diverged."
 
 
1173
            " Use the merge command to reconcile them.")
 
 
1175
    def __init__(self, branch1, branch2):
 
 
1176
        self.branch1 = branch1
 
 
1177
        self.branch2 = branch2
 
 
1180
class NotLefthandHistory(InternalBzrError):
 
 
1182
    _fmt = "Supplied history does not follow left-hand parents"
 
 
1184
    def __init__(self, history):
 
 
1185
        BzrError.__init__(self, history=history)
 
 
1188
class UnrelatedBranches(BzrError):
 
 
1190
    _fmt = ("Branches have no common ancestor, and"
 
 
1191
            " no merge base revision was specified.")
 
 
1194
class CannotReverseCherrypick(BzrError):
 
 
1196
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
 
1200
class NoCommonAncestor(BzrError):
 
 
1202
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
 
1204
    def __init__(self, revision_a, revision_b):
 
 
1205
        self.revision_a = revision_a
 
 
1206
        self.revision_b = revision_b
 
 
1209
class NoCommonRoot(BzrError):
 
 
1211
    _fmt = ("Revisions are not derived from the same root: "
 
 
1212
           "%(revision_a)s %(revision_b)s.")
 
 
1214
    def __init__(self, revision_a, revision_b):
 
 
1215
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
 
1218
class NotAncestor(BzrError):
 
 
1220
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
 
1222
    def __init__(self, rev_id, not_ancestor_id):
 
 
1223
        BzrError.__init__(self, rev_id=rev_id,
 
 
1224
            not_ancestor_id=not_ancestor_id)
 
 
1227
class InstallFailed(BzrError):
 
 
1229
    def __init__(self, revisions):
 
 
1230
        revision_str = ", ".join(str(r) for r in revisions)
 
 
1231
        msg = "Could not install revisions:\n%s" % revision_str
 
 
1232
        BzrError.__init__(self, msg)
 
 
1233
        self.revisions = revisions
 
 
1236
class AmbiguousBase(BzrError):
 
 
1238
    def __init__(self, bases):
 
 
1239
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
 
1241
        msg = ("The correct base is unclear, because %s are all equally close"
 
 
1243
        BzrError.__init__(self, msg)
 
 
1247
class NoCommits(BranchError):
 
 
1249
    _fmt = "Branch %(branch)s has no commits."
 
 
1252
class UnlistableStore(BzrError):
 
 
1254
    def __init__(self, store):
 
 
1255
        BzrError.__init__(self, "Store %s is not listable" % store)
 
 
1259
class UnlistableBranch(BzrError):
 
 
1261
    def __init__(self, br):
 
 
1262
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
 
1265
class BoundBranchOutOfDate(BzrError):
 
 
1267
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
 
1270
    def __init__(self, branch, master):
 
 
1271
        BzrError.__init__(self)
 
 
1272
        self.branch = branch
 
 
1273
        self.master = master
 
 
1276
class CommitToDoubleBoundBranch(BzrError):
 
 
1278
    _fmt = ("Cannot commit to branch %(branch)s."
 
 
1279
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
 
1281
    def __init__(self, branch, master, remote):
 
 
1282
        BzrError.__init__(self)
 
 
1283
        self.branch = branch
 
 
1284
        self.master = master
 
 
1285
        self.remote = remote
 
 
1288
class OverwriteBoundBranch(BzrError):
 
 
1290
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
 
1292
    def __init__(self, branch):
 
 
1293
        BzrError.__init__(self)
 
 
1294
        self.branch = branch
 
 
1297
class BoundBranchConnectionFailure(BzrError):
 
 
1299
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
 
1300
            " => %(target)s: %(error)s")
 
 
1302
    def __init__(self, branch, target, error):
 
 
1303
        BzrError.__init__(self)
 
 
1304
        self.branch = branch
 
 
1305
        self.target = target
 
 
1309
class WeaveError(BzrError):
 
 
1311
    _fmt = "Error in processing weave: %(msg)s"
 
 
1313
    def __init__(self, msg=None):
 
 
1314
        BzrError.__init__(self)
 
 
1318
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1320
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1322
    def __init__(self, revision_id, weave):
 
 
1324
        WeaveError.__init__(self)
 
 
1325
        self.revision_id = revision_id
 
 
1329
class WeaveRevisionNotPresent(WeaveError):
 
 
1331
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1333
    def __init__(self, revision_id, weave):
 
 
1334
        WeaveError.__init__(self)
 
 
1335
        self.revision_id = revision_id
 
 
1339
class WeaveFormatError(WeaveError):
 
 
1341
    _fmt = "Weave invariant violated: %(what)s"
 
 
1343
    def __init__(self, what):
 
 
1344
        WeaveError.__init__(self)
 
 
1348
class WeaveParentMismatch(WeaveError):
 
 
1350
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
 
1353
class WeaveInvalidChecksum(WeaveError):
 
 
1355
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1358
class WeaveTextDiffers(WeaveError):
 
 
1360
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1361
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1363
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1364
        WeaveError.__init__(self)
 
 
1365
        self.revision_id = revision_id
 
 
1366
        self.weave_a = weave_a
 
 
1367
        self.weave_b = weave_b
 
 
1370
class WeaveTextDiffers(WeaveError):
 
 
1372
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1373
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1375
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1376
        WeaveError.__init__(self)
 
 
1377
        self.revision_id = revision_id
 
 
1378
        self.weave_a = weave_a
 
 
1379
        self.weave_b = weave_b
 
 
1382
class VersionedFileError(BzrError):
 
 
1384
    _fmt = "Versioned file error"
 
 
1387
class RevisionNotPresent(VersionedFileError):
 
 
1389
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
 
1391
    def __init__(self, revision_id, file_id):
 
 
1392
        VersionedFileError.__init__(self)
 
 
1393
        self.revision_id = revision_id
 
 
1394
        self.file_id = file_id
 
 
1397
class RevisionAlreadyPresent(VersionedFileError):
 
 
1399
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
 
1401
    def __init__(self, revision_id, file_id):
 
 
1402
        VersionedFileError.__init__(self)
 
 
1403
        self.revision_id = revision_id
 
 
1404
        self.file_id = file_id
 
 
1407
class VersionedFileInvalidChecksum(VersionedFileError):
 
 
1409
    _fmt = "Text did not match its checksum: %(message)s"
 
 
1412
class KnitError(InternalBzrError):
 
 
1417
class KnitCorrupt(KnitError):
 
 
1419
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1421
    def __init__(self, filename, how):
 
 
1422
        KnitError.__init__(self)
 
 
1423
        self.filename = filename
 
 
1427
class KnitDataStreamIncompatible(KnitError):
 
 
1428
    # Not raised anymore, as we can convert data streams.  In future we may
 
 
1429
    # need it again for more exotic cases, so we're keeping it around for now.
 
 
1431
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
 
1433
    def __init__(self, stream_format, target_format):
 
 
1434
        self.stream_format = stream_format
 
 
1435
        self.target_format = target_format
 
 
1438
class KnitDataStreamUnknown(KnitError):
 
 
1439
    # Indicates a data stream we don't know how to handle.
 
 
1441
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
 
1443
    def __init__(self, stream_format):
 
 
1444
        self.stream_format = stream_format
 
 
1447
class KnitHeaderError(KnitError):
 
 
1449
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
 
1451
    def __init__(self, badline, filename):
 
 
1452
        KnitError.__init__(self)
 
 
1453
        self.badline = badline
 
 
1454
        self.filename = filename
 
 
1456
class KnitIndexUnknownMethod(KnitError):
 
 
1457
    """Raised when we don't understand the storage method.
 
 
1459
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1462
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1463
            " in options: %(options)r")
 
 
1465
    def __init__(self, filename, options):
 
 
1466
        KnitError.__init__(self)
 
 
1467
        self.filename = filename
 
 
1468
        self.options = options
 
 
1471
class NoSuchExportFormat(BzrError):
 
 
1473
    _fmt = "Export format %(format)r not supported"
 
 
1475
    def __init__(self, format):
 
 
1476
        BzrError.__init__(self)
 
 
1477
        self.format = format
 
 
1480
class TransportError(BzrError):
 
 
1482
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1484
    def __init__(self, msg=None, orig_error=None):
 
 
1485
        if msg is None and orig_error is not None:
 
 
1486
            msg = str(orig_error)
 
 
1487
        if orig_error is None:
 
 
1492
        self.orig_error = orig_error
 
 
1493
        BzrError.__init__(self)
 
 
1496
class TooManyConcurrentRequests(InternalBzrError):
 
 
1498
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1499
            " Be sure to finish_writing and finish_reading on the"
 
 
1500
            " currently open request.")
 
 
1502
    def __init__(self, medium):
 
 
1503
        self.medium = medium
 
 
1506
class SmartProtocolError(TransportError):
 
 
1508
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1510
    def __init__(self, details):
 
 
1511
        self.details = details
 
 
1514
class UnexpectedProtocolVersionMarker(TransportError):
 
 
1516
    _fmt = "Received bad protocol version marker: %(marker)r"
 
 
1518
    def __init__(self, marker):
 
 
1519
        self.marker = marker
 
 
1522
class UnknownSmartMethod(InternalBzrError):
 
 
1524
    _fmt = "The server does not recognise the '%(verb)s' request."
 
 
1526
    def __init__(self, verb):
 
 
1530
class SmartMessageHandlerError(InternalBzrError):
 
 
1532
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
 
1534
    def __init__(self, exc_info):
 
 
1535
        self.exc_type, self.exc_value, self.tb = exc_info
 
 
1538
# A set of semi-meaningful errors which can be thrown
 
 
1539
class TransportNotPossible(TransportError):
 
 
1541
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1544
class ConnectionError(TransportError):
 
 
1546
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1549
class SocketConnectionError(ConnectionError):
 
 
1551
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1553
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1555
            msg = 'Failed to connect to'
 
 
1556
        if orig_error is None:
 
 
1559
            orig_error = '; ' + str(orig_error)
 
 
1560
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1565
            self.port = ':%s' % port
 
 
1568
class ConnectionReset(TransportError):
 
 
1570
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1573
class InvalidRange(TransportError):
 
 
1575
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
 
1577
    def __init__(self, path, offset, msg=None):
 
 
1578
        TransportError.__init__(self, msg)
 
 
1580
        self.offset = offset
 
 
1583
class InvalidHttpResponse(TransportError):
 
 
1585
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1587
    def __init__(self, path, msg, orig_error=None):
 
 
1589
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1592
class InvalidHttpRange(InvalidHttpResponse):
 
 
1594
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1596
    def __init__(self, path, range, msg):
 
 
1598
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1601
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1603
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1605
    def __init__(self, path, ctype, msg):
 
 
1607
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1610
class RedirectRequested(TransportError):
 
 
1612
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1614
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
 
1615
        self.source = source
 
 
1616
        self.target = target
 
 
1618
            self.permanently = ' permanently'
 
 
1620
            self.permanently = ''
 
 
1621
        self._qualified_proto = qual_proto
 
 
1622
        TransportError.__init__(self)
 
 
1624
    def _requalify_url(self, url):
 
 
1625
        """Restore the qualified proto in front of the url"""
 
 
1626
        # When this exception is raised, source and target are in
 
 
1627
        # user readable format. But some transports may use a
 
 
1628
        # different proto (http+urllib:// will present http:// to
 
 
1629
        # the user. If a qualified proto is specified, the code
 
 
1630
        # trapping the exception can get the qualified urls to
 
 
1631
        # properly handle the redirection themself (creating a
 
 
1632
        # new transport object from the target url for example).
 
 
1633
        # But checking that the scheme of the original and
 
 
1634
        # redirected urls are the same can be tricky. (see the
 
 
1635
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1637
        if self._qualified_proto is None:
 
 
1640
        # The TODO related to NotBranchError mention that doing
 
 
1641
        # that kind of manipulation on the urls may not be the
 
 
1642
        # exception object job. On the other hand, this object is
 
 
1643
        # the interface between the code and the user so
 
 
1644
        # presenting the urls in different ways is indeed its
 
 
1647
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1648
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1651
    def get_source_url(self):
 
 
1652
        return self._requalify_url(self.source)
 
 
1654
    def get_target_url(self):
 
 
1655
        return self._requalify_url(self.target)
 
 
1658
class TooManyRedirections(TransportError):
 
 
1660
    _fmt = "Too many redirections"
 
 
1663
class ConflictsInTree(BzrError):
 
 
1665
    _fmt = "Working tree has conflicts."
 
 
1668
class ParseConfigError(BzrError):
 
 
1670
    def __init__(self, errors, filename):
 
 
1671
        if filename is None:
 
 
1673
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1674
            (filename, ('\n'.join(e.msg for e in errors)))
 
 
1675
        BzrError.__init__(self, message)
 
 
1678
class NoEmailInUsername(BzrError):
 
 
1680
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1682
    def __init__(self, username):
 
 
1683
        BzrError.__init__(self)
 
 
1684
        self.username = username
 
 
1687
class SigningFailed(BzrError):
 
 
1689
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
 
1691
    def __init__(self, command_line):
 
 
1692
        BzrError.__init__(self, command_line=command_line)
 
 
1695
class WorkingTreeNotRevision(BzrError):
 
 
1697
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1698
            " the last commit, but weave merge requires that it be"
 
 
1701
    def __init__(self, tree):
 
 
1702
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1705
class CantReprocessAndShowBase(BzrError):
 
 
1707
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1708
           "the relationship of conflicting lines to the base")
 
 
1711
class GraphCycleError(BzrError):
 
 
1713
    _fmt = "Cycle in graph %(graph)r"
 
 
1715
    def __init__(self, graph):
 
 
1716
        BzrError.__init__(self)
 
 
1720
class WritingCompleted(InternalBzrError):
 
 
1722
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1723
            "called upon it - accept bytes may not be called anymore.")
 
 
1725
    def __init__(self, request):
 
 
1726
        self.request = request
 
 
1729
class WritingNotComplete(InternalBzrError):
 
 
1731
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1732
            "called upon it - until the write phase is complete no "
 
 
1733
            "data may be read.")
 
 
1735
    def __init__(self, request):
 
 
1736
        self.request = request
 
 
1739
class NotConflicted(BzrError):
 
 
1741
    _fmt = "File %(filename)s is not conflicted."
 
 
1743
    def __init__(self, filename):
 
 
1744
        BzrError.__init__(self)
 
 
1745
        self.filename = filename
 
 
1748
class MediumNotConnected(InternalBzrError):
 
 
1750
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1752
    def __init__(self, medium):
 
 
1753
        self.medium = medium
 
 
1756
class MustUseDecorated(Exception):
 
 
1758
    _fmt = "A decorating function has requested its original command be used."
 
 
1761
class NoBundleFound(BzrError):
 
 
1763
    _fmt = 'No bundle was found in "%(filename)s".'
 
 
1765
    def __init__(self, filename):
 
 
1766
        BzrError.__init__(self)
 
 
1767
        self.filename = filename
 
 
1770
class BundleNotSupported(BzrError):
 
 
1772
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1774
    def __init__(self, version, msg):
 
 
1775
        BzrError.__init__(self)
 
 
1776
        self.version = version
 
 
1780
class MissingText(BzrError):
 
 
1782
    _fmt = ("Branch %(base)s is missing revision"
 
 
1783
            " %(text_revision)s of %(file_id)s")
 
 
1785
    def __init__(self, branch, text_revision, file_id):
 
 
1786
        BzrError.__init__(self)
 
 
1787
        self.branch = branch
 
 
1788
        self.base = branch.base
 
 
1789
        self.text_revision = text_revision
 
 
1790
        self.file_id = file_id
 
 
1793
class DuplicateFileId(BzrError):
 
 
1795
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1797
    def __init__(self, file_id, entry):
 
 
1798
        BzrError.__init__(self)
 
 
1799
        self.file_id = file_id
 
 
1803
class DuplicateKey(BzrError):
 
 
1805
    _fmt = "Key %(key)s is already present in map"
 
 
1808
class DuplicateHelpPrefix(BzrError):
 
 
1810
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
 
1812
    def __init__(self, prefix):
 
 
1813
        self.prefix = prefix
 
 
1816
class MalformedTransform(BzrError):
 
 
1818
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1821
class NoFinalPath(BzrError):
 
 
1823
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1824
            "file-id: %(file_id)r\n"
 
 
1825
            "root trans-id: %(root_trans_id)r\n")
 
 
1827
    def __init__(self, trans_id, transform):
 
 
1828
        self.trans_id = trans_id
 
 
1829
        self.file_id = transform.final_file_id(trans_id)
 
 
1830
        self.root_trans_id = transform.root
 
 
1833
class BzrBadParameter(InternalBzrError):
 
 
1835
    _fmt = "Bad parameter: %(param)r"
 
 
1837
    # This exception should never be thrown, but it is a base class for all
 
 
1838
    # parameter-to-function errors.
 
 
1840
    def __init__(self, param):
 
 
1841
        BzrError.__init__(self)
 
 
1845
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1847
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1850
class ReusingTransform(BzrError):
 
 
1852
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1855
class CantMoveRoot(BzrError):
 
 
1857
    _fmt = "Moving the root directory is not supported at this time"
 
 
1860
class BzrMoveFailedError(BzrError):
 
 
1862
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1864
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1865
        from bzrlib.osutils import splitpath
 
 
1866
        BzrError.__init__(self)
 
 
1868
            self.extra = ': ' + str(extra)
 
 
1872
        has_from = len(from_path) > 0
 
 
1873
        has_to = len(to_path) > 0
 
 
1875
            self.from_path = splitpath(from_path)[-1]
 
 
1880
            self.to_path = splitpath(to_path)[-1]
 
 
1885
        if has_from and has_to:
 
 
1886
            self.operator = " =>"
 
 
1888
            self.from_path = "from " + from_path
 
 
1890
            self.operator = "to"
 
 
1892
            self.operator = "file"
 
 
1895
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1897
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1899
    def __init__(self, from_path, to_path, extra=None):
 
 
1900
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1902
class BzrRemoveChangedFilesError(BzrError):
 
 
1903
    """Used when user is trying to remove changed files."""
 
 
1905
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
 
1906
        "%(changes_as_text)s"
 
 
1907
        "Use --keep to not delete them, or --force to delete them regardless.")
 
 
1909
    def __init__(self, tree_delta):
 
 
1910
        BzrError.__init__(self)
 
 
1911
        self.changes_as_text = tree_delta.get_changes_as_text()
 
 
1912
        #self.paths_as_string = '\n'.join(changed_files)
 
 
1913
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
 
1916
class BzrBadParameterNotString(BzrBadParameter):
 
 
1918
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1921
class BzrBadParameterMissing(BzrBadParameter):
 
 
1923
    _fmt = "Parameter $(param)s is required but not present."
 
 
1926
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1928
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1929
            " only byte-strings are permitted.")
 
 
1932
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1934
    _fmt = "Parameter %(param)s contains a newline."
 
 
1937
class DependencyNotPresent(BzrError):
 
 
1939
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1941
    def __init__(self, library, error):
 
 
1942
        BzrError.__init__(self, library=library, error=error)
 
 
1945
class ParamikoNotPresent(DependencyNotPresent):
 
 
1947
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1949
    def __init__(self, error):
 
 
1950
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
1953
class PointlessMerge(BzrError):
 
 
1955
    _fmt = "Nothing to merge."
 
 
1958
class UninitializableFormat(BzrError):
 
 
1960
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
1962
    def __init__(self, format):
 
 
1963
        BzrError.__init__(self)
 
 
1964
        self.format = format
 
 
1967
class BadConversionTarget(BzrError):
 
 
1969
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
1971
    def __init__(self, problem, format):
 
 
1972
        BzrError.__init__(self)
 
 
1973
        self.problem = problem
 
 
1974
        self.format = format
 
 
1977
class NoDiffFound(BzrError):
 
 
1979
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
 
1981
    def __init__(self, path):
 
 
1982
        BzrError.__init__(self, path)
 
 
1985
class ExecutableMissing(BzrError):
 
 
1987
    _fmt = "%(exe_name)s could not be found on this machine"
 
 
1989
    def __init__(self, exe_name):
 
 
1990
        BzrError.__init__(self, exe_name=exe_name)
 
 
1993
class NoDiff(BzrError):
 
 
1995
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
1997
    def __init__(self, msg):
 
 
1998
        BzrError.__init__(self, msg=msg)
 
 
2001
class NoDiff3(BzrError):
 
 
2003
    _fmt = "Diff3 is not installed on this machine."
 
 
2006
class ExistingContent(BzrError):
 
 
2007
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
 
2009
    _fmt = "The content being inserted is already present."
 
 
2012
class ExistingLimbo(BzrError):
 
 
2014
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2015
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2016
    keep, and delete it when you are done."""
 
 
2018
    def __init__(self, limbo_dir):
 
 
2019
       BzrError.__init__(self)
 
 
2020
       self.limbo_dir = limbo_dir
 
 
2023
class ExistingPendingDeletion(BzrError):
 
 
2025
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2026
    Please examine %(pending_deletion)s to see if it contains any files you
 
 
2027
    wish to keep, and delete it when you are done."""
 
 
2029
    def __init__(self, pending_deletion):
 
 
2030
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2033
class ImmortalLimbo(BzrError):
 
 
2035
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
 
2036
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2037
    keep, and delete it when you are done."""
 
 
2039
    def __init__(self, limbo_dir):
 
 
2040
       BzrError.__init__(self)
 
 
2041
       self.limbo_dir = limbo_dir
 
 
2044
class ImmortalPendingDeletion(BzrError):
 
 
2046
    _fmt = ("Unable to delete transform temporary directory "
 
 
2047
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
 
2048
    "contains any files you wish to keep, and delete it when you are done.")
 
 
2050
    def __init__(self, pending_deletion):
 
 
2051
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2054
class OutOfDateTree(BzrError):
 
 
2056
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
2058
    def __init__(self, tree):
 
 
2059
        BzrError.__init__(self)
 
 
2063
class PublicBranchOutOfDate(BzrError):
 
 
2065
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
2068
    def __init__(self, public_location, revstring):
 
 
2069
        import bzrlib.urlutils as urlutils
 
 
2070
        public_location = urlutils.unescape_for_display(public_location,
 
 
2072
        BzrError.__init__(self, public_location=public_location,
 
 
2073
                          revstring=revstring)
 
 
2076
class MergeModifiedFormatError(BzrError):
 
 
2078
    _fmt = "Error in merge modified format"
 
 
2081
class ConflictFormatError(BzrError):
 
 
2083
    _fmt = "Format error in conflict listings"
 
 
2086
class CorruptDirstate(BzrError):
 
 
2088
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
 
2089
            "Error: %(description)s")
 
 
2091
    def __init__(self, dirstate_path, description):
 
 
2092
        BzrError.__init__(self)
 
 
2093
        self.dirstate_path = dirstate_path
 
 
2094
        self.description = description
 
 
2097
class CorruptRepository(BzrError):
 
 
2099
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
2100
            "Please run bzr reconcile on this repository.")
 
 
2102
    def __init__(self, repo):
 
 
2103
        BzrError.__init__(self)
 
 
2104
        self.repo_path = repo.bzrdir.root_transport.base
 
 
2107
class InconsistentDelta(BzrError):
 
 
2108
    """Used when we get a delta that is not valid."""
 
 
2110
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
 
2111
            " %(file_id)r\nreason: %(reason)s")
 
 
2113
    def __init__(self, path, file_id, reason):
 
 
2114
        BzrError.__init__(self)
 
 
2116
        self.file_id = file_id
 
 
2117
        self.reason = reason
 
 
2120
class UpgradeRequired(BzrError):
 
 
2122
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
2124
    def __init__(self, path):
 
 
2125
        BzrError.__init__(self)
 
 
2129
class RepositoryUpgradeRequired(UpgradeRequired):
 
 
2131
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
 
2134
class LocalRequiresBoundBranch(BzrError):
 
 
2136
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
2139
class MissingProgressBarFinish(BzrError):
 
 
2141
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
2144
class InvalidProgressBarType(BzrError):
 
 
2146
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
2147
            " is not a supported type Select one of: %(valid_types)s")
 
 
2149
    def __init__(self, bar_type, valid_types):
 
 
2150
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
2153
class UnsupportedOperation(BzrError):
 
 
2155
    _fmt = ("The method %(mname)s is not supported on"
 
 
2156
            " objects of type %(tname)s.")
 
 
2158
    def __init__(self, method, method_self):
 
 
2159
        self.method = method
 
 
2160
        self.mname = method.__name__
 
 
2161
        self.tname = type(method_self).__name__
 
 
2164
class CannotSetRevisionId(UnsupportedOperation):
 
 
2165
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
2168
class NonAsciiRevisionId(UnsupportedOperation):
 
 
2169
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
2174
class BinaryFile(BzrError):
 
 
2176
    _fmt = "File is binary but should be text."
 
 
2179
class IllegalPath(BzrError):
 
 
2181
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
2183
    def __init__(self, path):
 
 
2184
        BzrError.__init__(self)
 
 
2188
class TestamentMismatch(BzrError):
 
 
2190
    _fmt = """Testament did not match expected value.
 
 
2191
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
2194
    def __init__(self, revision_id, expected, measured):
 
 
2195
        self.revision_id = revision_id
 
 
2196
        self.expected = expected
 
 
2197
        self.measured = measured
 
 
2200
class NotABundle(BzrError):
 
 
2202
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
2204
    def __init__(self, text):
 
 
2205
        BzrError.__init__(self)
 
 
2209
class BadBundle(BzrError): 
 
 
2211
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
2213
    def __init__(self, text):
 
 
2214
        BzrError.__init__(self)
 
 
2218
class MalformedHeader(BadBundle): 
 
 
2220
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
2223
class MalformedPatches(BadBundle): 
 
 
2225
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
2228
class MalformedFooter(BadBundle): 
 
 
2230
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
2233
class UnsupportedEOLMarker(BadBundle):
 
 
2235
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
2238
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
2239
        # but for this there is not
 
 
2240
        BzrError.__init__(self)
 
 
2243
class IncompatibleBundleFormat(BzrError):
 
 
2245
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
2247
    def __init__(self, bundle_format, other):
 
 
2248
        BzrError.__init__(self)
 
 
2249
        self.bundle_format = bundle_format
 
 
2253
class BadInventoryFormat(BzrError):
 
 
2255
    _fmt = "Root class for inventory serialization errors"
 
 
2258
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
2260
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
2262
    def __init__(self, msg):
 
 
2263
        BadInventoryFormat.__init__(self, msg=msg)
 
 
2266
class RootNotRich(BzrError):
 
 
2268
    _fmt = """This operation requires rich root data storage"""
 
 
2271
class NoSmartMedium(InternalBzrError):
 
 
2273
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
2275
    def __init__(self, transport):
 
 
2276
        self.transport = transport
 
 
2279
class NoSmartServer(NotBranchError):
 
 
2281
    _fmt = "No smart server available at %(url)s"
 
 
2283
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
 
2284
    def __init__(self, url):
 
 
2288
class UnknownSSH(BzrError):
 
 
2290
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
2292
    def __init__(self, vendor):
 
 
2293
        BzrError.__init__(self)
 
 
2294
        self.vendor = vendor
 
 
2297
class SSHVendorNotFound(BzrError):
 
 
2299
    _fmt = ("Don't know how to handle SSH connections."
 
 
2300
            " Please set BZR_SSH environment variable.")
 
 
2303
class GhostRevisionsHaveNoRevno(BzrError):
 
 
2304
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
 
2306
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
 
2307
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
 
2309
    def __init__(self, revision_id, ghost_revision_id):
 
 
2310
        self.revision_id = revision_id
 
 
2311
        self.ghost_revision_id = ghost_revision_id
 
 
2314
class GhostRevisionUnusableHere(BzrError):
 
 
2316
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
2318
    def __init__(self, revision_id):
 
 
2319
        BzrError.__init__(self)
 
 
2320
        self.revision_id = revision_id
 
 
2323
class IllegalUseOfScopeReplacer(InternalBzrError):
 
 
2325
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
2326
            " %(msg)s%(extra)s")
 
 
2328
    def __init__(self, name, msg, extra=None):
 
 
2329
        BzrError.__init__(self)
 
 
2333
            self.extra = ': ' + str(extra)
 
 
2338
class InvalidImportLine(InternalBzrError):
 
 
2340
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
2342
    def __init__(self, text, msg):
 
 
2343
        BzrError.__init__(self)
 
 
2348
class ImportNameCollision(InternalBzrError):
 
 
2350
    _fmt = ("Tried to import an object to the same name as"
 
 
2351
            " an existing object. %(name)s")
 
 
2353
    def __init__(self, name):
 
 
2354
        BzrError.__init__(self)
 
 
2358
class NotAMergeDirective(BzrError):
 
 
2359
    """File starting with %(firstline)r is not a merge directive"""
 
 
2360
    def __init__(self, firstline):
 
 
2361
        BzrError.__init__(self, firstline=firstline)
 
 
2364
class NoMergeSource(BzrError):
 
 
2365
    """Raise if no merge source was specified for a merge directive"""
 
 
2367
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
2371
class IllegalMergeDirectivePayload(BzrError):
 
 
2372
    """A merge directive contained something other than a patch or bundle"""
 
 
2374
    _fmt = "Bad merge directive payload %(start)r"
 
 
2376
    def __init__(self, start):
 
 
2381
class PatchVerificationFailed(BzrError):
 
 
2382
    """A patch from a merge directive could not be verified"""
 
 
2384
    _fmt = "Preview patch does not match requested changes."
 
 
2387
class PatchMissing(BzrError):
 
 
2388
    """Raise a patch type was specified but no patch supplied"""
 
 
2390
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
 
2392
    def __init__(self, patch_type):
 
 
2393
        BzrError.__init__(self)
 
 
2394
        self.patch_type = patch_type
 
 
2397
class TargetNotBranch(BzrError):
 
 
2398
    """A merge directive's target branch is required, but isn't a branch"""
 
 
2400
    _fmt = ("Your branch does not have all of the revisions required in "
 
 
2401
            "order to merge this merge directive and the target "
 
 
2402
            "location specified in the merge directive is not a branch: "
 
 
2405
    def __init__(self, location):
 
 
2406
        BzrError.__init__(self)
 
 
2407
        self.location = location
 
 
2410
class UnsupportedInventoryKind(BzrError):
 
 
2412
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
2414
    def __init__(self, kind):
 
 
2418
class BadSubsumeSource(BzrError):
 
 
2420
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
 
2422
    def __init__(self, tree, other_tree, reason):
 
 
2424
        self.other_tree = other_tree
 
 
2425
        self.reason = reason
 
 
2428
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
2430
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
2432
    def __init__(self, other_tree):
 
 
2433
        self.other_tree = other_tree
 
 
2436
class BadReferenceTarget(InternalBzrError):
 
 
2438
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
 
2441
    def __init__(self, tree, other_tree, reason):
 
 
2443
        self.other_tree = other_tree
 
 
2444
        self.reason = reason
 
 
2447
class NoSuchTag(BzrError):
 
 
2449
    _fmt = "No such tag: %(tag_name)s"
 
 
2451
    def __init__(self, tag_name):
 
 
2452
        self.tag_name = tag_name
 
 
2455
class TagsNotSupported(BzrError):
 
 
2457
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2458
            " you may be able to use bzr upgrade.")
 
 
2460
    def __init__(self, branch):
 
 
2461
        self.branch = branch
 
 
2464
class TagAlreadyExists(BzrError):
 
 
2466
    _fmt = "Tag %(tag_name)s already exists."
 
 
2468
    def __init__(self, tag_name):
 
 
2469
        self.tag_name = tag_name
 
 
2472
class MalformedBugIdentifier(BzrError):
 
 
2474
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
 
2476
    def __init__(self, bug_id, reason):
 
 
2477
        self.bug_id = bug_id
 
 
2478
        self.reason = reason
 
 
2481
class InvalidBugTrackerURL(BzrError):
 
 
2483
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
 
2484
            "contain {id}: %(url)s")
 
 
2486
    def __init__(self, abbreviation, url):
 
 
2487
        self.abbreviation = abbreviation
 
 
2491
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2493
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2496
    def __init__(self, abbreviation, branch):
 
 
2497
        self.abbreviation = abbreviation
 
 
2498
        self.branch = branch
 
 
2501
class UnexpectedSmartServerResponse(BzrError):
 
 
2503
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2505
    def __init__(self, response_tuple):
 
 
2506
        self.response_tuple = response_tuple
 
 
2509
class ErrorFromSmartServer(BzrError):
 
 
2510
    """An error was received from a smart server.
 
 
2512
    :seealso: UnknownErrorFromSmartServer
 
 
2515
    _fmt = "Error received from smart server: %(error_tuple)r"
 
 
2517
    internal_error = True
 
 
2519
    def __init__(self, error_tuple):
 
 
2520
        self.error_tuple = error_tuple
 
 
2522
            self.error_verb = error_tuple[0]
 
 
2524
            self.error_verb = None
 
 
2525
        self.error_args = error_tuple[1:]
 
 
2528
class UnknownErrorFromSmartServer(BzrError):
 
 
2529
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
 
2532
    This is distinct from ErrorFromSmartServer so that it is possible to
 
 
2533
    distinguish between the following two cases:
 
 
2534
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
 
2535
        and so should provoke a traceback to the user.
 
 
2536
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
 
2537
        translated.  This is probably because the server sent us garbage, and
 
 
2538
        should not provoke a traceback.
 
 
2541
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
 
2543
    internal_error = False
 
 
2545
    def __init__(self, error_from_smart_server):
 
 
2548
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
 
2550
        self.error_from_smart_server = error_from_smart_server
 
 
2551
        self.error_tuple = error_from_smart_server.error_tuple
 
 
2554
class ContainerError(BzrError):
 
 
2555
    """Base class of container errors."""
 
 
2558
class UnknownContainerFormatError(ContainerError):
 
 
2560
    _fmt = "Unrecognised container format: %(container_format)r"
 
 
2562
    def __init__(self, container_format):
 
 
2563
        self.container_format = container_format
 
 
2566
class UnexpectedEndOfContainerError(ContainerError):
 
 
2568
    _fmt = "Unexpected end of container stream"
 
 
2571
class UnknownRecordTypeError(ContainerError):
 
 
2573
    _fmt = "Unknown record type: %(record_type)r"
 
 
2575
    def __init__(self, record_type):
 
 
2576
        self.record_type = record_type
 
 
2579
class InvalidRecordError(ContainerError):
 
 
2581
    _fmt = "Invalid record: %(reason)s"
 
 
2583
    def __init__(self, reason):
 
 
2584
        self.reason = reason
 
 
2587
class ContainerHasExcessDataError(ContainerError):
 
 
2589
    _fmt = "Container has data after end marker: %(excess)r"
 
 
2591
    def __init__(self, excess):
 
 
2592
        self.excess = excess
 
 
2595
class DuplicateRecordNameError(ContainerError):
 
 
2597
    _fmt = "Container has multiple records with the same name: %(name)s"
 
 
2599
    def __init__(self, name):
 
 
2603
class NoDestinationAddress(InternalBzrError):
 
 
2605
    _fmt = "Message does not have a destination address."
 
 
2608
class RepositoryDataStreamError(BzrError):
 
 
2610
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
 
2612
    def __init__(self, reason):
 
 
2613
        self.reason = reason
 
 
2616
class SMTPError(BzrError):
 
 
2618
    _fmt = "SMTP error: %(error)s"
 
 
2620
    def __init__(self, error):
 
 
2624
class NoMessageSupplied(BzrError):
 
 
2626
    _fmt = "No message supplied."
 
 
2629
class NoMailAddressSpecified(BzrError):
 
 
2631
    _fmt = "No mail-to address specified."
 
 
2634
class UnknownMailClient(BzrError):
 
 
2636
    _fmt = "Unknown mail client: %(mail_client)s"
 
 
2638
    def __init__(self, mail_client):
 
 
2639
        BzrError.__init__(self, mail_client=mail_client)
 
 
2642
class MailClientNotFound(BzrError):
 
 
2644
    _fmt = "Unable to find mail client with the following names:"\
 
 
2645
        " %(mail_command_list_string)s"
 
 
2647
    def __init__(self, mail_command_list):
 
 
2648
        mail_command_list_string = ', '.join(mail_command_list)
 
 
2649
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
 
2650
                          mail_command_list_string=mail_command_list_string)
 
 
2652
class SMTPConnectionRefused(SMTPError):
 
 
2654
    _fmt = "SMTP connection to %(host)s refused"
 
 
2656
    def __init__(self, error, host):
 
 
2661
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
 
2663
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
 
2666
class BzrDirError(BzrError):
 
 
2668
    def __init__(self, bzrdir):
 
 
2669
        import bzrlib.urlutils as urlutils
 
 
2670
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
 
2672
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
 
2675
class UnsyncedBranches(BzrDirError):
 
 
2677
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
 
2678
            " bzr help sync-for-reconfigure.")
 
 
2680
    def __init__(self, bzrdir, target_branch):
 
 
2681
        BzrDirError.__init__(self, bzrdir)
 
 
2682
        import bzrlib.urlutils as urlutils
 
 
2683
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
 
2687
class AlreadyBranch(BzrDirError):
 
 
2689
    _fmt = "'%(display_url)s' is already a branch."
 
 
2692
class AlreadyTree(BzrDirError):
 
 
2694
    _fmt = "'%(display_url)s' is already a tree."
 
 
2697
class AlreadyCheckout(BzrDirError):
 
 
2699
    _fmt = "'%(display_url)s' is already a checkout."
 
 
2702
class AlreadyLightweightCheckout(BzrDirError):
 
 
2704
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
 
2707
class AlreadyUsingShared(BzrDirError):
 
 
2709
    _fmt = "'%(display_url)s' is already using a shared repository."
 
 
2712
class AlreadyStandalone(BzrDirError):
 
 
2714
    _fmt = "'%(display_url)s' is already standalone."
 
 
2717
class ReconfigurationNotSupported(BzrDirError):
 
 
2719
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
 
2722
class NoBindLocation(BzrDirError):
 
 
2724
    _fmt = "No location could be found to bind to at %(display_url)s."
 
 
2727
class UncommittedChanges(BzrError):
 
 
2729
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
 
2731
    def __init__(self, tree):
 
 
2732
        import bzrlib.urlutils as urlutils
 
 
2733
        display_url = urlutils.unescape_for_display(
 
 
2734
            tree.bzrdir.root_transport.base, 'ascii')
 
 
2735
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
 
2738
class MissingTemplateVariable(BzrError):
 
 
2740
    _fmt = 'Variable {%(name)s} is not available.'
 
 
2742
    def __init__(self, name):
 
 
2746
class NoTemplate(BzrError):
 
 
2748
    _fmt = 'No template specified.'
 
 
2751
class UnableCreateSymlink(BzrError):
 
 
2753
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
 
2755
    def __init__(self, path=None):
 
 
2759
                path_str = repr(str(path))
 
 
2760
            except UnicodeEncodeError:
 
 
2761
                path_str = repr(path)
 
 
2763
        self.path_str = path_str
 
 
2766
class UnsupportedTimezoneFormat(BzrError):
 
 
2768
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
 
2769
            'options are "utc", "original", "local".')
 
 
2771
    def __init__(self, timezone):
 
 
2772
        self.timezone = timezone
 
 
2775
class CommandAvailableInPlugin(StandardError):
 
 
2777
    internal_error = False
 
 
2779
    def __init__(self, cmd_name, plugin_metadata, provider):
 
 
2781
        self.plugin_metadata = plugin_metadata
 
 
2782
        self.cmd_name = cmd_name
 
 
2783
        self.provider = provider
 
 
2787
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
 
2788
                'However, the following official plugin provides this command: %s\n'
 
 
2789
                'You can install it by going to: %s'
 
 
2790
                % (self.cmd_name, self.plugin_metadata['name'], 
 
 
2791
                    self.plugin_metadata['url']))
 
 
2796
class NoPluginAvailable(BzrError):
 
 
2800
class NotATerminal(BzrError):
 
 
2802
    _fmt = 'Unable to ask for a password without real terminal.'
 
 
2805
class UnableEncodePath(BzrError):
 
 
2807
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
 
2808
            'user encoding %(user_encoding)s')
 
 
2810
    def __init__(self, path, kind):
 
 
2811
        from bzrlib.osutils import get_user_encoding
 
 
2814
        self.user_encoding = osutils.get_user_encoding()
 
 
2817
class NoSuchAlias(BzrError):
 
 
2819
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
 
2821
    def __init__(self, alias_name):
 
 
2822
        BzrError.__init__(self, alias_name=alias_name)
 
 
2825
class DirectoryLookupFailure(BzrError):
 
 
2826
    """Base type for lookup errors."""
 
 
2831
class InvalidLocationAlias(DirectoryLookupFailure):
 
 
2833
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
 
2835
    def __init__(self, alias_name):
 
 
2836
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
 
2839
class UnsetLocationAlias(DirectoryLookupFailure):
 
 
2841
    _fmt = 'No %(alias_name)s location assigned.'
 
 
2843
    def __init__(self, alias_name):
 
 
2844
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
 
2847
class CannotBindAddress(BzrError):
 
 
2849
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
 
2851
    def __init__(self, host, port, orig_error):
 
 
2852
        BzrError.__init__(self, host=host, port=port,
 
 
2853
            orig_error=orig_error[1])
 
 
2856
class UnknownRules(BzrError):
 
 
2858
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
 
2860
    def __init__(self, unknowns):
 
 
2861
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
 
2864
class HookFailed(BzrError):
 
 
2865
    """Raised when a pre_change_branch_tip hook function fails anything other
 
 
2866
    than TipChangeRejected.
 
 
2869
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
 
2870
            "%(traceback_text)s%(exc_value)s")
 
 
2872
    def __init__(self, hook_stage, hook_name, exc_info):
 
 
2874
        self.hook_stage = hook_stage
 
 
2875
        self.hook_name = hook_name
 
 
2876
        self.exc_info = exc_info
 
 
2877
        self.exc_type = exc_info[0]
 
 
2878
        self.exc_value = exc_info[1]
 
 
2879
        self.exc_tb = exc_info[2]
 
 
2880
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
 
2883
class TipChangeRejected(BzrError):
 
 
2884
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
 
2885
    explicitly abort a change to a branch tip.
 
 
2888
    _fmt = u"Tip change rejected: %(msg)s"
 
 
2890
    def __init__(self, msg):