1
 
# Copyright (C) 2005-2010 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 
"""Exceptions for bzr, and reporting of them.
 
24
 
from bzrlib.patches import (
 
33
 
# TODO: is there any value in providing the .args field used by standard
 
34
 
# python exceptions?   A list of values with no names seems less useful
 
37
 
# TODO: Perhaps convert the exception to a string at the moment it's
 
38
 
# constructed to make sure it will succeed.  But that says nothing about
 
39
 
# exceptions that are never raised.
 
41
 
# TODO: selftest assertRaises should probably also check that every error
 
42
 
# raised can be formatted as a string successfully, and without giving
 
46
 
# return codes from the bzr program
 
49
 
EXIT_INTERNAL_ERROR = 4
 
52
 
class BzrError(StandardError):
 
54
 
    Base class for errors raised by bzrlib.
 
56
 
    :cvar internal_error: if True this was probably caused by a bzr bug and
 
57
 
    should be displayed with a traceback; if False (or absent) this was
 
58
 
    probably a user or environment error and they don't need the gory details.
 
59
 
    (That can be overridden by -Derror on the command line.)
 
61
 
    :cvar _fmt: Format string to display the error; this is expanded
 
62
 
    by the instance's dict.
 
65
 
    internal_error = False
 
67
 
    def __init__(self, msg=None, **kwds):
 
68
 
        """Construct a new BzrError.
 
70
 
        There are two alternative forms for constructing these objects.
 
71
 
        Either a preformatted string may be passed, or a set of named
 
72
 
        arguments can be given.  The first is for generic "user" errors which
 
73
 
        are not intended to be caught and so do not need a specific subclass.
 
74
 
        The second case is for use with subclasses that provide a _fmt format
 
75
 
        string to print the arguments.
 
77
 
        Keyword arguments are taken as parameters to the error, which can
 
78
 
        be inserted into the format string template.  It's recommended
 
79
 
        that subclasses override the __init__ method to require specific
 
82
 
        :param msg: If given, this is the literal complete text for the error,
 
83
 
           not subject to expansion. 'msg' is used instead of 'message' because
 
84
 
           python evolved and, in 2.6, forbids the use of 'message'.
 
86
 
        StandardError.__init__(self)
 
88
 
            # I was going to deprecate this, but it actually turns out to be
 
89
 
            # quite handy - mbp 20061103.
 
90
 
            self._preformatted_string = msg
 
92
 
            self._preformatted_string = None
 
93
 
            for key, value in kwds.items():
 
94
 
                setattr(self, key, value)
 
97
 
        s = getattr(self, '_preformatted_string', None)
 
99
 
            # contains a preformatted message
 
102
 
            fmt = self._get_format_string()
 
104
 
                d = dict(self.__dict__)
 
106
 
                # __str__() should always return a 'str' object
 
107
 
                # never a 'unicode' object.
 
109
 
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
110
 
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
111
 
                % (self.__class__.__name__,
 
113
 
                   getattr(self, '_fmt', None),
 
116
 
    def __unicode__(self):
 
118
 
        if isinstance(u, str):
 
119
 
            # Try decoding the str using the default encoding.
 
121
 
        elif not isinstance(u, unicode):
 
122
 
            # Try to make a unicode object from it, because __unicode__ must
 
123
 
            # return a unicode object.
 
129
 
        if isinstance(s, unicode):
 
132
 
            # __str__ must return a str.
 
137
 
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
139
 
    def _get_format_string(self):
 
140
 
        """Return format string for this exception or None"""
 
141
 
        fmt = getattr(self, '_fmt', None)
 
144
 
        fmt = getattr(self, '__doc__', None)
 
146
 
            symbol_versioning.warn("%s uses its docstring as a format, "
 
147
 
                    "it should use _fmt instead" % self.__class__.__name__,
 
150
 
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
151
 
            % (self.__class__.__name__,
 
153
 
               getattr(self, '_fmt', None),
 
156
 
    def __eq__(self, other):
 
157
 
        if self.__class__ is not other.__class__:
 
158
 
            return NotImplemented
 
159
 
        return self.__dict__ == other.__dict__
 
162
 
class InternalBzrError(BzrError):
 
163
 
    """Base class for errors that are internal in nature.
 
165
 
    This is a convenience class for errors that are internal. The
 
166
 
    internal_error attribute can still be altered in subclasses, if needed.
 
167
 
    Using this class is simply an easy way to get internal errors.
 
170
 
    internal_error = True
 
173
 
class BzrNewError(BzrError):
 
174
 
    """Deprecated error base class."""
 
175
 
    # base classes should override the docstring with their human-
 
176
 
    # readable explanation
 
178
 
    def __init__(self, *args, **kwds):
 
179
 
        # XXX: Use the underlying BzrError to always generate the args
 
180
 
        # attribute if it doesn't exist.  We can't use super here, because
 
181
 
        # exceptions are old-style classes in python2.4 (but new in 2.5).
 
183
 
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
184
 
             'please convert %s to use BzrError instead'
 
185
 
             % self.__class__.__name__,
 
188
 
        BzrError.__init__(self, *args)
 
189
 
        for key, value in kwds.items():
 
190
 
            setattr(self, key, value)
 
194
 
            # __str__() should always return a 'str' object
 
195
 
            # never a 'unicode' object.
 
196
 
            s = self.__doc__ % self.__dict__
 
197
 
            if isinstance(s, unicode):
 
198
 
                return s.encode('utf8')
 
200
 
        except (TypeError, NameError, ValueError, KeyError), e:
 
201
 
            return 'Unprintable exception %s(%r): %r' \
 
202
 
                % (self.__class__.__name__,
 
206
 
class AlreadyBuilding(BzrError):
 
208
 
    _fmt = "The tree builder is already building a tree."
 
211
 
class BranchError(BzrError):
 
212
 
    """Base class for concrete 'errors about a branch'."""
 
214
 
    def __init__(self, branch):
 
215
 
        BzrError.__init__(self, branch=branch)
 
218
 
class BzrCheckError(InternalBzrError):
 
220
 
    _fmt = "Internal check failed: %(msg)s"
 
222
 
    def __init__(self, msg):
 
223
 
        BzrError.__init__(self)
 
227
 
class DirstateCorrupt(BzrError):
 
229
 
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
231
 
    def __init__(self, state, msg):
 
232
 
        BzrError.__init__(self)
 
237
 
class DisabledMethod(InternalBzrError):
 
239
 
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
241
 
    def __init__(self, class_name):
 
242
 
        BzrError.__init__(self)
 
243
 
        self.class_name = class_name
 
246
 
class IncompatibleAPI(BzrError):
 
248
 
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
249
 
        'It supports versions "%(minimum)s" to "%(current)s".'
 
251
 
    def __init__(self, api, wanted, minimum, current):
 
254
 
        self.minimum = minimum
 
255
 
        self.current = current
 
258
 
class InProcessTransport(BzrError):
 
260
 
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
263
 
    def __init__(self, transport):
 
264
 
        self.transport = transport
 
267
 
class InvalidEntryName(InternalBzrError):
 
269
 
    _fmt = "Invalid entry name: %(name)s"
 
271
 
    def __init__(self, name):
 
272
 
        BzrError.__init__(self)
 
276
 
class InvalidRevisionNumber(BzrError):
 
278
 
    _fmt = "Invalid revision number %(revno)s"
 
280
 
    def __init__(self, revno):
 
281
 
        BzrError.__init__(self)
 
285
 
class InvalidRevisionId(BzrError):
 
287
 
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
289
 
    def __init__(self, revision_id, branch):
 
290
 
        # branch can be any string or object with __str__ defined
 
291
 
        BzrError.__init__(self)
 
292
 
        self.revision_id = revision_id
 
296
 
class ReservedId(BzrError):
 
298
 
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
300
 
    def __init__(self, revision_id):
 
301
 
        self.revision_id = revision_id
 
304
 
class RootMissing(InternalBzrError):
 
306
 
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
307
 
        "record_entry_contents.")
 
310
 
class NoPublicBranch(BzrError):
 
312
 
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
314
 
    def __init__(self, branch):
 
315
 
        import bzrlib.urlutils as urlutils
 
316
 
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
317
 
        BzrError.__init__(self, branch_url=public_location)
 
320
 
class NoHelpTopic(BzrError):
 
322
 
    _fmt = ("No help could be found for '%(topic)s'. "
 
323
 
        "Please use 'bzr help topics' to obtain a list of topics.")
 
325
 
    def __init__(self, topic):
 
329
 
class NoSuchId(BzrError):
 
331
 
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
 
333
 
    def __init__(self, tree, file_id):
 
334
 
        BzrError.__init__(self)
 
335
 
        self.file_id = file_id
 
339
 
class NoSuchIdInRepository(NoSuchId):
 
341
 
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
344
 
    def __init__(self, repository, file_id):
 
345
 
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
348
 
class NotStacked(BranchError):
 
350
 
    _fmt = "The branch '%(branch)s' is not stacked."
 
353
 
class InventoryModified(InternalBzrError):
 
355
 
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
356
 
            " so a clean inventory cannot be read without data loss.")
 
358
 
    def __init__(self, tree):
 
362
 
class NoWorkingTree(BzrError):
 
364
 
    _fmt = 'No WorkingTree exists for "%(base)s".'
 
366
 
    def __init__(self, base):
 
367
 
        BzrError.__init__(self)
 
371
 
class NotBuilding(BzrError):
 
373
 
    _fmt = "Not currently building a tree."
 
376
 
class NotLocalUrl(BzrError):
 
378
 
    _fmt = "%(url)s is not a local path."
 
380
 
    def __init__(self, url):
 
384
 
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
386
 
    _fmt = 'Working tree already populated in "%(base)s"'
 
388
 
    def __init__(self, base):
 
392
 
class BzrCommandError(BzrError):
 
393
 
    """Error from user command"""
 
395
 
    # Error from malformed user command; please avoid raising this as a
 
396
 
    # generic exception not caused by user input.
 
398
 
    # I think it's a waste of effort to differentiate between errors that
 
399
 
    # are not intended to be caught anyway.  UI code need not subclass
 
400
 
    # BzrCommandError, and non-UI code should not throw a subclass of
 
401
 
    # BzrCommandError.  ADHB 20051211
 
404
 
class NotWriteLocked(BzrError):
 
406
 
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
408
 
    def __init__(self, not_locked):
 
409
 
        self.not_locked = not_locked
 
412
 
class BzrOptionError(BzrCommandError):
 
414
 
    _fmt = "Error in command line options"
 
417
 
class BadIndexFormatSignature(BzrError):
 
419
 
    _fmt = "%(value)s is not an index of type %(_type)s."
 
421
 
    def __init__(self, value, _type):
 
422
 
        BzrError.__init__(self)
 
427
 
class BadIndexData(BzrError):
 
429
 
    _fmt = "Error in data for index %(value)s."
 
431
 
    def __init__(self, value):
 
432
 
        BzrError.__init__(self)
 
436
 
class BadIndexDuplicateKey(BzrError):
 
438
 
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
440
 
    def __init__(self, key, index):
 
441
 
        BzrError.__init__(self)
 
446
 
class BadIndexKey(BzrError):
 
448
 
    _fmt = "The key '%(key)s' is not a valid key."
 
450
 
    def __init__(self, key):
 
451
 
        BzrError.__init__(self)
 
455
 
class BadIndexOptions(BzrError):
 
457
 
    _fmt = "Could not parse options for index %(value)s."
 
459
 
    def __init__(self, value):
 
460
 
        BzrError.__init__(self)
 
464
 
class BadIndexValue(BzrError):
 
466
 
    _fmt = "The value '%(value)s' is not a valid value."
 
468
 
    def __init__(self, value):
 
469
 
        BzrError.__init__(self)
 
473
 
class BadOptionValue(BzrError):
 
475
 
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
477
 
    def __init__(self, name, value):
 
478
 
        BzrError.__init__(self, name=name, value=value)
 
481
 
class StrictCommitFailed(BzrError):
 
483
 
    _fmt = "Commit refused because there are unknown files in the tree"
 
486
 
# XXX: Should be unified with TransportError; they seem to represent the
 
488
 
# RBC 20060929: I think that unifiying with TransportError would be a mistake
 
489
 
# - this is finer than a TransportError - and more useful as such. It
 
490
 
# differentiates between 'transport has failed' and 'operation on a transport
 
492
 
class PathError(BzrError):
 
494
 
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
496
 
    def __init__(self, path, extra=None):
 
497
 
        BzrError.__init__(self)
 
500
 
            self.extra = ': ' + str(extra)
 
505
 
class NoSuchFile(PathError):
 
507
 
    _fmt = "No such file: %(path)r%(extra)s"
 
510
 
class FileExists(PathError):
 
512
 
    _fmt = "File exists: %(path)r%(extra)s"
 
515
 
class RenameFailedFilesExist(BzrError):
 
516
 
    """Used when renaming and both source and dest exist."""
 
518
 
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
519
 
            " (Use --after to tell bzr about a rename that has already"
 
520
 
            " happened)%(extra)s")
 
522
 
    def __init__(self, source, dest, extra=None):
 
523
 
        BzrError.__init__(self)
 
524
 
        self.source = str(source)
 
525
 
        self.dest = str(dest)
 
527
 
            self.extra = ' ' + str(extra)
 
532
 
class NotADirectory(PathError):
 
534
 
    _fmt = '"%(path)s" is not a directory %(extra)s'
 
537
 
class NotInWorkingDirectory(PathError):
 
539
 
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
 
542
 
class DirectoryNotEmpty(PathError):
 
544
 
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
547
 
class HardLinkNotSupported(PathError):
 
549
 
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
552
 
class ReadingCompleted(InternalBzrError):
 
554
 
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
555
 
            "called upon it - the request has been completed and no more "
 
558
 
    def __init__(self, request):
 
559
 
        self.request = request
 
562
 
class ResourceBusy(PathError):
 
564
 
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
 
567
 
class PermissionDenied(PathError):
 
569
 
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
572
 
class InvalidURL(PathError):
 
574
 
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
577
 
class InvalidURLJoin(PathError):
 
579
 
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
581
 
    def __init__(self, reason, base, join_args):
 
584
 
        self.join_args = join_args
 
585
 
        PathError.__init__(self, base, reason)
 
588
 
class InvalidRebaseURLs(PathError):
 
590
 
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
592
 
    def __init__(self, from_, to):
 
595
 
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
598
 
class UnavailableRepresentation(InternalBzrError):
 
600
 
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
601
 
        "is encoded as '%(native)s'.")
 
603
 
    def __init__(self, key, wanted, native):
 
604
 
        InternalBzrError.__init__(self)
 
610
 
class UnknownHook(BzrError):
 
612
 
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
614
 
    def __init__(self, hook_type, hook_name):
 
615
 
        BzrError.__init__(self)
 
616
 
        self.type = hook_type
 
617
 
        self.hook = hook_name
 
620
 
class UnsupportedProtocol(PathError):
 
622
 
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
624
 
    def __init__(self, url, extra):
 
625
 
        PathError.__init__(self, url, extra=extra)
 
628
 
class UnstackableBranchFormat(BzrError):
 
630
 
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
631
 
        "You will need to upgrade the branch to permit branch stacking.")
 
633
 
    def __init__(self, format, url):
 
634
 
        BzrError.__init__(self)
 
639
 
class UnstackableLocationError(BzrError):
 
641
 
    _fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
 
643
 
    def __init__(self, branch_url, target_url):
 
644
 
        BzrError.__init__(self)
 
645
 
        self.branch_url = branch_url
 
646
 
        self.target_url = target_url
 
649
 
class UnstackableRepositoryFormat(BzrError):
 
651
 
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
652
 
        "You will need to upgrade the repository to permit branch stacking.")
 
654
 
    def __init__(self, format, url):
 
655
 
        BzrError.__init__(self)
 
660
 
class ReadError(PathError):
 
662
 
    _fmt = """Error reading from %(path)r."""
 
665
 
class ShortReadvError(PathError):
 
667
 
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
668
 
            ' at %(offset)s for "%(path)s"%(extra)s')
 
670
 
    internal_error = True
 
672
 
    def __init__(self, path, offset, length, actual, extra=None):
 
673
 
        PathError.__init__(self, path, extra=extra)
 
679
 
class PathNotChild(PathError):
 
681
 
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
683
 
    internal_error = True
 
685
 
    def __init__(self, path, base, extra=None):
 
686
 
        BzrError.__init__(self)
 
690
 
            self.extra = ': ' + str(extra)
 
695
 
class InvalidNormalization(PathError):
 
697
 
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
700
 
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
701
 
# the exception object is a bit undesirable.
 
702
 
# TODO: Probably this behavior of should be a common superclass
 
703
 
class NotBranchError(PathError):
 
705
 
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
 
707
 
    def __init__(self, path, detail=None, bzrdir=None):
 
708
 
       import bzrlib.urlutils as urlutils
 
709
 
       path = urlutils.unescape_for_display(path, 'ascii')
 
710
 
       if detail is not None:
 
711
 
           detail = ': ' + detail
 
714
 
       PathError.__init__(self, path=path)
 
717
 
        # XXX: Ideally self.detail would be a property, but Exceptions in
 
718
 
        # Python 2.4 have to be old-style classes so properties don't work.
 
719
 
        # Instead we override _format.
 
720
 
        if self.detail is None:
 
721
 
            if self.bzrdir is not None:
 
723
 
                    self.bzrdir.open_repository()
 
724
 
                except NoRepositoryPresent:
 
727
 
                    self.detail = ': location is a repository'
 
730
 
        return PathError._format(self)
 
733
 
class NoSubmitBranch(PathError):
 
735
 
    _fmt = 'No submit branch available for branch "%(path)s"'
 
737
 
    def __init__(self, branch):
 
738
 
       import bzrlib.urlutils as urlutils
 
739
 
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
742
 
class AlreadyBranchError(PathError):
 
744
 
    _fmt = 'Already a branch: "%(path)s".'
 
747
 
class BranchExistsWithoutWorkingTree(PathError):
 
749
 
    _fmt = 'Directory contains a branch, but no working tree \
 
750
 
(use bzr checkout if you wish to build a working tree): "%(path)s"'
 
753
 
class AtomicFileAlreadyClosed(PathError):
 
755
 
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
758
 
    def __init__(self, path, function):
 
759
 
        PathError.__init__(self, path=path, extra=None)
 
760
 
        self.function = function
 
763
 
class InaccessibleParent(PathError):
 
765
 
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
766
 
            ' relative path "%(path)s"')
 
768
 
    def __init__(self, path, base):
 
769
 
        PathError.__init__(self, path)
 
773
 
class NoRepositoryPresent(BzrError):
 
775
 
    _fmt = 'No repository present: "%(path)s"'
 
776
 
    def __init__(self, bzrdir):
 
777
 
        BzrError.__init__(self)
 
778
 
        self.path = bzrdir.transport.clone('..').base
 
781
 
class FileInWrongBranch(BzrError):
 
783
 
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
 
785
 
    def __init__(self, branch, path):
 
786
 
        BzrError.__init__(self)
 
788
 
        self.branch_base = branch.base
 
792
 
class UnsupportedFormatError(BzrError):
 
794
 
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
797
 
class UnknownFormatError(BzrError):
 
799
 
    _fmt = "Unknown %(kind)s format: %(format)r"
 
801
 
    def __init__(self, format, kind='branch'):
 
806
 
class IncompatibleFormat(BzrError):
 
808
 
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
810
 
    def __init__(self, format, bzrdir_format):
 
811
 
        BzrError.__init__(self)
 
813
 
        self.bzrdir = bzrdir_format
 
816
 
class IncompatibleRepositories(BzrError):
 
817
 
    """Report an error that two repositories are not compatible.
 
819
 
    Note that the source and target repositories are permitted to be strings:
 
820
 
    this exception is thrown from the smart server and may refer to a
 
821
 
    repository the client hasn't opened.
 
824
 
    _fmt = "%(target)s\n" \
 
825
 
            "is not compatible with\n" \
 
829
 
    def __init__(self, source, target, details=None):
 
831
 
            details = "(no details)"
 
832
 
        BzrError.__init__(self, target=target, source=source, details=details)
 
835
 
class IncompatibleRevision(BzrError):
 
837
 
    _fmt = "Revision is not compatible with %(repo_format)s"
 
839
 
    def __init__(self, repo_format):
 
840
 
        BzrError.__init__(self)
 
841
 
        self.repo_format = repo_format
 
844
 
class AlreadyVersionedError(BzrError):
 
845
 
    """Used when a path is expected not to be versioned, but it is."""
 
847
 
    _fmt = "%(context_info)s%(path)s is already versioned."
 
849
 
    def __init__(self, path, context_info=None):
 
850
 
        """Construct a new AlreadyVersionedError.
 
852
 
        :param path: This is the path which is versioned,
 
853
 
        which should be in a user friendly form.
 
854
 
        :param context_info: If given, this is information about the context,
 
855
 
        which could explain why this is expected to not be versioned.
 
857
 
        BzrError.__init__(self)
 
859
 
        if context_info is None:
 
860
 
            self.context_info = ''
 
862
 
            self.context_info = context_info + ". "
 
865
 
class NotVersionedError(BzrError):
 
866
 
    """Used when a path is expected to be versioned, but it is not."""
 
868
 
    _fmt = "%(context_info)s%(path)s is not versioned."
 
870
 
    def __init__(self, path, context_info=None):
 
871
 
        """Construct a new NotVersionedError.
 
873
 
        :param path: This is the path which is not versioned,
 
874
 
        which should be in a user friendly form.
 
875
 
        :param context_info: If given, this is information about the context,
 
876
 
        which could explain why this is expected to be versioned.
 
878
 
        BzrError.__init__(self)
 
880
 
        if context_info is None:
 
881
 
            self.context_info = ''
 
883
 
            self.context_info = context_info + ". "
 
886
 
class PathsNotVersionedError(BzrError):
 
887
 
    """Used when reporting several paths which are not versioned"""
 
889
 
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
891
 
    def __init__(self, paths):
 
892
 
        from bzrlib.osutils import quotefn
 
893
 
        BzrError.__init__(self)
 
895
 
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
898
 
class PathsDoNotExist(BzrError):
 
900
 
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
902
 
    # used when reporting that paths are neither versioned nor in the working
 
905
 
    def __init__(self, paths, extra=None):
 
907
 
        from bzrlib.osutils import quotefn
 
908
 
        BzrError.__init__(self)
 
910
 
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
912
 
            self.extra = ': ' + str(extra)
 
917
 
class BadFileKindError(BzrError):
 
919
 
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
921
 
    def __init__(self, filename, kind):
 
922
 
        BzrError.__init__(self, filename=filename, kind=kind)
 
925
 
class BadFilenameEncoding(BzrError):
 
927
 
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
928
 
            ' encoding %(fs_encoding)s')
 
930
 
    def __init__(self, filename, fs_encoding):
 
931
 
        BzrError.__init__(self)
 
932
 
        self.filename = filename
 
933
 
        self.fs_encoding = fs_encoding
 
936
 
class ForbiddenControlFileError(BzrError):
 
938
 
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
941
 
class LockError(InternalBzrError):
 
943
 
    _fmt = "Lock error: %(msg)s"
 
945
 
    # All exceptions from the lock/unlock functions should be from
 
946
 
    # this exception class.  They will be translated as necessary. The
 
947
 
    # original exception is available as e.original_error
 
949
 
    # New code should prefer to raise specific subclasses
 
950
 
    def __init__(self, message):
 
951
 
        # Python 2.5 uses a slot for StandardError.message,
 
952
 
        # so use a different variable name.  We now work around this in
 
953
 
        # BzrError.__str__, but this member name is kept for compatability.
 
957
 
class LockActive(LockError):
 
959
 
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
961
 
    internal_error = False
 
963
 
    def __init__(self, lock_description):
 
964
 
        self.lock_description = lock_description
 
967
 
class CommitNotPossible(LockError):
 
969
 
    _fmt = "A commit was attempted but we do not have a write lock open."
 
975
 
class AlreadyCommitted(LockError):
 
977
 
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
983
 
class ReadOnlyError(LockError):
 
985
 
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
987
 
    # TODO: There should also be an error indicating that you need a write
 
988
 
    # lock and don't have any lock at all... mbp 20070226
 
990
 
    def __init__(self, obj):
 
994
 
class LockFailed(LockError):
 
996
 
    internal_error = False
 
998
 
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
1000
 
    def __init__(self, lock, why):
 
1001
 
        LockError.__init__(self, '')
 
1006
 
class OutSideTransaction(BzrError):
 
1008
 
    _fmt = ("A transaction related operation was attempted after"
 
1009
 
            " the transaction finished.")
 
1012
 
class ObjectNotLocked(LockError):
 
1014
 
    _fmt = "%(obj)r is not locked"
 
1016
 
    # this can indicate that any particular object is not locked; see also
 
1017
 
    # LockNotHeld which means that a particular *lock* object is not held by
 
1018
 
    # the caller -- perhaps they should be unified.
 
1019
 
    def __init__(self, obj):
 
1023
 
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
1025
 
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
1027
 
    def __init__(self, obj):
 
1031
 
class UnlockableTransport(LockError):
 
1033
 
    internal_error = False
 
1035
 
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
1037
 
    def __init__(self, transport):
 
1038
 
        self.transport = transport
 
1041
 
class LockContention(LockError):
 
1043
 
    _fmt = 'Could not acquire lock "%(lock)s": %(msg)s'
 
1044
 
    # TODO: show full url for lock, combining the transport and relative
 
1047
 
    internal_error = False
 
1049
 
    def __init__(self, lock, msg=''):
 
1054
 
class LockBroken(LockError):
 
1056
 
    _fmt = ("Lock was broken while still open: %(lock)s"
 
1057
 
            " - check storage consistency!")
 
1059
 
    internal_error = False
 
1061
 
    def __init__(self, lock):
 
1065
 
class LockBreakMismatch(LockError):
 
1067
 
    _fmt = ("Lock was released and re-acquired before being broken:"
 
1068
 
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
1070
 
    internal_error = False
 
1072
 
    def __init__(self, lock, holder, target):
 
1074
 
        self.holder = holder
 
1075
 
        self.target = target
 
1078
 
class LockNotHeld(LockError):
 
1080
 
    _fmt = "Lock not held: %(lock)s"
 
1082
 
    internal_error = False
 
1084
 
    def __init__(self, lock):
 
1088
 
class TokenLockingNotSupported(LockError):
 
1090
 
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
1092
 
    def __init__(self, obj):
 
1096
 
class TokenMismatch(LockBroken):
 
1098
 
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
1100
 
    internal_error = True
 
1102
 
    def __init__(self, given_token, lock_token):
 
1103
 
        self.given_token = given_token
 
1104
 
        self.lock_token = lock_token
 
1107
 
class PointlessCommit(BzrError):
 
1109
 
    _fmt = "No changes to commit"
 
1112
 
class CannotCommitSelectedFileMerge(BzrError):
 
1114
 
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
1115
 
        ' files %(files_str)s'
 
1117
 
    def __init__(self, files):
 
1118
 
        files_str = ', '.join(files)
 
1119
 
        BzrError.__init__(self, files=files, files_str=files_str)
 
1122
 
class BadCommitMessageEncoding(BzrError):
 
1124
 
    _fmt = 'The specified commit message contains characters unsupported by '\
 
1125
 
        'the current encoding.'
 
1128
 
class UpgradeReadonly(BzrError):
 
1130
 
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
1133
 
class UpToDateFormat(BzrError):
 
1135
 
    _fmt = "The branch format %(format)s is already at the most recent format."
 
1137
 
    def __init__(self, format):
 
1138
 
        BzrError.__init__(self)
 
1139
 
        self.format = format
 
1142
 
class StrictCommitFailed(Exception):
 
1144
 
    _fmt = "Commit refused because there are unknowns in the tree."
 
1147
 
class NoSuchRevision(InternalBzrError):
 
1149
 
    _fmt = "%(branch)s has no revision %(revision)s"
 
1151
 
    def __init__(self, branch, revision):
 
1152
 
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
1153
 
        BzrError.__init__(self, branch=branch, revision=revision)
 
1156
 
class RangeInChangeOption(BzrError):
 
1158
 
    _fmt = "Option --change does not accept revision ranges"
 
1161
 
class NoSuchRevisionSpec(BzrError):
 
1163
 
    _fmt = "No namespace registered for string: %(spec)r"
 
1165
 
    def __init__(self, spec):
 
1166
 
        BzrError.__init__(self, spec=spec)
 
1169
 
class NoSuchRevisionInTree(NoSuchRevision):
 
1170
 
    """When using Tree.revision_tree, and the revision is not accessible."""
 
1172
 
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
1174
 
    def __init__(self, tree, revision_id):
 
1175
 
        BzrError.__init__(self)
 
1177
 
        self.revision_id = revision_id
 
1180
 
class InvalidRevisionSpec(BzrError):
 
1182
 
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
 
1183
 
            " %(branch)s%(extra)s")
 
1185
 
    def __init__(self, spec, branch, extra=None):
 
1186
 
        BzrError.__init__(self, branch=branch, spec=spec)
 
1188
 
            self.extra = '\n' + str(extra)
 
1193
 
class HistoryMissing(BzrError):
 
1195
 
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
1198
 
class AppendRevisionsOnlyViolation(BzrError):
 
1200
 
    _fmt = ('Operation denied because it would change the main history,'
 
1201
 
           ' which is not permitted by the append_revisions_only setting on'
 
1202
 
           ' branch "%(location)s".')
 
1204
 
    def __init__(self, location):
 
1205
 
       import bzrlib.urlutils as urlutils
 
1206
 
       location = urlutils.unescape_for_display(location, 'ascii')
 
1207
 
       BzrError.__init__(self, location=location)
 
1210
 
class DivergedBranches(BzrError):
 
1212
 
    _fmt = ("These branches have diverged."
 
1213
 
            " Use the missing command to see how.\n"
 
1214
 
            "Use the merge command to reconcile them.")
 
1216
 
    def __init__(self, branch1, branch2):
 
1217
 
        self.branch1 = branch1
 
1218
 
        self.branch2 = branch2
 
1221
 
class NotLefthandHistory(InternalBzrError):
 
1223
 
    _fmt = "Supplied history does not follow left-hand parents"
 
1225
 
    def __init__(self, history):
 
1226
 
        BzrError.__init__(self, history=history)
 
1229
 
class UnrelatedBranches(BzrError):
 
1231
 
    _fmt = ("Branches have no common ancestor, and"
 
1232
 
            " no merge base revision was specified.")
 
1235
 
class CannotReverseCherrypick(BzrError):
 
1237
 
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
1241
 
class NoCommonAncestor(BzrError):
 
1243
 
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
1245
 
    def __init__(self, revision_a, revision_b):
 
1246
 
        self.revision_a = revision_a
 
1247
 
        self.revision_b = revision_b
 
1250
 
class NoCommonRoot(BzrError):
 
1252
 
    _fmt = ("Revisions are not derived from the same root: "
 
1253
 
           "%(revision_a)s %(revision_b)s.")
 
1255
 
    def __init__(self, revision_a, revision_b):
 
1256
 
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
1259
 
class NotAncestor(BzrError):
 
1261
 
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
1263
 
    def __init__(self, rev_id, not_ancestor_id):
 
1264
 
        BzrError.__init__(self, rev_id=rev_id,
 
1265
 
            not_ancestor_id=not_ancestor_id)
 
1268
 
class AmbiguousBase(BzrError):
 
1270
 
    def __init__(self, bases):
 
1271
 
        symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
 
1272
 
            "as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
 
1273
 
        msg = ("The correct base is unclear, because %s are all equally close"
 
1275
 
        BzrError.__init__(self, msg)
 
1279
 
class NoCommits(BranchError):
 
1281
 
    _fmt = "Branch %(branch)s has no commits."
 
1284
 
class UnlistableStore(BzrError):
 
1286
 
    def __init__(self, store):
 
1287
 
        BzrError.__init__(self, "Store %s is not listable" % store)
 
1291
 
class UnlistableBranch(BzrError):
 
1293
 
    def __init__(self, br):
 
1294
 
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
1297
 
class BoundBranchOutOfDate(BzrError):
 
1299
 
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
1300
 
            " %(master)s.%(extra_help)s")
 
1302
 
    def __init__(self, branch, master):
 
1303
 
        BzrError.__init__(self)
 
1304
 
        self.branch = branch
 
1305
 
        self.master = master
 
1306
 
        self.extra_help = ''
 
1309
 
class CommitToDoubleBoundBranch(BzrError):
 
1311
 
    _fmt = ("Cannot commit to branch %(branch)s."
 
1312
 
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
1314
 
    def __init__(self, branch, master, remote):
 
1315
 
        BzrError.__init__(self)
 
1316
 
        self.branch = branch
 
1317
 
        self.master = master
 
1318
 
        self.remote = remote
 
1321
 
class OverwriteBoundBranch(BzrError):
 
1323
 
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
1325
 
    def __init__(self, branch):
 
1326
 
        BzrError.__init__(self)
 
1327
 
        self.branch = branch
 
1330
 
class BoundBranchConnectionFailure(BzrError):
 
1332
 
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
1333
 
            " => %(target)s: %(error)s")
 
1335
 
    def __init__(self, branch, target, error):
 
1336
 
        BzrError.__init__(self)
 
1337
 
        self.branch = branch
 
1338
 
        self.target = target
 
1342
 
class WeaveError(BzrError):
 
1344
 
    _fmt = "Error in processing weave: %(msg)s"
 
1346
 
    def __init__(self, msg=None):
 
1347
 
        BzrError.__init__(self)
 
1351
 
class WeaveRevisionAlreadyPresent(WeaveError):
 
1353
 
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
1355
 
    def __init__(self, revision_id, weave):
 
1357
 
        WeaveError.__init__(self)
 
1358
 
        self.revision_id = revision_id
 
1362
 
class WeaveRevisionNotPresent(WeaveError):
 
1364
 
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
1366
 
    def __init__(self, revision_id, weave):
 
1367
 
        WeaveError.__init__(self)
 
1368
 
        self.revision_id = revision_id
 
1372
 
class WeaveFormatError(WeaveError):
 
1374
 
    _fmt = "Weave invariant violated: %(what)s"
 
1376
 
    def __init__(self, what):
 
1377
 
        WeaveError.__init__(self)
 
1381
 
class WeaveParentMismatch(WeaveError):
 
1383
 
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
1386
 
class WeaveInvalidChecksum(WeaveError):
 
1388
 
    _fmt = "Text did not match it's checksum: %(message)s"
 
1391
 
class WeaveTextDiffers(WeaveError):
 
1393
 
    _fmt = ("Weaves differ on text content. Revision:"
 
1394
 
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1396
 
    def __init__(self, revision_id, weave_a, weave_b):
 
1397
 
        WeaveError.__init__(self)
 
1398
 
        self.revision_id = revision_id
 
1399
 
        self.weave_a = weave_a
 
1400
 
        self.weave_b = weave_b
 
1403
 
class WeaveTextDiffers(WeaveError):
 
1405
 
    _fmt = ("Weaves differ on text content. Revision:"
 
1406
 
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1408
 
    def __init__(self, revision_id, weave_a, weave_b):
 
1409
 
        WeaveError.__init__(self)
 
1410
 
        self.revision_id = revision_id
 
1411
 
        self.weave_a = weave_a
 
1412
 
        self.weave_b = weave_b
 
1415
 
class VersionedFileError(BzrError):
 
1417
 
    _fmt = "Versioned file error"
 
1420
 
class RevisionNotPresent(VersionedFileError):
 
1422
 
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
1424
 
    def __init__(self, revision_id, file_id):
 
1425
 
        VersionedFileError.__init__(self)
 
1426
 
        self.revision_id = revision_id
 
1427
 
        self.file_id = file_id
 
1430
 
class RevisionAlreadyPresent(VersionedFileError):
 
1432
 
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
1434
 
    def __init__(self, revision_id, file_id):
 
1435
 
        VersionedFileError.__init__(self)
 
1436
 
        self.revision_id = revision_id
 
1437
 
        self.file_id = file_id
 
1440
 
class VersionedFileInvalidChecksum(VersionedFileError):
 
1442
 
    _fmt = "Text did not match its checksum: %(message)s"
 
1445
 
class KnitError(InternalBzrError):
 
1450
 
class KnitCorrupt(KnitError):
 
1452
 
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
1454
 
    def __init__(self, filename, how):
 
1455
 
        KnitError.__init__(self)
 
1456
 
        self.filename = filename
 
1460
 
class SHA1KnitCorrupt(KnitCorrupt):
 
1462
 
    _fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
 
1463
 
        "match expected sha-1. key %(key)s expected sha %(expected)s actual "
 
1466
 
    def __init__(self, filename, actual, expected, key, content):
 
1467
 
        KnitError.__init__(self)
 
1468
 
        self.filename = filename
 
1469
 
        self.actual = actual
 
1470
 
        self.expected = expected
 
1472
 
        self.content = content
 
1475
 
class KnitDataStreamIncompatible(KnitError):
 
1476
 
    # Not raised anymore, as we can convert data streams.  In future we may
 
1477
 
    # need it again for more exotic cases, so we're keeping it around for now.
 
1479
 
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
1481
 
    def __init__(self, stream_format, target_format):
 
1482
 
        self.stream_format = stream_format
 
1483
 
        self.target_format = target_format
 
1486
 
class KnitDataStreamUnknown(KnitError):
 
1487
 
    # Indicates a data stream we don't know how to handle.
 
1489
 
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
1491
 
    def __init__(self, stream_format):
 
1492
 
        self.stream_format = stream_format
 
1495
 
class KnitHeaderError(KnitError):
 
1497
 
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
1499
 
    def __init__(self, badline, filename):
 
1500
 
        KnitError.__init__(self)
 
1501
 
        self.badline = badline
 
1502
 
        self.filename = filename
 
1504
 
class KnitIndexUnknownMethod(KnitError):
 
1505
 
    """Raised when we don't understand the storage method.
 
1507
 
    Currently only 'fulltext' and 'line-delta' are supported.
 
1510
 
    _fmt = ("Knit index %(filename)s does not have a known method"
 
1511
 
            " in options: %(options)r")
 
1513
 
    def __init__(self, filename, options):
 
1514
 
        KnitError.__init__(self)
 
1515
 
        self.filename = filename
 
1516
 
        self.options = options
 
1519
 
class RetryWithNewPacks(BzrError):
 
1520
 
    """Raised when we realize that the packs on disk have changed.
 
1522
 
    This is meant as more of a signaling exception, to trap between where a
 
1523
 
    local error occurred and the code that can actually handle the error and
 
1524
 
    code that can retry appropriately.
 
1527
 
    internal_error = True
 
1529
 
    _fmt = ("Pack files have changed, reload and retry. context: %(context)s"
 
1532
 
    def __init__(self, context, reload_occurred, exc_info):
 
1533
 
        """create a new RetryWithNewPacks error.
 
1535
 
        :param reload_occurred: Set to True if we know that the packs have
 
1536
 
            already been reloaded, and we are failing because of an in-memory
 
1537
 
            cache miss. If set to True then we will ignore if a reload says
 
1538
 
            nothing has changed, because we assume it has already reloaded. If
 
1539
 
            False, then a reload with nothing changed will force an error.
 
1540
 
        :param exc_info: The original exception traceback, so if there is a
 
1541
 
            problem we can raise the original error (value from sys.exc_info())
 
1543
 
        BzrError.__init__(self)
 
1544
 
        self.reload_occurred = reload_occurred
 
1545
 
        self.exc_info = exc_info
 
1546
 
        self.orig_error = exc_info[1]
 
1547
 
        # TODO: The global error handler should probably treat this by
 
1548
 
        #       raising/printing the original exception with a bit about
 
1549
 
        #       RetryWithNewPacks also not being caught
 
1552
 
class RetryAutopack(RetryWithNewPacks):
 
1553
 
    """Raised when we are autopacking and we find a missing file.
 
1555
 
    Meant as a signaling exception, to tell the autopack code it should try
 
1559
 
    internal_error = True
 
1561
 
    _fmt = ("Pack files have changed, reload and try autopack again."
 
1562
 
            " context: %(context)s %(orig_error)s")
 
1565
 
class NoSuchExportFormat(BzrError):
 
1567
 
    _fmt = "Export format %(format)r not supported"
 
1569
 
    def __init__(self, format):
 
1570
 
        BzrError.__init__(self)
 
1571
 
        self.format = format
 
1574
 
class TransportError(BzrError):
 
1576
 
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
1578
 
    def __init__(self, msg=None, orig_error=None):
 
1579
 
        if msg is None and orig_error is not None:
 
1580
 
            msg = str(orig_error)
 
1581
 
        if orig_error is None:
 
1586
 
        self.orig_error = orig_error
 
1587
 
        BzrError.__init__(self)
 
1590
 
class TooManyConcurrentRequests(InternalBzrError):
 
1592
 
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
1593
 
            " Be sure to finish_writing and finish_reading on the"
 
1594
 
            " currently open request.")
 
1596
 
    def __init__(self, medium):
 
1597
 
        self.medium = medium
 
1600
 
class SmartProtocolError(TransportError):
 
1602
 
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
1604
 
    def __init__(self, details):
 
1605
 
        self.details = details
 
1608
 
class UnexpectedProtocolVersionMarker(TransportError):
 
1610
 
    _fmt = "Received bad protocol version marker: %(marker)r"
 
1612
 
    def __init__(self, marker):
 
1613
 
        self.marker = marker
 
1616
 
class UnknownSmartMethod(InternalBzrError):
 
1618
 
    _fmt = "The server does not recognise the '%(verb)s' request."
 
1620
 
    def __init__(self, verb):
 
1624
 
class SmartMessageHandlerError(InternalBzrError):
 
1626
 
    _fmt = ("The message handler raised an exception:\n"
 
1627
 
            "%(traceback_text)s")
 
1629
 
    def __init__(self, exc_info):
 
1631
 
        self.exc_type, self.exc_value, self.exc_tb = exc_info
 
1632
 
        self.exc_info = exc_info
 
1633
 
        traceback_strings = traceback.format_exception(
 
1634
 
                self.exc_type, self.exc_value, self.exc_tb)
 
1635
 
        self.traceback_text = ''.join(traceback_strings)
 
1638
 
# A set of semi-meaningful errors which can be thrown
 
1639
 
class TransportNotPossible(TransportError):
 
1641
 
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
1644
 
class ConnectionError(TransportError):
 
1646
 
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
1649
 
class SocketConnectionError(ConnectionError):
 
1651
 
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
1653
 
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
1655
 
            msg = 'Failed to connect to'
 
1656
 
        if orig_error is None:
 
1659
 
            orig_error = '; ' + str(orig_error)
 
1660
 
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
1665
 
            self.port = ':%s' % port
 
1668
 
# XXX: This is also used for unexpected end of file, which is different at the
 
1669
 
# TCP level from "connection reset".
 
1670
 
class ConnectionReset(TransportError):
 
1672
 
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
1675
 
class InvalidRange(TransportError):
 
1677
 
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
1679
 
    def __init__(self, path, offset, msg=None):
 
1680
 
        TransportError.__init__(self, msg)
 
1682
 
        self.offset = offset
 
1685
 
class InvalidHttpResponse(TransportError):
 
1687
 
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
1689
 
    def __init__(self, path, msg, orig_error=None):
 
1691
 
        TransportError.__init__(self, msg, orig_error=orig_error)
 
1694
 
class InvalidHttpRange(InvalidHttpResponse):
 
1696
 
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
1698
 
    def __init__(self, path, range, msg):
 
1700
 
        InvalidHttpResponse.__init__(self, path, msg)
 
1703
 
class InvalidHttpContentType(InvalidHttpResponse):
 
1705
 
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
1707
 
    def __init__(self, path, ctype, msg):
 
1709
 
        InvalidHttpResponse.__init__(self, path, msg)
 
1712
 
class RedirectRequested(TransportError):
 
1714
 
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
1716
 
    def __init__(self, source, target, is_permanent=False):
 
1717
 
        self.source = source
 
1718
 
        self.target = target
 
1720
 
            self.permanently = ' permanently'
 
1722
 
            self.permanently = ''
 
1723
 
        TransportError.__init__(self)
 
1726
 
class TooManyRedirections(TransportError):
 
1728
 
    _fmt = "Too many redirections"
 
1731
 
class ConflictsInTree(BzrError):
 
1733
 
    _fmt = "Working tree has conflicts."
 
1736
 
class ParseConfigError(BzrError):
 
1738
 
    def __init__(self, errors, filename):
 
1739
 
        if filename is None:
 
1741
 
        message = "Error(s) parsing config file %s:\n%s" % \
 
1742
 
            (filename, ('\n'.join(e.msg for e in errors)))
 
1743
 
        BzrError.__init__(self, message)
 
1746
 
class NoEmailInUsername(BzrError):
 
1748
 
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
1750
 
    def __init__(self, username):
 
1751
 
        BzrError.__init__(self)
 
1752
 
        self.username = username
 
1755
 
class SigningFailed(BzrError):
 
1757
 
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
1759
 
    def __init__(self, command_line):
 
1760
 
        BzrError.__init__(self, command_line=command_line)
 
1763
 
class WorkingTreeNotRevision(BzrError):
 
1765
 
    _fmt = ("The working tree for %(basedir)s has changed since"
 
1766
 
            " the last commit, but weave merge requires that it be"
 
1769
 
    def __init__(self, tree):
 
1770
 
        BzrError.__init__(self, basedir=tree.basedir)
 
1773
 
class CantReprocessAndShowBase(BzrError):
 
1775
 
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
1776
 
           "the relationship of conflicting lines to the base")
 
1779
 
class GraphCycleError(BzrError):
 
1781
 
    _fmt = "Cycle in graph %(graph)r"
 
1783
 
    def __init__(self, graph):
 
1784
 
        BzrError.__init__(self)
 
1788
 
class WritingCompleted(InternalBzrError):
 
1790
 
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
1791
 
            "called upon it - accept bytes may not be called anymore.")
 
1793
 
    def __init__(self, request):
 
1794
 
        self.request = request
 
1797
 
class WritingNotComplete(InternalBzrError):
 
1799
 
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
1800
 
            "called upon it - until the write phase is complete no "
 
1801
 
            "data may be read.")
 
1803
 
    def __init__(self, request):
 
1804
 
        self.request = request
 
1807
 
class NotConflicted(BzrError):
 
1809
 
    _fmt = "File %(filename)s is not conflicted."
 
1811
 
    def __init__(self, filename):
 
1812
 
        BzrError.__init__(self)
 
1813
 
        self.filename = filename
 
1816
 
class MediumNotConnected(InternalBzrError):
 
1818
 
    _fmt = """The medium '%(medium)s' is not connected."""
 
1820
 
    def __init__(self, medium):
 
1821
 
        self.medium = medium
 
1824
 
class MustUseDecorated(Exception):
 
1826
 
    _fmt = "A decorating function has requested its original command be used."
 
1829
 
class NoBundleFound(BzrError):
 
1831
 
    _fmt = 'No bundle was found in "%(filename)s".'
 
1833
 
    def __init__(self, filename):
 
1834
 
        BzrError.__init__(self)
 
1835
 
        self.filename = filename
 
1838
 
class BundleNotSupported(BzrError):
 
1840
 
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
1842
 
    def __init__(self, version, msg):
 
1843
 
        BzrError.__init__(self)
 
1844
 
        self.version = version
 
1848
 
class MissingText(BzrError):
 
1850
 
    _fmt = ("Branch %(base)s is missing revision"
 
1851
 
            " %(text_revision)s of %(file_id)s")
 
1853
 
    def __init__(self, branch, text_revision, file_id):
 
1854
 
        BzrError.__init__(self)
 
1855
 
        self.branch = branch
 
1856
 
        self.base = branch.base
 
1857
 
        self.text_revision = text_revision
 
1858
 
        self.file_id = file_id
 
1861
 
class DuplicateFileId(BzrError):
 
1863
 
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
1865
 
    def __init__(self, file_id, entry):
 
1866
 
        BzrError.__init__(self)
 
1867
 
        self.file_id = file_id
 
1871
 
class DuplicateKey(BzrError):
 
1873
 
    _fmt = "Key %(key)s is already present in map"
 
1876
 
class DuplicateHelpPrefix(BzrError):
 
1878
 
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
1880
 
    def __init__(self, prefix):
 
1881
 
        self.prefix = prefix
 
1884
 
class MalformedTransform(BzrError):
 
1886
 
    _fmt = "Tree transform is malformed %(conflicts)r"
 
1889
 
class NoFinalPath(BzrError):
 
1891
 
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
1892
 
            "file-id: %(file_id)r\n"
 
1893
 
            "root trans-id: %(root_trans_id)r\n")
 
1895
 
    def __init__(self, trans_id, transform):
 
1896
 
        self.trans_id = trans_id
 
1897
 
        self.file_id = transform.final_file_id(trans_id)
 
1898
 
        self.root_trans_id = transform.root
 
1901
 
class BzrBadParameter(InternalBzrError):
 
1903
 
    _fmt = "Bad parameter: %(param)r"
 
1905
 
    # This exception should never be thrown, but it is a base class for all
 
1906
 
    # parameter-to-function errors.
 
1908
 
    def __init__(self, param):
 
1909
 
        BzrError.__init__(self)
 
1913
 
class BzrBadParameterNotUnicode(BzrBadParameter):
 
1915
 
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
1918
 
class ReusingTransform(BzrError):
 
1920
 
    _fmt = "Attempt to reuse a transform that has already been applied."
 
1923
 
class CantMoveRoot(BzrError):
 
1925
 
    _fmt = "Moving the root directory is not supported at this time"
 
1928
 
class BzrMoveFailedError(BzrError):
 
1930
 
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
1932
 
    def __init__(self, from_path='', to_path='', extra=None):
 
1933
 
        from bzrlib.osutils import splitpath
 
1934
 
        BzrError.__init__(self)
 
1936
 
            self.extra = ': ' + str(extra)
 
1940
 
        has_from = len(from_path) > 0
 
1941
 
        has_to = len(to_path) > 0
 
1943
 
            self.from_path = splitpath(from_path)[-1]
 
1948
 
            self.to_path = splitpath(to_path)[-1]
 
1953
 
        if has_from and has_to:
 
1954
 
            self.operator = " =>"
 
1956
 
            self.from_path = "from " + from_path
 
1958
 
            self.operator = "to"
 
1960
 
            self.operator = "file"
 
1963
 
class BzrRenameFailedError(BzrMoveFailedError):
 
1965
 
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
1967
 
    def __init__(self, from_path, to_path, extra=None):
 
1968
 
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
1970
 
class BzrRemoveChangedFilesError(BzrError):
 
1971
 
    """Used when user is trying to remove changed files."""
 
1973
 
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
1974
 
        "%(changes_as_text)s"
 
1975
 
        "Use --keep to not delete them, or --force to delete them regardless.")
 
1977
 
    def __init__(self, tree_delta):
 
1978
 
        BzrError.__init__(self)
 
1979
 
        self.changes_as_text = tree_delta.get_changes_as_text()
 
1980
 
        #self.paths_as_string = '\n'.join(changed_files)
 
1981
 
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
1984
 
class BzrBadParameterNotString(BzrBadParameter):
 
1986
 
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
1989
 
class BzrBadParameterMissing(BzrBadParameter):
 
1991
 
    _fmt = "Parameter $(param)s is required but not present."
 
1994
 
class BzrBadParameterUnicode(BzrBadParameter):
 
1996
 
    _fmt = ("Parameter %(param)s is unicode but"
 
1997
 
            " only byte-strings are permitted.")
 
2000
 
class BzrBadParameterContainsNewline(BzrBadParameter):
 
2002
 
    _fmt = "Parameter %(param)s contains a newline."
 
2005
 
class DependencyNotPresent(BzrError):
 
2007
 
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
2009
 
    def __init__(self, library, error):
 
2010
 
        BzrError.__init__(self, library=library, error=error)
 
2013
 
class ParamikoNotPresent(DependencyNotPresent):
 
2015
 
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
2017
 
    def __init__(self, error):
 
2018
 
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
2021
 
class PointlessMerge(BzrError):
 
2023
 
    _fmt = "Nothing to merge."
 
2026
 
class UninitializableFormat(BzrError):
 
2028
 
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
2030
 
    def __init__(self, format):
 
2031
 
        BzrError.__init__(self)
 
2032
 
        self.format = format
 
2035
 
class BadConversionTarget(BzrError):
 
2037
 
    _fmt = "Cannot convert from format %(from_format)s to format %(format)s." \
 
2040
 
    def __init__(self, problem, format, from_format=None):
 
2041
 
        BzrError.__init__(self)
 
2042
 
        self.problem = problem
 
2043
 
        self.format = format
 
2044
 
        self.from_format = from_format or '(unspecified)'
 
2047
 
class NoDiffFound(BzrError):
 
2049
 
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
2051
 
    def __init__(self, path):
 
2052
 
        BzrError.__init__(self, path)
 
2055
 
class ExecutableMissing(BzrError):
 
2057
 
    _fmt = "%(exe_name)s could not be found on this machine"
 
2059
 
    def __init__(self, exe_name):
 
2060
 
        BzrError.__init__(self, exe_name=exe_name)
 
2063
 
class NoDiff(BzrError):
 
2065
 
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
2067
 
    def __init__(self, msg):
 
2068
 
        BzrError.__init__(self, msg=msg)
 
2071
 
class NoDiff3(BzrError):
 
2073
 
    _fmt = "Diff3 is not installed on this machine."
 
2076
 
class ExistingContent(BzrError):
 
2077
 
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
2079
 
    _fmt = "The content being inserted is already present."
 
2082
 
class ExistingLimbo(BzrError):
 
2084
 
    _fmt = """This tree contains left-over files from a failed operation.
 
2085
 
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2086
 
    keep, and delete it when you are done."""
 
2088
 
    def __init__(self, limbo_dir):
 
2089
 
       BzrError.__init__(self)
 
2090
 
       self.limbo_dir = limbo_dir
 
2093
 
class ExistingPendingDeletion(BzrError):
 
2095
 
    _fmt = """This tree contains left-over files from a failed operation.
 
2096
 
    Please examine %(pending_deletion)s to see if it contains any files you
 
2097
 
    wish to keep, and delete it when you are done."""
 
2099
 
    def __init__(self, pending_deletion):
 
2100
 
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2103
 
class ImmortalLimbo(BzrError):
 
2105
 
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
2106
 
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2107
 
    keep, and delete it when you are done."""
 
2109
 
    def __init__(self, limbo_dir):
 
2110
 
       BzrError.__init__(self)
 
2111
 
       self.limbo_dir = limbo_dir
 
2114
 
class ImmortalPendingDeletion(BzrError):
 
2116
 
    _fmt = ("Unable to delete transform temporary directory "
 
2117
 
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
2118
 
    "contains any files you wish to keep, and delete it when you are done.")
 
2120
 
    def __init__(self, pending_deletion):
 
2121
 
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2124
 
class OutOfDateTree(BzrError):
 
2126
 
    _fmt = "Working tree is out of date, please run 'bzr update'.%(more)s"
 
2128
 
    def __init__(self, tree, more=None):
 
2133
 
        BzrError.__init__(self)
 
2138
 
class PublicBranchOutOfDate(BzrError):
 
2140
 
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
2143
 
    def __init__(self, public_location, revstring):
 
2144
 
        import bzrlib.urlutils as urlutils
 
2145
 
        public_location = urlutils.unescape_for_display(public_location,
 
2147
 
        BzrError.__init__(self, public_location=public_location,
 
2148
 
                          revstring=revstring)
 
2151
 
class MergeModifiedFormatError(BzrError):
 
2153
 
    _fmt = "Error in merge modified format"
 
2156
 
class ConflictFormatError(BzrError):
 
2158
 
    _fmt = "Format error in conflict listings"
 
2161
 
class CorruptDirstate(BzrError):
 
2163
 
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
2164
 
            "Error: %(description)s")
 
2166
 
    def __init__(self, dirstate_path, description):
 
2167
 
        BzrError.__init__(self)
 
2168
 
        self.dirstate_path = dirstate_path
 
2169
 
        self.description = description
 
2172
 
class CorruptRepository(BzrError):
 
2174
 
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
2175
 
            "Please run bzr reconcile on this repository.")
 
2177
 
    def __init__(self, repo):
 
2178
 
        BzrError.__init__(self)
 
2179
 
        self.repo_path = repo.user_url
 
2182
 
class InconsistentDelta(BzrError):
 
2183
 
    """Used when we get a delta that is not valid."""
 
2185
 
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
2186
 
            " %(file_id)r\nreason: %(reason)s")
 
2188
 
    def __init__(self, path, file_id, reason):
 
2189
 
        BzrError.__init__(self)
 
2191
 
        self.file_id = file_id
 
2192
 
        self.reason = reason
 
2195
 
class InconsistentDeltaDelta(InconsistentDelta):
 
2196
 
    """Used when we get a delta that is not valid."""
 
2198
 
    _fmt = ("An inconsistent delta was supplied: %(delta)r"
 
2199
 
            "\nreason: %(reason)s")
 
2201
 
    def __init__(self, delta, reason):
 
2202
 
        BzrError.__init__(self)
 
2204
 
        self.reason = reason
 
2207
 
class UpgradeRequired(BzrError):
 
2209
 
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
2211
 
    def __init__(self, path):
 
2212
 
        BzrError.__init__(self)
 
2216
 
class RepositoryUpgradeRequired(UpgradeRequired):
 
2218
 
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
2221
 
class RichRootUpgradeRequired(UpgradeRequired):
 
2223
 
    _fmt = ("To use this feature you must upgrade your branch at %(path)s to"
 
2224
 
           " a format which supports rich roots.")
 
2227
 
class LocalRequiresBoundBranch(BzrError):
 
2229
 
    _fmt = "Cannot perform local-only commits on unbound branches."
 
2232
 
class UnsupportedOperation(BzrError):
 
2234
 
    _fmt = ("The method %(mname)s is not supported on"
 
2235
 
            " objects of type %(tname)s.")
 
2237
 
    def __init__(self, method, method_self):
 
2238
 
        self.method = method
 
2239
 
        self.mname = method.__name__
 
2240
 
        self.tname = type(method_self).__name__
 
2243
 
class CannotSetRevisionId(UnsupportedOperation):
 
2244
 
    """Raised when a commit is attempting to set a revision id but cant."""
 
2247
 
class NonAsciiRevisionId(UnsupportedOperation):
 
2248
 
    """Raised when a commit is attempting to set a non-ascii revision id
 
2253
 
class BinaryFile(BzrError):
 
2255
 
    _fmt = "File is binary but should be text."
 
2258
 
class IllegalPath(BzrError):
 
2260
 
    _fmt = "The path %(path)s is not permitted on this platform"
 
2262
 
    def __init__(self, path):
 
2263
 
        BzrError.__init__(self)
 
2267
 
class TestamentMismatch(BzrError):
 
2269
 
    _fmt = """Testament did not match expected value.
 
2270
 
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
2273
 
    def __init__(self, revision_id, expected, measured):
 
2274
 
        self.revision_id = revision_id
 
2275
 
        self.expected = expected
 
2276
 
        self.measured = measured
 
2279
 
class NotABundle(BzrError):
 
2281
 
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
2283
 
    def __init__(self, text):
 
2284
 
        BzrError.__init__(self)
 
2288
 
class BadBundle(BzrError):
 
2290
 
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
2292
 
    def __init__(self, text):
 
2293
 
        BzrError.__init__(self)
 
2297
 
class MalformedHeader(BadBundle):
 
2299
 
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
2302
 
class MalformedPatches(BadBundle):
 
2304
 
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
2307
 
class MalformedFooter(BadBundle):
 
2309
 
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
2312
 
class UnsupportedEOLMarker(BadBundle):
 
2314
 
    _fmt = "End of line marker was not \\n in bzr revision-bundle"
 
2317
 
        # XXX: BadBundle's constructor assumes there's explanatory text,
 
2318
 
        # but for this there is not
 
2319
 
        BzrError.__init__(self)
 
2322
 
class IncompatibleBundleFormat(BzrError):
 
2324
 
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
2326
 
    def __init__(self, bundle_format, other):
 
2327
 
        BzrError.__init__(self)
 
2328
 
        self.bundle_format = bundle_format
 
2332
 
class BadInventoryFormat(BzrError):
 
2334
 
    _fmt = "Root class for inventory serialization errors"
 
2337
 
class UnexpectedInventoryFormat(BadInventoryFormat):
 
2339
 
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
2341
 
    def __init__(self, msg):
 
2342
 
        BadInventoryFormat.__init__(self, msg=msg)
 
2345
 
class RootNotRich(BzrError):
 
2347
 
    _fmt = """This operation requires rich root data storage"""
 
2350
 
class NoSmartMedium(InternalBzrError):
 
2352
 
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
2354
 
    def __init__(self, transport):
 
2355
 
        self.transport = transport
 
2358
 
class UnknownSSH(BzrError):
 
2360
 
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
2362
 
    def __init__(self, vendor):
 
2363
 
        BzrError.__init__(self)
 
2364
 
        self.vendor = vendor
 
2367
 
class SSHVendorNotFound(BzrError):
 
2369
 
    _fmt = ("Don't know how to handle SSH connections."
 
2370
 
            " Please set BZR_SSH environment variable.")
 
2373
 
class GhostRevisionsHaveNoRevno(BzrError):
 
2374
 
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
2376
 
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
2377
 
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
2379
 
    def __init__(self, revision_id, ghost_revision_id):
 
2380
 
        self.revision_id = revision_id
 
2381
 
        self.ghost_revision_id = ghost_revision_id
 
2384
 
class GhostRevisionUnusableHere(BzrError):
 
2386
 
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
2388
 
    def __init__(self, revision_id):
 
2389
 
        BzrError.__init__(self)
 
2390
 
        self.revision_id = revision_id
 
2393
 
class IllegalUseOfScopeReplacer(InternalBzrError):
 
2395
 
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
2396
 
            " %(msg)s%(extra)s")
 
2398
 
    def __init__(self, name, msg, extra=None):
 
2399
 
        BzrError.__init__(self)
 
2403
 
            self.extra = ': ' + str(extra)
 
2408
 
class InvalidImportLine(InternalBzrError):
 
2410
 
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
2412
 
    def __init__(self, text, msg):
 
2413
 
        BzrError.__init__(self)
 
2418
 
class ImportNameCollision(InternalBzrError):
 
2420
 
    _fmt = ("Tried to import an object to the same name as"
 
2421
 
            " an existing object. %(name)s")
 
2423
 
    def __init__(self, name):
 
2424
 
        BzrError.__init__(self)
 
2428
 
class NotAMergeDirective(BzrError):
 
2429
 
    """File starting with %(firstline)r is not a merge directive"""
 
2430
 
    def __init__(self, firstline):
 
2431
 
        BzrError.__init__(self, firstline=firstline)
 
2434
 
class NoMergeSource(BzrError):
 
2435
 
    """Raise if no merge source was specified for a merge directive"""
 
2437
 
    _fmt = "A merge directive must provide either a bundle or a public"\
 
2441
 
class IllegalMergeDirectivePayload(BzrError):
 
2442
 
    """A merge directive contained something other than a patch or bundle"""
 
2444
 
    _fmt = "Bad merge directive payload %(start)r"
 
2446
 
    def __init__(self, start):
 
2451
 
class PatchVerificationFailed(BzrError):
 
2452
 
    """A patch from a merge directive could not be verified"""
 
2454
 
    _fmt = "Preview patch does not match requested changes."
 
2457
 
class PatchMissing(BzrError):
 
2458
 
    """Raise a patch type was specified but no patch supplied"""
 
2460
 
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
2462
 
    def __init__(self, patch_type):
 
2463
 
        BzrError.__init__(self)
 
2464
 
        self.patch_type = patch_type
 
2467
 
class TargetNotBranch(BzrError):
 
2468
 
    """A merge directive's target branch is required, but isn't a branch"""
 
2470
 
    _fmt = ("Your branch does not have all of the revisions required in "
 
2471
 
            "order to merge this merge directive and the target "
 
2472
 
            "location specified in the merge directive is not a branch: "
 
2475
 
    def __init__(self, location):
 
2476
 
        BzrError.__init__(self)
 
2477
 
        self.location = location
 
2480
 
class UnsupportedInventoryKind(BzrError):
 
2482
 
    _fmt = """Unsupported entry kind %(kind)s"""
 
2484
 
    def __init__(self, kind):
 
2488
 
class BadSubsumeSource(BzrError):
 
2490
 
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
2492
 
    def __init__(self, tree, other_tree, reason):
 
2494
 
        self.other_tree = other_tree
 
2495
 
        self.reason = reason
 
2498
 
class SubsumeTargetNeedsUpgrade(BzrError):
 
2500
 
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
2502
 
    def __init__(self, other_tree):
 
2503
 
        self.other_tree = other_tree
 
2506
 
class BadReferenceTarget(InternalBzrError):
 
2508
 
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
2511
 
    def __init__(self, tree, other_tree, reason):
 
2513
 
        self.other_tree = other_tree
 
2514
 
        self.reason = reason
 
2517
 
class NoSuchTag(BzrError):
 
2519
 
    _fmt = "No such tag: %(tag_name)s"
 
2521
 
    def __init__(self, tag_name):
 
2522
 
        self.tag_name = tag_name
 
2525
 
class TagsNotSupported(BzrError):
 
2527
 
    _fmt = ("Tags not supported by %(branch)s;"
 
2528
 
            " you may be able to use bzr upgrade.")
 
2530
 
    def __init__(self, branch):
 
2531
 
        self.branch = branch
 
2534
 
class TagAlreadyExists(BzrError):
 
2536
 
    _fmt = "Tag %(tag_name)s already exists."
 
2538
 
    def __init__(self, tag_name):
 
2539
 
        self.tag_name = tag_name
 
2542
 
class MalformedBugIdentifier(BzrError):
 
2544
 
    _fmt = ('Did not understand bug identifier %(bug_id)s: %(reason)s. '
 
2545
 
            'See "bzr help bugs" for more information on this feature.')
 
2547
 
    def __init__(self, bug_id, reason):
 
2548
 
        self.bug_id = bug_id
 
2549
 
        self.reason = reason
 
2552
 
class InvalidBugTrackerURL(BzrError):
 
2554
 
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
2555
 
            "contain {id}: %(url)s")
 
2557
 
    def __init__(self, abbreviation, url):
 
2558
 
        self.abbreviation = abbreviation
 
2562
 
class UnknownBugTrackerAbbreviation(BzrError):
 
2564
 
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
2567
 
    def __init__(self, abbreviation, branch):
 
2568
 
        self.abbreviation = abbreviation
 
2569
 
        self.branch = branch
 
2572
 
class InvalidLineInBugsProperty(BzrError):
 
2574
 
    _fmt = ("Invalid line in bugs property: '%(line)s'")
 
2576
 
    def __init__(self, line):
 
2580
 
class InvalidBugStatus(BzrError):
 
2582
 
    _fmt = ("Invalid bug status: '%(status)s'")
 
2584
 
    def __init__(self, status):
 
2585
 
        self.status = status
 
2588
 
class UnexpectedSmartServerResponse(BzrError):
 
2590
 
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
2592
 
    def __init__(self, response_tuple):
 
2593
 
        self.response_tuple = response_tuple
 
2596
 
class ErrorFromSmartServer(BzrError):
 
2597
 
    """An error was received from a smart server.
 
2599
 
    :seealso: UnknownErrorFromSmartServer
 
2602
 
    _fmt = "Error received from smart server: %(error_tuple)r"
 
2604
 
    internal_error = True
 
2606
 
    def __init__(self, error_tuple):
 
2607
 
        self.error_tuple = error_tuple
 
2609
 
            self.error_verb = error_tuple[0]
 
2611
 
            self.error_verb = None
 
2612
 
        self.error_args = error_tuple[1:]
 
2615
 
class UnknownErrorFromSmartServer(BzrError):
 
2616
 
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
2619
 
    This is distinct from ErrorFromSmartServer so that it is possible to
 
2620
 
    distinguish between the following two cases:
 
2621
 
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2622
 
        and so should provoke a traceback to the user.
 
2623
 
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
2624
 
        translated.  This is probably because the server sent us garbage, and
 
2625
 
        should not provoke a traceback.
 
2628
 
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
2630
 
    internal_error = False
 
2632
 
    def __init__(self, error_from_smart_server):
 
2635
 
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
2637
 
        self.error_from_smart_server = error_from_smart_server
 
2638
 
        self.error_tuple = error_from_smart_server.error_tuple
 
2641
 
class ContainerError(BzrError):
 
2642
 
    """Base class of container errors."""
 
2645
 
class UnknownContainerFormatError(ContainerError):
 
2647
 
    _fmt = "Unrecognised container format: %(container_format)r"
 
2649
 
    def __init__(self, container_format):
 
2650
 
        self.container_format = container_format
 
2653
 
class UnexpectedEndOfContainerError(ContainerError):
 
2655
 
    _fmt = "Unexpected end of container stream"
 
2658
 
class UnknownRecordTypeError(ContainerError):
 
2660
 
    _fmt = "Unknown record type: %(record_type)r"
 
2662
 
    def __init__(self, record_type):
 
2663
 
        self.record_type = record_type
 
2666
 
class InvalidRecordError(ContainerError):
 
2668
 
    _fmt = "Invalid record: %(reason)s"
 
2670
 
    def __init__(self, reason):
 
2671
 
        self.reason = reason
 
2674
 
class ContainerHasExcessDataError(ContainerError):
 
2676
 
    _fmt = "Container has data after end marker: %(excess)r"
 
2678
 
    def __init__(self, excess):
 
2679
 
        self.excess = excess
 
2682
 
class DuplicateRecordNameError(ContainerError):
 
2684
 
    _fmt = "Container has multiple records with the same name: %(name)s"
 
2686
 
    def __init__(self, name):
 
2690
 
class NoDestinationAddress(InternalBzrError):
 
2692
 
    _fmt = "Message does not have a destination address."
 
2695
 
class RepositoryDataStreamError(BzrError):
 
2697
 
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
2699
 
    def __init__(self, reason):
 
2700
 
        self.reason = reason
 
2703
 
class SMTPError(BzrError):
 
2705
 
    _fmt = "SMTP error: %(error)s"
 
2707
 
    def __init__(self, error):
 
2711
 
class NoMessageSupplied(BzrError):
 
2713
 
    _fmt = "No message supplied."
 
2716
 
class NoMailAddressSpecified(BzrError):
 
2718
 
    _fmt = "No mail-to address (--mail-to) or output (-o) specified."
 
2721
 
class UnknownMailClient(BzrError):
 
2723
 
    _fmt = "Unknown mail client: %(mail_client)s"
 
2725
 
    def __init__(self, mail_client):
 
2726
 
        BzrError.__init__(self, mail_client=mail_client)
 
2729
 
class MailClientNotFound(BzrError):
 
2731
 
    _fmt = "Unable to find mail client with the following names:"\
 
2732
 
        " %(mail_command_list_string)s"
 
2734
 
    def __init__(self, mail_command_list):
 
2735
 
        mail_command_list_string = ', '.join(mail_command_list)
 
2736
 
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
2737
 
                          mail_command_list_string=mail_command_list_string)
 
2739
 
class SMTPConnectionRefused(SMTPError):
 
2741
 
    _fmt = "SMTP connection to %(host)s refused"
 
2743
 
    def __init__(self, error, host):
 
2748
 
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
2750
 
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
2753
 
class BzrDirError(BzrError):
 
2755
 
    def __init__(self, bzrdir):
 
2756
 
        import bzrlib.urlutils as urlutils
 
2757
 
        display_url = urlutils.unescape_for_display(bzrdir.user_url,
 
2759
 
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
2762
 
class UnsyncedBranches(BzrDirError):
 
2764
 
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
2765
 
            " bzr help sync-for-reconfigure.")
 
2767
 
    def __init__(self, bzrdir, target_branch):
 
2768
 
        BzrDirError.__init__(self, bzrdir)
 
2769
 
        import bzrlib.urlutils as urlutils
 
2770
 
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
2774
 
class AlreadyBranch(BzrDirError):
 
2776
 
    _fmt = "'%(display_url)s' is already a branch."
 
2779
 
class AlreadyTree(BzrDirError):
 
2781
 
    _fmt = "'%(display_url)s' is already a tree."
 
2784
 
class AlreadyCheckout(BzrDirError):
 
2786
 
    _fmt = "'%(display_url)s' is already a checkout."
 
2789
 
class AlreadyLightweightCheckout(BzrDirError):
 
2791
 
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
2794
 
class AlreadyUsingShared(BzrDirError):
 
2796
 
    _fmt = "'%(display_url)s' is already using a shared repository."
 
2799
 
class AlreadyStandalone(BzrDirError):
 
2801
 
    _fmt = "'%(display_url)s' is already standalone."
 
2804
 
class AlreadyWithTrees(BzrDirError):
 
2806
 
    _fmt = ("Shared repository '%(display_url)s' already creates "
 
2810
 
class AlreadyWithNoTrees(BzrDirError):
 
2812
 
    _fmt = ("Shared repository '%(display_url)s' already doesn't create "
 
2816
 
class ReconfigurationNotSupported(BzrDirError):
 
2818
 
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
2821
 
class NoBindLocation(BzrDirError):
 
2823
 
    _fmt = "No location could be found to bind to at %(display_url)s."
 
2826
 
class UncommittedChanges(BzrError):
 
2828
 
    _fmt = ('Working tree "%(display_url)s" has uncommitted changes'
 
2829
 
            ' (See bzr status).%(more)s')
 
2831
 
    def __init__(self, tree, more=None):
 
2836
 
        import bzrlib.urlutils as urlutils
 
2837
 
        display_url = urlutils.unescape_for_display(
 
2838
 
            tree.user_url, 'ascii')
 
2839
 
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
 
2842
 
class MissingTemplateVariable(BzrError):
 
2844
 
    _fmt = 'Variable {%(name)s} is not available.'
 
2846
 
    def __init__(self, name):
 
2850
 
class NoTemplate(BzrError):
 
2852
 
    _fmt = 'No template specified.'
 
2855
 
class UnableCreateSymlink(BzrError):
 
2857
 
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
2859
 
    def __init__(self, path=None):
 
2863
 
                path_str = repr(str(path))
 
2864
 
            except UnicodeEncodeError:
 
2865
 
                path_str = repr(path)
 
2867
 
        self.path_str = path_str
 
2870
 
class UnsupportedTimezoneFormat(BzrError):
 
2872
 
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
2873
 
            'options are "utc", "original", "local".')
 
2875
 
    def __init__(self, timezone):
 
2876
 
        self.timezone = timezone
 
2879
 
class CommandAvailableInPlugin(StandardError):
 
2881
 
    internal_error = False
 
2883
 
    def __init__(self, cmd_name, plugin_metadata, provider):
 
2885
 
        self.plugin_metadata = plugin_metadata
 
2886
 
        self.cmd_name = cmd_name
 
2887
 
        self.provider = provider
 
2891
 
        _fmt = ('"%s" is not a standard bzr command. \n'
 
2892
 
                'However, the following official plugin provides this command: %s\n'
 
2893
 
                'You can install it by going to: %s'
 
2894
 
                % (self.cmd_name, self.plugin_metadata['name'],
 
2895
 
                    self.plugin_metadata['url']))
 
2900
 
class NoPluginAvailable(BzrError):
 
2904
 
class UnableEncodePath(BzrError):
 
2906
 
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
2907
 
            'user encoding %(user_encoding)s')
 
2909
 
    def __init__(self, path, kind):
 
2910
 
        from bzrlib.osutils import get_user_encoding
 
2913
 
        self.user_encoding = osutils.get_user_encoding()
 
2916
 
class NoSuchAlias(BzrError):
 
2918
 
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
2920
 
    def __init__(self, alias_name):
 
2921
 
        BzrError.__init__(self, alias_name=alias_name)
 
2924
 
class DirectoryLookupFailure(BzrError):
 
2925
 
    """Base type for lookup errors."""
 
2930
 
class InvalidLocationAlias(DirectoryLookupFailure):
 
2932
 
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
2934
 
    def __init__(self, alias_name):
 
2935
 
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
2938
 
class UnsetLocationAlias(DirectoryLookupFailure):
 
2940
 
    _fmt = 'No %(alias_name)s location assigned.'
 
2942
 
    def __init__(self, alias_name):
 
2943
 
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
2946
 
class CannotBindAddress(BzrError):
 
2948
 
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
2950
 
    def __init__(self, host, port, orig_error):
 
2951
 
        # nb: in python2.4 socket.error doesn't have a useful repr
 
2952
 
        BzrError.__init__(self, host=host, port=port,
 
2953
 
            orig_error=repr(orig_error.args))
 
2956
 
class UnknownRules(BzrError):
 
2958
 
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
2960
 
    def __init__(self, unknowns):
 
2961
 
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
2964
 
class HookFailed(BzrError):
 
2965
 
    """Raised when a pre_change_branch_tip hook function fails anything other
 
2966
 
    than TipChangeRejected.
 
2968
 
    Note that this exception is no longer raised, and the import is only left
 
2969
 
    to be nice to code which might catch it in a plugin.
 
2972
 
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
2973
 
            "%(traceback_text)s%(exc_value)s")
 
2975
 
    def __init__(self, hook_stage, hook_name, exc_info, warn=True):
 
2977
 
            symbol_versioning.warn("BzrError HookFailed has been deprecated "
 
2978
 
                "as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
 
2980
 
        self.hook_stage = hook_stage
 
2981
 
        self.hook_name = hook_name
 
2982
 
        self.exc_info = exc_info
 
2983
 
        self.exc_type = exc_info[0]
 
2984
 
        self.exc_value = exc_info[1]
 
2985
 
        self.exc_tb = exc_info[2]
 
2986
 
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
2989
 
class TipChangeRejected(BzrError):
 
2990
 
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
2991
 
    explicitly abort a change to a branch tip.
 
2994
 
    _fmt = u"Tip change rejected: %(msg)s"
 
2996
 
    def __init__(self, msg):
 
3000
 
class ShelfCorrupt(BzrError):
 
3002
 
    _fmt = "Shelf corrupt."
 
3005
 
class NoSuchShelfId(BzrError):
 
3007
 
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
 
3009
 
    def __init__(self, shelf_id):
 
3010
 
        BzrError.__init__(self, shelf_id=shelf_id)
 
3013
 
class InvalidShelfId(BzrError):
 
3015
 
    _fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
 
3017
 
    def __init__(self, invalid_id):
 
3018
 
        BzrError.__init__(self, invalid_id=invalid_id)
 
3021
 
class JailBreak(BzrError):
 
3023
 
    _fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
 
3025
 
    def __init__(self, url):
 
3026
 
        BzrError.__init__(self, url=url)
 
3029
 
class UserAbort(BzrError):
 
3031
 
    _fmt = 'The user aborted the operation.'
 
3034
 
class MustHaveWorkingTree(BzrError):
 
3036
 
    _fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
 
3038
 
    def __init__(self, format, url):
 
3039
 
        BzrError.__init__(self, format=format, url=url)
 
3042
 
class NoSuchView(BzrError):
 
3043
 
    """A view does not exist.
 
3046
 
    _fmt = u"No such view: %(view_name)s."
 
3048
 
    def __init__(self, view_name):
 
3049
 
        self.view_name = view_name
 
3052
 
class ViewsNotSupported(BzrError):
 
3053
 
    """Views are not supported by a tree format.
 
3056
 
    _fmt = ("Views are not supported by %(tree)s;"
 
3057
 
            " use 'bzr upgrade' to change your tree to a later format.")
 
3059
 
    def __init__(self, tree):
 
3063
 
class FileOutsideView(BzrError):
 
3065
 
    _fmt = ('Specified file "%(file_name)s" is outside the current view: '
 
3068
 
    def __init__(self, file_name, view_files):
 
3069
 
        self.file_name = file_name
 
3070
 
        self.view_str = ", ".join(view_files)
 
3073
 
class UnresumableWriteGroup(BzrError):
 
3075
 
    _fmt = ("Repository %(repository)s cannot resume write group "
 
3076
 
            "%(write_groups)r: %(reason)s")
 
3078
 
    internal_error = True
 
3080
 
    def __init__(self, repository, write_groups, reason):
 
3081
 
        self.repository = repository
 
3082
 
        self.write_groups = write_groups
 
3083
 
        self.reason = reason
 
3086
 
class UnsuspendableWriteGroup(BzrError):
 
3088
 
    _fmt = ("Repository %(repository)s cannot suspend a write group.")
 
3090
 
    internal_error = True
 
3092
 
    def __init__(self, repository):
 
3093
 
        self.repository = repository
 
3096
 
class LossyPushToSameVCS(BzrError):
 
3098
 
    _fmt = ("Lossy push not possible between %(source_branch)r and "
 
3099
 
            "%(target_branch)r that are in the same VCS.")
 
3101
 
    internal_error = True
 
3103
 
    def __init__(self, source_branch, target_branch):
 
3104
 
        self.source_branch = source_branch
 
3105
 
        self.target_branch = target_branch
 
3108
 
class NoRoundtrippingSupport(BzrError):
 
3110
 
    _fmt = ("Roundtripping is not supported between %(source_branch)r and "
 
3111
 
            "%(target_branch)r.")
 
3113
 
    internal_error = True
 
3115
 
    def __init__(self, source_branch, target_branch):
 
3116
 
        self.source_branch = source_branch
 
3117
 
        self.target_branch = target_branch
 
3120
 
class FileTimestampUnavailable(BzrError):
 
3122
 
    _fmt = "The filestamp for %(path)s is not available."
 
3124
 
    internal_error = True
 
3126
 
    def __init__(self, path):
 
3130
 
class NoColocatedBranchSupport(BzrError):
 
3132
 
    _fmt = ("%(bzrdir)r does not support co-located branches.")
 
3134
 
    def __init__(self, bzrdir):
 
3135
 
        self.bzrdir = bzrdir