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.
 
 
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__)
 
 
105
                # special case: python2.5 puts the 'message' attribute in a
 
 
106
                # slot, so it isn't seen in __dict__
 
 
107
                d['message'] = getattr(self, 'message', 'no message')
 
 
109
                # __str__() should always return a 'str' object
 
 
110
                # never a 'unicode' object.
 
 
112
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
 
113
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
 
114
                % (self.__class__.__name__,
 
 
116
                   getattr(self, '_fmt', None),
 
 
119
    def __unicode__(self):
 
 
121
        if isinstance(u, str):
 
 
122
            # Try decoding the str using the default encoding.
 
 
124
        elif not isinstance(u, unicode):
 
 
125
            # Try to make a unicode object from it, because __unicode__ must
 
 
126
            # return a unicode object.
 
 
132
        if isinstance(s, unicode):
 
 
135
            # __str__ must return a str.
 
 
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__ != 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: %(message)s"
 
 
222
    def __init__(self, message):
 
 
223
        BzrError.__init__(self)
 
 
224
        self.message = message
 
 
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 UnstackableRepositoryFormat(BzrError):
 
 
641
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
 
642
        "You will need to upgrade the repository to permit branch stacking.")
 
 
644
    def __init__(self, format, url):
 
 
645
        BzrError.__init__(self)
 
 
650
class ReadError(PathError):
 
 
652
    _fmt = """Error reading from %(path)r."""
 
 
655
class ShortReadvError(PathError):
 
 
657
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
 
658
            ' at %(offset)s for "%(path)s"%(extra)s')
 
 
660
    internal_error = True
 
 
662
    def __init__(self, path, offset, length, actual, extra=None):
 
 
663
        PathError.__init__(self, path, extra=extra)
 
 
669
class PathNotChild(PathError):
 
 
671
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
 
673
    internal_error = True
 
 
675
    def __init__(self, path, base, extra=None):
 
 
676
        BzrError.__init__(self)
 
 
680
            self.extra = ': ' + str(extra)
 
 
685
class InvalidNormalization(PathError):
 
 
687
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
 
690
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
 
691
# the exception object is a bit undesirable.
 
 
692
# TODO: Probably this behavior of should be a common superclass 
 
 
693
class NotBranchError(PathError):
 
 
695
    _fmt = 'Not a branch: "%(path)s".'
 
 
697
    def __init__(self, path):
 
 
698
       import bzrlib.urlutils as urlutils
 
 
699
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
 
702
class NoSubmitBranch(PathError):
 
 
704
    _fmt = 'No submit branch available for branch "%(path)s"'
 
 
706
    def __init__(self, branch):
 
 
707
       import bzrlib.urlutils as urlutils
 
 
708
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
711
class AlreadyBranchError(PathError):
 
 
713
    _fmt = 'Already a branch: "%(path)s".'
 
 
716
class BranchExistsWithoutWorkingTree(PathError):
 
 
718
    _fmt = 'Directory contains a branch, but no working tree \
 
 
719
(use bzr checkout if you wish to build a working tree): "%(path)s"'
 
 
722
class AtomicFileAlreadyClosed(PathError):
 
 
724
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
 
727
    def __init__(self, path, function):
 
 
728
        PathError.__init__(self, path=path, extra=None)
 
 
729
        self.function = function
 
 
732
class InaccessibleParent(PathError):
 
 
734
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
 
735
            ' relative path "%(path)s"')
 
 
737
    def __init__(self, path, base):
 
 
738
        PathError.__init__(self, path)
 
 
742
class NoRepositoryPresent(BzrError):
 
 
744
    _fmt = 'No repository present: "%(path)s"'
 
 
745
    def __init__(self, bzrdir):
 
 
746
        BzrError.__init__(self)
 
 
747
        self.path = bzrdir.transport.clone('..').base
 
 
750
class FileInWrongBranch(BzrError):
 
 
752
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
 
 
754
    def __init__(self, branch, path):
 
 
755
        BzrError.__init__(self)
 
 
757
        self.branch_base = branch.base
 
 
761
class UnsupportedFormatError(BzrError):
 
 
763
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
 
766
class UnknownFormatError(BzrError):
 
 
768
    _fmt = "Unknown %(kind)s format: %(format)r"
 
 
770
    def __init__(self, format, kind='branch'):
 
 
775
class IncompatibleFormat(BzrError):
 
 
777
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
779
    def __init__(self, format, bzrdir_format):
 
 
780
        BzrError.__init__(self)
 
 
782
        self.bzrdir = bzrdir_format
 
 
785
class IncompatibleRepositories(BzrError):
 
 
787
    _fmt = "%(target)s\n" \
 
 
788
            "is not compatible with\n" \
 
 
792
    def __init__(self, source, target, details=None):
 
 
794
            details = "(no details)"
 
 
795
        BzrError.__init__(self, target=target, source=source, details=details)
 
 
798
class IncompatibleRevision(BzrError):
 
 
800
    _fmt = "Revision is not compatible with %(repo_format)s"
 
 
802
    def __init__(self, repo_format):
 
 
803
        BzrError.__init__(self)
 
 
804
        self.repo_format = repo_format
 
 
807
class AlreadyVersionedError(BzrError):
 
 
808
    """Used when a path is expected not to be versioned, but it is."""
 
 
810
    _fmt = "%(context_info)s%(path)s is already versioned."
 
 
812
    def __init__(self, path, context_info=None):
 
 
813
        """Construct a new AlreadyVersionedError.
 
 
815
        :param path: This is the path which is versioned,
 
 
816
        which should be in a user friendly form.
 
 
817
        :param context_info: If given, this is information about the context,
 
 
818
        which could explain why this is expected to not be versioned.
 
 
820
        BzrError.__init__(self)
 
 
822
        if context_info is None:
 
 
823
            self.context_info = ''
 
 
825
            self.context_info = context_info + ". "
 
 
828
class NotVersionedError(BzrError):
 
 
829
    """Used when a path is expected to be versioned, but it is not."""
 
 
831
    _fmt = "%(context_info)s%(path)s is not versioned."
 
 
833
    def __init__(self, path, context_info=None):
 
 
834
        """Construct a new NotVersionedError.
 
 
836
        :param path: This is the path which is not versioned,
 
 
837
        which should be in a user friendly form.
 
 
838
        :param context_info: If given, this is information about the context,
 
 
839
        which could explain why this is expected to be versioned.
 
 
841
        BzrError.__init__(self)
 
 
843
        if context_info is None:
 
 
844
            self.context_info = ''
 
 
846
            self.context_info = context_info + ". "
 
 
849
class PathsNotVersionedError(BzrError):
 
 
850
    """Used when reporting several paths which are not versioned"""
 
 
852
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
 
854
    def __init__(self, paths):
 
 
855
        from bzrlib.osutils import quotefn
 
 
856
        BzrError.__init__(self)
 
 
858
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
861
class PathsDoNotExist(BzrError):
 
 
863
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
 
865
    # used when reporting that paths are neither versioned nor in the working
 
 
868
    def __init__(self, paths, extra=None):
 
 
870
        from bzrlib.osutils import quotefn
 
 
871
        BzrError.__init__(self)
 
 
873
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
875
            self.extra = ': ' + str(extra)
 
 
880
class BadFileKindError(BzrError):
 
 
882
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
 
884
    def __init__(self, filename, kind):
 
 
885
        BzrError.__init__(self, filename=filename, kind=kind)
 
 
888
class BadFilenameEncoding(BzrError):
 
 
890
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
 
891
            ' encoding %(fs_encoding)s')
 
 
893
    def __init__(self, filename, fs_encoding):
 
 
894
        BzrError.__init__(self)
 
 
895
        self.filename = filename
 
 
896
        self.fs_encoding = fs_encoding
 
 
899
class ForbiddenControlFileError(BzrError):
 
 
901
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
 
904
class LockError(InternalBzrError):
 
 
906
    _fmt = "Lock error: %(msg)s"
 
 
908
    # All exceptions from the lock/unlock functions should be from
 
 
909
    # this exception class.  They will be translated as necessary. The
 
 
910
    # original exception is available as e.original_error
 
 
912
    # New code should prefer to raise specific subclasses
 
 
913
    def __init__(self, message):
 
 
914
        # Python 2.5 uses a slot for StandardError.message,
 
 
915
        # so use a different variable name.  We now work around this in
 
 
916
        # BzrError.__str__, but this member name is kept for compatability.
 
 
920
class LockActive(LockError):
 
 
922
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
 
924
    internal_error = False
 
 
926
    def __init__(self, lock_description):
 
 
927
        self.lock_description = lock_description
 
 
930
class CommitNotPossible(LockError):
 
 
932
    _fmt = "A commit was attempted but we do not have a write lock open."
 
 
938
class AlreadyCommitted(LockError):
 
 
940
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
 
946
class ReadOnlyError(LockError):
 
 
948
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
 
950
    # TODO: There should also be an error indicating that you need a write
 
 
951
    # lock and don't have any lock at all... mbp 20070226
 
 
953
    def __init__(self, obj):
 
 
957
class LockFailed(LockError):
 
 
959
    internal_error = False
 
 
961
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
 
963
    def __init__(self, lock, why):
 
 
964
        LockError.__init__(self, '')
 
 
969
class OutSideTransaction(BzrError):
 
 
971
    _fmt = ("A transaction related operation was attempted after"
 
 
972
            " the transaction finished.")
 
 
975
class ObjectNotLocked(LockError):
 
 
977
    _fmt = "%(obj)r is not locked"
 
 
979
    # this can indicate that any particular object is not locked; see also
 
 
980
    # LockNotHeld which means that a particular *lock* object is not held by
 
 
981
    # the caller -- perhaps they should be unified.
 
 
982
    def __init__(self, obj):
 
 
986
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
 
988
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
 
990
    def __init__(self, obj):
 
 
994
class UnlockableTransport(LockError):
 
 
996
    internal_error = False
 
 
998
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
 
1000
    def __init__(self, transport):
 
 
1001
        self.transport = transport
 
 
1004
class LockContention(LockError):
 
 
1006
    _fmt = 'Could not acquire lock "%(lock)s"'
 
 
1007
    # TODO: show full url for lock, combining the transport and relative
 
 
1010
    internal_error = False
 
 
1012
    def __init__(self, lock):
 
 
1016
class LockBroken(LockError):
 
 
1018
    _fmt = ("Lock was broken while still open: %(lock)s"
 
 
1019
            " - check storage consistency!")
 
 
1021
    internal_error = False
 
 
1023
    def __init__(self, lock):
 
 
1027
class LockBreakMismatch(LockError):
 
 
1029
    _fmt = ("Lock was released and re-acquired before being broken:"
 
 
1030
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
 
1032
    internal_error = False
 
 
1034
    def __init__(self, lock, holder, target):
 
 
1036
        self.holder = holder
 
 
1037
        self.target = target
 
 
1040
class LockNotHeld(LockError):
 
 
1042
    _fmt = "Lock not held: %(lock)s"
 
 
1044
    internal_error = False
 
 
1046
    def __init__(self, lock):
 
 
1050
class TokenLockingNotSupported(LockError):
 
 
1052
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
 
1054
    def __init__(self, obj):
 
 
1058
class TokenMismatch(LockBroken):
 
 
1060
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
 
1062
    internal_error = True
 
 
1064
    def __init__(self, given_token, lock_token):
 
 
1065
        self.given_token = given_token
 
 
1066
        self.lock_token = lock_token
 
 
1069
class PointlessCommit(BzrError):
 
 
1071
    _fmt = "No changes to commit"
 
 
1074
class CannotCommitSelectedFileMerge(BzrError):
 
 
1076
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
 
1077
        ' files %(files_str)s'
 
 
1079
    def __init__(self, files):
 
 
1080
        files_str = ', '.join(files)
 
 
1081
        BzrError.__init__(self, files=files, files_str=files_str)
 
 
1084
class BadCommitMessageEncoding(BzrError):
 
 
1086
    _fmt = 'The specified commit message contains characters unsupported by '\
 
 
1087
        'the current encoding.'
 
 
1090
class UpgradeReadonly(BzrError):
 
 
1092
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
 
1095
class UpToDateFormat(BzrError):
 
 
1097
    _fmt = "The branch format %(format)s is already at the most recent format."
 
 
1099
    def __init__(self, format):
 
 
1100
        BzrError.__init__(self)
 
 
1101
        self.format = format
 
 
1104
class StrictCommitFailed(Exception):
 
 
1106
    _fmt = "Commit refused because there are unknowns in the tree."
 
 
1109
class NoSuchRevision(InternalBzrError):
 
 
1111
    _fmt = "%(branch)s has no revision %(revision)s"
 
 
1113
    def __init__(self, branch, revision):
 
 
1114
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
 
1115
        BzrError.__init__(self, branch=branch, revision=revision)
 
 
1118
class RangeInChangeOption(BzrError):
 
 
1120
    _fmt = "Option --change does not accept revision ranges"
 
 
1123
class NoSuchRevisionSpec(BzrError):
 
 
1125
    _fmt = "No namespace registered for string: %(spec)r"
 
 
1127
    def __init__(self, spec):
 
 
1128
        BzrError.__init__(self, spec=spec)
 
 
1131
class NoSuchRevisionInTree(NoSuchRevision):
 
 
1132
    """When using Tree.revision_tree, and the revision is not accessible."""
 
 
1134
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
 
1136
    def __init__(self, tree, revision_id):
 
 
1137
        BzrError.__init__(self)
 
 
1139
        self.revision_id = revision_id
 
 
1142
class InvalidRevisionSpec(BzrError):
 
 
1144
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
1145
            " %(branch)s%(extra)s")
 
 
1147
    def __init__(self, spec, branch, extra=None):
 
 
1148
        BzrError.__init__(self, branch=branch, spec=spec)
 
 
1150
            self.extra = '\n' + str(extra)
 
 
1155
class HistoryMissing(BzrError):
 
 
1157
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
 
1160
class AppendRevisionsOnlyViolation(BzrError):
 
 
1162
    _fmt = ('Operation denied because it would change the main history,'
 
 
1163
           ' which is not permitted by the append_revisions_only setting on'
 
 
1164
           ' branch "%(location)s".')
 
 
1166
    def __init__(self, location):
 
 
1167
       import bzrlib.urlutils as urlutils
 
 
1168
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
1169
       BzrError.__init__(self, location=location)
 
 
1172
class DivergedBranches(BzrError):
 
 
1174
    _fmt = ("These branches have diverged."
 
 
1175
            " Use the merge command to reconcile them.")
 
 
1177
    def __init__(self, branch1, branch2):
 
 
1178
        self.branch1 = branch1
 
 
1179
        self.branch2 = branch2
 
 
1182
class NotLefthandHistory(InternalBzrError):
 
 
1184
    _fmt = "Supplied history does not follow left-hand parents"
 
 
1186
    def __init__(self, history):
 
 
1187
        BzrError.__init__(self, history=history)
 
 
1190
class UnrelatedBranches(BzrError):
 
 
1192
    _fmt = ("Branches have no common ancestor, and"
 
 
1193
            " no merge base revision was specified.")
 
 
1196
class CannotReverseCherrypick(BzrError):
 
 
1198
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
 
1202
class NoCommonAncestor(BzrError):
 
 
1204
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
 
1206
    def __init__(self, revision_a, revision_b):
 
 
1207
        self.revision_a = revision_a
 
 
1208
        self.revision_b = revision_b
 
 
1211
class NoCommonRoot(BzrError):
 
 
1213
    _fmt = ("Revisions are not derived from the same root: "
 
 
1214
           "%(revision_a)s %(revision_b)s.")
 
 
1216
    def __init__(self, revision_a, revision_b):
 
 
1217
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
 
1220
class NotAncestor(BzrError):
 
 
1222
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
 
1224
    def __init__(self, rev_id, not_ancestor_id):
 
 
1225
        BzrError.__init__(self, rev_id=rev_id,
 
 
1226
            not_ancestor_id=not_ancestor_id)
 
 
1229
class InstallFailed(BzrError):
 
 
1231
    def __init__(self, revisions):
 
 
1232
        revision_str = ", ".join(str(r) for r in revisions)
 
 
1233
        msg = "Could not install revisions:\n%s" % revision_str
 
 
1234
        BzrError.__init__(self, msg)
 
 
1235
        self.revisions = revisions
 
 
1238
class AmbiguousBase(BzrError):
 
 
1240
    def __init__(self, bases):
 
 
1241
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
 
1243
        msg = ("The correct base is unclear, because %s are all equally close"
 
 
1245
        BzrError.__init__(self, msg)
 
 
1249
class NoCommits(BranchError):
 
 
1251
    _fmt = "Branch %(branch)s has no commits."
 
 
1254
class UnlistableStore(BzrError):
 
 
1256
    def __init__(self, store):
 
 
1257
        BzrError.__init__(self, "Store %s is not listable" % store)
 
 
1261
class UnlistableBranch(BzrError):
 
 
1263
    def __init__(self, br):
 
 
1264
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
 
1267
class BoundBranchOutOfDate(BzrError):
 
 
1269
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
 
1272
    def __init__(self, branch, master):
 
 
1273
        BzrError.__init__(self)
 
 
1274
        self.branch = branch
 
 
1275
        self.master = master
 
 
1278
class CommitToDoubleBoundBranch(BzrError):
 
 
1280
    _fmt = ("Cannot commit to branch %(branch)s."
 
 
1281
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
 
1283
    def __init__(self, branch, master, remote):
 
 
1284
        BzrError.__init__(self)
 
 
1285
        self.branch = branch
 
 
1286
        self.master = master
 
 
1287
        self.remote = remote
 
 
1290
class OverwriteBoundBranch(BzrError):
 
 
1292
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
 
1294
    def __init__(self, branch):
 
 
1295
        BzrError.__init__(self)
 
 
1296
        self.branch = branch
 
 
1299
class BoundBranchConnectionFailure(BzrError):
 
 
1301
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
 
1302
            " => %(target)s: %(error)s")
 
 
1304
    def __init__(self, branch, target, error):
 
 
1305
        BzrError.__init__(self)
 
 
1306
        self.branch = branch
 
 
1307
        self.target = target
 
 
1311
class WeaveError(BzrError):
 
 
1313
    _fmt = "Error in processing weave: %(message)s"
 
 
1315
    def __init__(self, message=None):
 
 
1316
        BzrError.__init__(self)
 
 
1317
        self.message = message
 
 
1320
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1322
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1324
    def __init__(self, revision_id, weave):
 
 
1326
        WeaveError.__init__(self)
 
 
1327
        self.revision_id = revision_id
 
 
1331
class WeaveRevisionNotPresent(WeaveError):
 
 
1333
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1335
    def __init__(self, revision_id, weave):
 
 
1336
        WeaveError.__init__(self)
 
 
1337
        self.revision_id = revision_id
 
 
1341
class WeaveFormatError(WeaveError):
 
 
1343
    _fmt = "Weave invariant violated: %(what)s"
 
 
1345
    def __init__(self, what):
 
 
1346
        WeaveError.__init__(self)
 
 
1350
class WeaveParentMismatch(WeaveError):
 
 
1352
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
 
1355
class WeaveInvalidChecksum(WeaveError):
 
 
1357
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1360
class WeaveTextDiffers(WeaveError):
 
 
1362
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1363
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1365
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1366
        WeaveError.__init__(self)
 
 
1367
        self.revision_id = revision_id
 
 
1368
        self.weave_a = weave_a
 
 
1369
        self.weave_b = weave_b
 
 
1372
class WeaveTextDiffers(WeaveError):
 
 
1374
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1375
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1377
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1378
        WeaveError.__init__(self)
 
 
1379
        self.revision_id = revision_id
 
 
1380
        self.weave_a = weave_a
 
 
1381
        self.weave_b = weave_b
 
 
1384
class VersionedFileError(BzrError):
 
 
1386
    _fmt = "Versioned file error"
 
 
1389
class RevisionNotPresent(VersionedFileError):
 
 
1391
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
 
1393
    def __init__(self, revision_id, file_id):
 
 
1394
        VersionedFileError.__init__(self)
 
 
1395
        self.revision_id = revision_id
 
 
1396
        self.file_id = file_id
 
 
1399
class RevisionAlreadyPresent(VersionedFileError):
 
 
1401
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
 
1403
    def __init__(self, revision_id, file_id):
 
 
1404
        VersionedFileError.__init__(self)
 
 
1405
        self.revision_id = revision_id
 
 
1406
        self.file_id = file_id
 
 
1409
class VersionedFileInvalidChecksum(VersionedFileError):
 
 
1411
    _fmt = "Text did not match its checksum: %(message)s"
 
 
1414
class KnitError(InternalBzrError):
 
 
1419
class KnitCorrupt(KnitError):
 
 
1421
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1423
    def __init__(self, filename, how):
 
 
1424
        KnitError.__init__(self)
 
 
1425
        self.filename = filename
 
 
1429
class KnitDataStreamIncompatible(KnitError):
 
 
1430
    # Not raised anymore, as we can convert data streams.  In future we may
 
 
1431
    # need it again for more exotic cases, so we're keeping it around for now.
 
 
1433
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
 
1435
    def __init__(self, stream_format, target_format):
 
 
1436
        self.stream_format = stream_format
 
 
1437
        self.target_format = target_format
 
 
1440
class KnitDataStreamUnknown(KnitError):
 
 
1441
    # Indicates a data stream we don't know how to handle.
 
 
1443
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
 
1445
    def __init__(self, stream_format):
 
 
1446
        self.stream_format = stream_format
 
 
1449
class KnitHeaderError(KnitError):
 
 
1451
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
 
1453
    def __init__(self, badline, filename):
 
 
1454
        KnitError.__init__(self)
 
 
1455
        self.badline = badline
 
 
1456
        self.filename = filename
 
 
1458
class KnitIndexUnknownMethod(KnitError):
 
 
1459
    """Raised when we don't understand the storage method.
 
 
1461
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1464
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1465
            " in options: %(options)r")
 
 
1467
    def __init__(self, filename, options):
 
 
1468
        KnitError.__init__(self)
 
 
1469
        self.filename = filename
 
 
1470
        self.options = options
 
 
1473
class NoSuchExportFormat(BzrError):
 
 
1475
    _fmt = "Export format %(format)r not supported"
 
 
1477
    def __init__(self, format):
 
 
1478
        BzrError.__init__(self)
 
 
1479
        self.format = format
 
 
1482
class TransportError(BzrError):
 
 
1484
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1486
    def __init__(self, msg=None, orig_error=None):
 
 
1487
        if msg is None and orig_error is not None:
 
 
1488
            msg = str(orig_error)
 
 
1489
        if orig_error is None:
 
 
1494
        self.orig_error = orig_error
 
 
1495
        BzrError.__init__(self)
 
 
1498
class TooManyConcurrentRequests(InternalBzrError):
 
 
1500
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1501
            " Be sure to finish_writing and finish_reading on the"
 
 
1502
            " currently open request.")
 
 
1504
    def __init__(self, medium):
 
 
1505
        self.medium = medium
 
 
1508
class SmartProtocolError(TransportError):
 
 
1510
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1512
    def __init__(self, details):
 
 
1513
        self.details = details
 
 
1516
class UnexpectedProtocolVersionMarker(TransportError):
 
 
1518
    _fmt = "Received bad protocol version marker: %(marker)r"
 
 
1520
    def __init__(self, marker):
 
 
1521
        self.marker = marker
 
 
1524
class UnknownSmartMethod(InternalBzrError):
 
 
1526
    _fmt = "The server does not recognise the '%(verb)s' request."
 
 
1528
    def __init__(self, verb):
 
 
1532
class SmartMessageHandlerError(InternalBzrError):
 
 
1534
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
 
1536
    def __init__(self, exc_info):
 
 
1537
        self.exc_type, self.exc_value, self.tb = exc_info
 
 
1540
# A set of semi-meaningful errors which can be thrown
 
 
1541
class TransportNotPossible(TransportError):
 
 
1543
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1546
class ConnectionError(TransportError):
 
 
1548
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1551
class SocketConnectionError(ConnectionError):
 
 
1553
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1555
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1557
            msg = 'Failed to connect to'
 
 
1558
        if orig_error is None:
 
 
1561
            orig_error = '; ' + str(orig_error)
 
 
1562
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1567
            self.port = ':%s' % port
 
 
1570
class ConnectionReset(TransportError):
 
 
1572
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1575
class InvalidRange(TransportError):
 
 
1577
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
 
1579
    def __init__(self, path, offset, msg=None):
 
 
1580
        TransportError.__init__(self, msg)
 
 
1582
        self.offset = offset
 
 
1585
class InvalidHttpResponse(TransportError):
 
 
1587
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1589
    def __init__(self, path, msg, orig_error=None):
 
 
1591
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1594
class InvalidHttpRange(InvalidHttpResponse):
 
 
1596
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1598
    def __init__(self, path, range, msg):
 
 
1600
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1603
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1605
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1607
    def __init__(self, path, ctype, msg):
 
 
1609
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1612
class RedirectRequested(TransportError):
 
 
1614
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1616
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
 
1617
        self.source = source
 
 
1618
        self.target = target
 
 
1620
            self.permanently = ' permanently'
 
 
1622
            self.permanently = ''
 
 
1623
        self._qualified_proto = qual_proto
 
 
1624
        TransportError.__init__(self)
 
 
1626
    def _requalify_url(self, url):
 
 
1627
        """Restore the qualified proto in front of the url"""
 
 
1628
        # When this exception is raised, source and target are in
 
 
1629
        # user readable format. But some transports may use a
 
 
1630
        # different proto (http+urllib:// will present http:// to
 
 
1631
        # the user. If a qualified proto is specified, the code
 
 
1632
        # trapping the exception can get the qualified urls to
 
 
1633
        # properly handle the redirection themself (creating a
 
 
1634
        # new transport object from the target url for example).
 
 
1635
        # But checking that the scheme of the original and
 
 
1636
        # redirected urls are the same can be tricky. (see the
 
 
1637
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1639
        if self._qualified_proto is None:
 
 
1642
        # The TODO related to NotBranchError mention that doing
 
 
1643
        # that kind of manipulation on the urls may not be the
 
 
1644
        # exception object job. On the other hand, this object is
 
 
1645
        # the interface between the code and the user so
 
 
1646
        # presenting the urls in different ways is indeed its
 
 
1649
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1650
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1653
    def get_source_url(self):
 
 
1654
        return self._requalify_url(self.source)
 
 
1656
    def get_target_url(self):
 
 
1657
        return self._requalify_url(self.target)
 
 
1660
class TooManyRedirections(TransportError):
 
 
1662
    _fmt = "Too many redirections"
 
 
1665
class ConflictsInTree(BzrError):
 
 
1667
    _fmt = "Working tree has conflicts."
 
 
1670
class ParseConfigError(BzrError):
 
 
1672
    def __init__(self, errors, filename):
 
 
1673
        if filename is None:
 
 
1675
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1676
            (filename, ('\n'.join(e.message for e in errors)))
 
 
1677
        BzrError.__init__(self, message)
 
 
1680
class NoEmailInUsername(BzrError):
 
 
1682
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1684
    def __init__(self, username):
 
 
1685
        BzrError.__init__(self)
 
 
1686
        self.username = username
 
 
1689
class SigningFailed(BzrError):
 
 
1691
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
 
1693
    def __init__(self, command_line):
 
 
1694
        BzrError.__init__(self, command_line=command_line)
 
 
1697
class WorkingTreeNotRevision(BzrError):
 
 
1699
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1700
            " the last commit, but weave merge requires that it be"
 
 
1703
    def __init__(self, tree):
 
 
1704
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1707
class CantReprocessAndShowBase(BzrError):
 
 
1709
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1710
           "the relationship of conflicting lines to the base")
 
 
1713
class GraphCycleError(BzrError):
 
 
1715
    _fmt = "Cycle in graph %(graph)r"
 
 
1717
    def __init__(self, graph):
 
 
1718
        BzrError.__init__(self)
 
 
1722
class WritingCompleted(InternalBzrError):
 
 
1724
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1725
            "called upon it - accept bytes may not be called anymore.")
 
 
1727
    def __init__(self, request):
 
 
1728
        self.request = request
 
 
1731
class WritingNotComplete(InternalBzrError):
 
 
1733
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1734
            "called upon it - until the write phase is complete no "
 
 
1735
            "data may be read.")
 
 
1737
    def __init__(self, request):
 
 
1738
        self.request = request
 
 
1741
class NotConflicted(BzrError):
 
 
1743
    _fmt = "File %(filename)s is not conflicted."
 
 
1745
    def __init__(self, filename):
 
 
1746
        BzrError.__init__(self)
 
 
1747
        self.filename = filename
 
 
1750
class MediumNotConnected(InternalBzrError):
 
 
1752
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1754
    def __init__(self, medium):
 
 
1755
        self.medium = medium
 
 
1758
class MustUseDecorated(Exception):
 
 
1760
    _fmt = "A decorating function has requested its original command be used."
 
 
1763
class NoBundleFound(BzrError):
 
 
1765
    _fmt = 'No bundle was found in "%(filename)s".'
 
 
1767
    def __init__(self, filename):
 
 
1768
        BzrError.__init__(self)
 
 
1769
        self.filename = filename
 
 
1772
class BundleNotSupported(BzrError):
 
 
1774
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1776
    def __init__(self, version, msg):
 
 
1777
        BzrError.__init__(self)
 
 
1778
        self.version = version
 
 
1782
class MissingText(BzrError):
 
 
1784
    _fmt = ("Branch %(base)s is missing revision"
 
 
1785
            " %(text_revision)s of %(file_id)s")
 
 
1787
    def __init__(self, branch, text_revision, file_id):
 
 
1788
        BzrError.__init__(self)
 
 
1789
        self.branch = branch
 
 
1790
        self.base = branch.base
 
 
1791
        self.text_revision = text_revision
 
 
1792
        self.file_id = file_id
 
 
1795
class DuplicateFileId(BzrError):
 
 
1797
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1799
    def __init__(self, file_id, entry):
 
 
1800
        BzrError.__init__(self)
 
 
1801
        self.file_id = file_id
 
 
1805
class DuplicateKey(BzrError):
 
 
1807
    _fmt = "Key %(key)s is already present in map"
 
 
1810
class DuplicateHelpPrefix(BzrError):
 
 
1812
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
 
1814
    def __init__(self, prefix):
 
 
1815
        self.prefix = prefix
 
 
1818
class MalformedTransform(BzrError):
 
 
1820
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1823
class NoFinalPath(BzrError):
 
 
1825
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1826
            "file-id: %(file_id)r\n"
 
 
1827
            "root trans-id: %(root_trans_id)r\n")
 
 
1829
    def __init__(self, trans_id, transform):
 
 
1830
        self.trans_id = trans_id
 
 
1831
        self.file_id = transform.final_file_id(trans_id)
 
 
1832
        self.root_trans_id = transform.root
 
 
1835
class BzrBadParameter(InternalBzrError):
 
 
1837
    _fmt = "Bad parameter: %(param)r"
 
 
1839
    # This exception should never be thrown, but it is a base class for all
 
 
1840
    # parameter-to-function errors.
 
 
1842
    def __init__(self, param):
 
 
1843
        BzrError.__init__(self)
 
 
1847
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1849
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1852
class ReusingTransform(BzrError):
 
 
1854
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1857
class CantMoveRoot(BzrError):
 
 
1859
    _fmt = "Moving the root directory is not supported at this time"
 
 
1862
class BzrMoveFailedError(BzrError):
 
 
1864
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1866
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1867
        BzrError.__init__(self)
 
 
1869
            self.extra = ': ' + str(extra)
 
 
1873
        has_from = len(from_path) > 0
 
 
1874
        has_to = len(to_path) > 0
 
 
1876
            self.from_path = osutils.splitpath(from_path)[-1]
 
 
1881
            self.to_path = osutils.splitpath(to_path)[-1]
 
 
1886
        if has_from and has_to:
 
 
1887
            self.operator = " =>"
 
 
1889
            self.from_path = "from " + from_path
 
 
1891
            self.operator = "to"
 
 
1893
            self.operator = "file"
 
 
1896
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1898
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1900
    def __init__(self, from_path, to_path, extra=None):
 
 
1901
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1903
class BzrRemoveChangedFilesError(BzrError):
 
 
1904
    """Used when user is trying to remove changed files."""
 
 
1906
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
 
1907
        "%(changes_as_text)s"
 
 
1908
        "Use --keep to not delete them, or --force to delete them regardless.")
 
 
1910
    def __init__(self, tree_delta):
 
 
1911
        BzrError.__init__(self)
 
 
1912
        self.changes_as_text = tree_delta.get_changes_as_text()
 
 
1913
        #self.paths_as_string = '\n'.join(changed_files)
 
 
1914
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
 
1917
class BzrBadParameterNotString(BzrBadParameter):
 
 
1919
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1922
class BzrBadParameterMissing(BzrBadParameter):
 
 
1924
    _fmt = "Parameter $(param)s is required but not present."
 
 
1927
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1929
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1930
            " only byte-strings are permitted.")
 
 
1933
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1935
    _fmt = "Parameter %(param)s contains a newline."
 
 
1938
class DependencyNotPresent(BzrError):
 
 
1940
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1942
    def __init__(self, library, error):
 
 
1943
        BzrError.__init__(self, library=library, error=error)
 
 
1946
class ParamikoNotPresent(DependencyNotPresent):
 
 
1948
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1950
    def __init__(self, error):
 
 
1951
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
1954
class PointlessMerge(BzrError):
 
 
1956
    _fmt = "Nothing to merge."
 
 
1959
class UninitializableFormat(BzrError):
 
 
1961
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
1963
    def __init__(self, format):
 
 
1964
        BzrError.__init__(self)
 
 
1965
        self.format = format
 
 
1968
class BadConversionTarget(BzrError):
 
 
1970
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
1972
    def __init__(self, problem, format):
 
 
1973
        BzrError.__init__(self)
 
 
1974
        self.problem = problem
 
 
1975
        self.format = format
 
 
1978
class NoDiffFound(BzrError):
 
 
1980
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
 
1982
    def __init__(self, path):
 
 
1983
        BzrError.__init__(self, path)
 
 
1986
class ExecutableMissing(BzrError):
 
 
1988
    _fmt = "%(exe_name)s could not be found on this machine"
 
 
1990
    def __init__(self, exe_name):
 
 
1991
        BzrError.__init__(self, exe_name=exe_name)
 
 
1994
class NoDiff(BzrError):
 
 
1996
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
1998
    def __init__(self, msg):
 
 
1999
        BzrError.__init__(self, msg=msg)
 
 
2002
class NoDiff3(BzrError):
 
 
2004
    _fmt = "Diff3 is not installed on this machine."
 
 
2007
class ExistingContent(BzrError):
 
 
2008
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
 
2010
    _fmt = "The content being inserted is already present."
 
 
2013
class ExistingLimbo(BzrError):
 
 
2015
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2016
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2017
    keep, and delete it when you are done."""
 
 
2019
    def __init__(self, limbo_dir):
 
 
2020
       BzrError.__init__(self)
 
 
2021
       self.limbo_dir = limbo_dir
 
 
2024
class ExistingPendingDeletion(BzrError):
 
 
2026
    _fmt = """This tree contains left-over files from a failed operation.
 
 
2027
    Please examine %(pending_deletion)s to see if it contains any files you
 
 
2028
    wish to keep, and delete it when you are done."""
 
 
2030
    def __init__(self, pending_deletion):
 
 
2031
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2034
class ImmortalLimbo(BzrError):
 
 
2036
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
 
2037
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
2038
    keep, and delete it when you are done."""
 
 
2040
    def __init__(self, limbo_dir):
 
 
2041
       BzrError.__init__(self)
 
 
2042
       self.limbo_dir = limbo_dir
 
 
2045
class ImmortalPendingDeletion(BzrError):
 
 
2047
    _fmt = ("Unable to delete transform temporary directory "
 
 
2048
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
 
2049
    "contains any files you wish to keep, and delete it when you are done.")
 
 
2051
    def __init__(self, pending_deletion):
 
 
2052
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2055
class OutOfDateTree(BzrError):
 
 
2057
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
2059
    def __init__(self, tree):
 
 
2060
        BzrError.__init__(self)
 
 
2064
class PublicBranchOutOfDate(BzrError):
 
 
2066
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
2069
    def __init__(self, public_location, revstring):
 
 
2070
        import bzrlib.urlutils as urlutils
 
 
2071
        public_location = urlutils.unescape_for_display(public_location,
 
 
2073
        BzrError.__init__(self, public_location=public_location,
 
 
2074
                          revstring=revstring)
 
 
2077
class MergeModifiedFormatError(BzrError):
 
 
2079
    _fmt = "Error in merge modified format"
 
 
2082
class ConflictFormatError(BzrError):
 
 
2084
    _fmt = "Format error in conflict listings"
 
 
2087
class CorruptDirstate(BzrError):
 
 
2089
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
 
2090
            "Error: %(description)s")
 
 
2092
    def __init__(self, dirstate_path, description):
 
 
2093
        BzrError.__init__(self)
 
 
2094
        self.dirstate_path = dirstate_path
 
 
2095
        self.description = description
 
 
2098
class CorruptRepository(BzrError):
 
 
2100
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
2101
            "Please run bzr reconcile on this repository.")
 
 
2103
    def __init__(self, repo):
 
 
2104
        BzrError.__init__(self)
 
 
2105
        self.repo_path = repo.bzrdir.root_transport.base
 
 
2108
class InconsistentDelta(BzrError):
 
 
2109
    """Used when we get a delta that is not valid."""
 
 
2111
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
 
2112
            " %(file_id)r\nreason: %(reason)s")
 
 
2114
    def __init__(self, path, file_id, reason):
 
 
2115
        BzrError.__init__(self)
 
 
2117
        self.file_id = file_id
 
 
2118
        self.reason = reason
 
 
2121
class UpgradeRequired(BzrError):
 
 
2123
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
2125
    def __init__(self, path):
 
 
2126
        BzrError.__init__(self)
 
 
2130
class RepositoryUpgradeRequired(UpgradeRequired):
 
 
2132
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
 
2135
class LocalRequiresBoundBranch(BzrError):
 
 
2137
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
2140
class MissingProgressBarFinish(BzrError):
 
 
2142
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
2145
class InvalidProgressBarType(BzrError):
 
 
2147
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
2148
            " is not a supported type Select one of: %(valid_types)s")
 
 
2150
    def __init__(self, bar_type, valid_types):
 
 
2151
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
2154
class UnsupportedOperation(BzrError):
 
 
2156
    _fmt = ("The method %(mname)s is not supported on"
 
 
2157
            " objects of type %(tname)s.")
 
 
2159
    def __init__(self, method, method_self):
 
 
2160
        self.method = method
 
 
2161
        self.mname = method.__name__
 
 
2162
        self.tname = type(method_self).__name__
 
 
2165
class CannotSetRevisionId(UnsupportedOperation):
 
 
2166
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
2169
class NonAsciiRevisionId(UnsupportedOperation):
 
 
2170
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
2175
class BinaryFile(BzrError):
 
 
2177
    _fmt = "File is binary but should be text."
 
 
2180
class IllegalPath(BzrError):
 
 
2182
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
2184
    def __init__(self, path):
 
 
2185
        BzrError.__init__(self)
 
 
2189
class TestamentMismatch(BzrError):
 
 
2191
    _fmt = """Testament did not match expected value.
 
 
2192
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
2195
    def __init__(self, revision_id, expected, measured):
 
 
2196
        self.revision_id = revision_id
 
 
2197
        self.expected = expected
 
 
2198
        self.measured = measured
 
 
2201
class NotABundle(BzrError):
 
 
2203
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
2205
    def __init__(self, text):
 
 
2206
        BzrError.__init__(self)
 
 
2210
class BadBundle(BzrError): 
 
 
2212
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
2214
    def __init__(self, text):
 
 
2215
        BzrError.__init__(self)
 
 
2219
class MalformedHeader(BadBundle): 
 
 
2221
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
2224
class MalformedPatches(BadBundle): 
 
 
2226
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
2229
class MalformedFooter(BadBundle): 
 
 
2231
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
2234
class UnsupportedEOLMarker(BadBundle):
 
 
2236
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
2239
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
2240
        # but for this there is not
 
 
2241
        BzrError.__init__(self)
 
 
2244
class IncompatibleBundleFormat(BzrError):
 
 
2246
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
2248
    def __init__(self, bundle_format, other):
 
 
2249
        BzrError.__init__(self)
 
 
2250
        self.bundle_format = bundle_format
 
 
2254
class BadInventoryFormat(BzrError):
 
 
2256
    _fmt = "Root class for inventory serialization errors"
 
 
2259
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
2261
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
2263
    def __init__(self, msg):
 
 
2264
        BadInventoryFormat.__init__(self, msg=msg)
 
 
2267
class RootNotRich(BzrError):
 
 
2269
    _fmt = """This operation requires rich root data storage"""
 
 
2272
class NoSmartMedium(InternalBzrError):
 
 
2274
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
2276
    def __init__(self, transport):
 
 
2277
        self.transport = transport
 
 
2280
class NoSmartServer(NotBranchError):
 
 
2282
    _fmt = "No smart server available at %(url)s"
 
 
2284
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
 
2285
    def __init__(self, url):
 
 
2289
class UnknownSSH(BzrError):
 
 
2291
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
2293
    def __init__(self, vendor):
 
 
2294
        BzrError.__init__(self)
 
 
2295
        self.vendor = vendor
 
 
2298
class SSHVendorNotFound(BzrError):
 
 
2300
    _fmt = ("Don't know how to handle SSH connections."
 
 
2301
            " Please set BZR_SSH environment variable.")
 
 
2304
class GhostRevisionsHaveNoRevno(BzrError):
 
 
2305
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
 
2307
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
 
2308
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
 
2310
    def __init__(self, revision_id, ghost_revision_id):
 
 
2311
        self.revision_id = revision_id
 
 
2312
        self.ghost_revision_id = ghost_revision_id
 
 
2315
class GhostRevisionUnusableHere(BzrError):
 
 
2317
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
2319
    def __init__(self, revision_id):
 
 
2320
        BzrError.__init__(self)
 
 
2321
        self.revision_id = revision_id
 
 
2324
class IllegalUseOfScopeReplacer(InternalBzrError):
 
 
2326
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
2327
            " %(msg)s%(extra)s")
 
 
2329
    def __init__(self, name, msg, extra=None):
 
 
2330
        BzrError.__init__(self)
 
 
2334
            self.extra = ': ' + str(extra)
 
 
2339
class InvalidImportLine(InternalBzrError):
 
 
2341
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
2343
    def __init__(self, text, msg):
 
 
2344
        BzrError.__init__(self)
 
 
2349
class ImportNameCollision(InternalBzrError):
 
 
2351
    _fmt = ("Tried to import an object to the same name as"
 
 
2352
            " an existing object. %(name)s")
 
 
2354
    def __init__(self, name):
 
 
2355
        BzrError.__init__(self)
 
 
2359
class NotAMergeDirective(BzrError):
 
 
2360
    """File starting with %(firstline)r is not a merge directive"""
 
 
2361
    def __init__(self, firstline):
 
 
2362
        BzrError.__init__(self, firstline=firstline)
 
 
2365
class NoMergeSource(BzrError):
 
 
2366
    """Raise if no merge source was specified for a merge directive"""
 
 
2368
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
2372
class IllegalMergeDirectivePayload(BzrError):
 
 
2373
    """A merge directive contained something other than a patch or bundle"""
 
 
2375
    _fmt = "Bad merge directive payload %(start)r"
 
 
2377
    def __init__(self, start):
 
 
2382
class PatchVerificationFailed(BzrError):
 
 
2383
    """A patch from a merge directive could not be verified"""
 
 
2385
    _fmt = "Preview patch does not match requested changes."
 
 
2388
class PatchMissing(BzrError):
 
 
2389
    """Raise a patch type was specified but no patch supplied"""
 
 
2391
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
 
2393
    def __init__(self, patch_type):
 
 
2394
        BzrError.__init__(self)
 
 
2395
        self.patch_type = patch_type
 
 
2398
class TargetNotBranch(BzrError):
 
 
2399
    """A merge directive's target branch is required, but isn't a branch"""
 
 
2401
    _fmt = ("Your branch does not have all of the revisions required in "
 
 
2402
            "order to merge this merge directive and the target "
 
 
2403
            "location specified in the merge directive is not a branch: "
 
 
2406
    def __init__(self, location):
 
 
2407
        BzrError.__init__(self)
 
 
2408
        self.location = location
 
 
2411
class UnsupportedInventoryKind(BzrError):
 
 
2413
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
2415
    def __init__(self, kind):
 
 
2419
class BadSubsumeSource(BzrError):
 
 
2421
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
 
2423
    def __init__(self, tree, other_tree, reason):
 
 
2425
        self.other_tree = other_tree
 
 
2426
        self.reason = reason
 
 
2429
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
2431
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
2433
    def __init__(self, other_tree):
 
 
2434
        self.other_tree = other_tree
 
 
2437
class BadReferenceTarget(InternalBzrError):
 
 
2439
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
 
2442
    def __init__(self, tree, other_tree, reason):
 
 
2444
        self.other_tree = other_tree
 
 
2445
        self.reason = reason
 
 
2448
class NoSuchTag(BzrError):
 
 
2450
    _fmt = "No such tag: %(tag_name)s"
 
 
2452
    def __init__(self, tag_name):
 
 
2453
        self.tag_name = tag_name
 
 
2456
class TagsNotSupported(BzrError):
 
 
2458
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2459
            " you may be able to use bzr upgrade.")
 
 
2461
    def __init__(self, branch):
 
 
2462
        self.branch = branch
 
 
2465
class TagAlreadyExists(BzrError):
 
 
2467
    _fmt = "Tag %(tag_name)s already exists."
 
 
2469
    def __init__(self, tag_name):
 
 
2470
        self.tag_name = tag_name
 
 
2473
class MalformedBugIdentifier(BzrError):
 
 
2475
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
 
2477
    def __init__(self, bug_id, reason):
 
 
2478
        self.bug_id = bug_id
 
 
2479
        self.reason = reason
 
 
2482
class InvalidBugTrackerURL(BzrError):
 
 
2484
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
 
2485
            "contain {id}: %(url)s")
 
 
2487
    def __init__(self, abbreviation, url):
 
 
2488
        self.abbreviation = abbreviation
 
 
2492
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2494
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2497
    def __init__(self, abbreviation, branch):
 
 
2498
        self.abbreviation = abbreviation
 
 
2499
        self.branch = branch
 
 
2502
class UnexpectedSmartServerResponse(BzrError):
 
 
2504
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2506
    def __init__(self, response_tuple):
 
 
2507
        self.response_tuple = response_tuple
 
 
2510
class ErrorFromSmartServer(BzrError):
 
 
2511
    """An error was received from a smart server.
 
 
2513
    :seealso: UnknownErrorFromSmartServer
 
 
2516
    _fmt = "Error received from smart server: %(error_tuple)r"
 
 
2518
    internal_error = True
 
 
2520
    def __init__(self, error_tuple):
 
 
2521
        self.error_tuple = error_tuple
 
 
2523
            self.error_verb = error_tuple[0]
 
 
2525
            self.error_verb = None
 
 
2526
        self.error_args = error_tuple[1:]
 
 
2529
class UnknownErrorFromSmartServer(BzrError):
 
 
2530
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
 
2533
    This is distinct from ErrorFromSmartServer so that it is possible to
 
 
2534
    distinguish between the following two cases:
 
 
2535
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
 
2536
        and so should provoke a traceback to the user.
 
 
2537
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
 
2538
        translated.  This is probably because the server sent us garbage, and
 
 
2539
        should not provoke a traceback.
 
 
2542
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
 
2544
    internal_error = False
 
 
2546
    def __init__(self, error_from_smart_server):
 
 
2549
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
 
2551
        self.error_from_smart_server = error_from_smart_server
 
 
2552
        self.error_tuple = error_from_smart_server.error_tuple
 
 
2555
class ContainerError(BzrError):
 
 
2556
    """Base class of container errors."""
 
 
2559
class UnknownContainerFormatError(ContainerError):
 
 
2561
    _fmt = "Unrecognised container format: %(container_format)r"
 
 
2563
    def __init__(self, container_format):
 
 
2564
        self.container_format = container_format
 
 
2567
class UnexpectedEndOfContainerError(ContainerError):
 
 
2569
    _fmt = "Unexpected end of container stream"
 
 
2572
class UnknownRecordTypeError(ContainerError):
 
 
2574
    _fmt = "Unknown record type: %(record_type)r"
 
 
2576
    def __init__(self, record_type):
 
 
2577
        self.record_type = record_type
 
 
2580
class InvalidRecordError(ContainerError):
 
 
2582
    _fmt = "Invalid record: %(reason)s"
 
 
2584
    def __init__(self, reason):
 
 
2585
        self.reason = reason
 
 
2588
class ContainerHasExcessDataError(ContainerError):
 
 
2590
    _fmt = "Container has data after end marker: %(excess)r"
 
 
2592
    def __init__(self, excess):
 
 
2593
        self.excess = excess
 
 
2596
class DuplicateRecordNameError(ContainerError):
 
 
2598
    _fmt = "Container has multiple records with the same name: %(name)s"
 
 
2600
    def __init__(self, name):
 
 
2604
class NoDestinationAddress(InternalBzrError):
 
 
2606
    _fmt = "Message does not have a destination address."
 
 
2609
class RepositoryDataStreamError(BzrError):
 
 
2611
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
 
2613
    def __init__(self, reason):
 
 
2614
        self.reason = reason
 
 
2617
class SMTPError(BzrError):
 
 
2619
    _fmt = "SMTP error: %(error)s"
 
 
2621
    def __init__(self, error):
 
 
2625
class NoMessageSupplied(BzrError):
 
 
2627
    _fmt = "No message supplied."
 
 
2630
class NoMailAddressSpecified(BzrError):
 
 
2632
    _fmt = "No mail-to address specified."
 
 
2635
class UnknownMailClient(BzrError):
 
 
2637
    _fmt = "Unknown mail client: %(mail_client)s"
 
 
2639
    def __init__(self, mail_client):
 
 
2640
        BzrError.__init__(self, mail_client=mail_client)
 
 
2643
class MailClientNotFound(BzrError):
 
 
2645
    _fmt = "Unable to find mail client with the following names:"\
 
 
2646
        " %(mail_command_list_string)s"
 
 
2648
    def __init__(self, mail_command_list):
 
 
2649
        mail_command_list_string = ', '.join(mail_command_list)
 
 
2650
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
 
2651
                          mail_command_list_string=mail_command_list_string)
 
 
2653
class SMTPConnectionRefused(SMTPError):
 
 
2655
    _fmt = "SMTP connection to %(host)s refused"
 
 
2657
    def __init__(self, error, host):
 
 
2662
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
 
2664
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
 
2667
class BzrDirError(BzrError):
 
 
2669
    def __init__(self, bzrdir):
 
 
2670
        import bzrlib.urlutils as urlutils
 
 
2671
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
 
2673
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
 
2676
class UnsyncedBranches(BzrDirError):
 
 
2678
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
 
2679
            " bzr help sync-for-reconfigure.")
 
 
2681
    def __init__(self, bzrdir, target_branch):
 
 
2682
        BzrDirError.__init__(self, bzrdir)
 
 
2683
        import bzrlib.urlutils as urlutils
 
 
2684
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
 
2688
class AlreadyBranch(BzrDirError):
 
 
2690
    _fmt = "'%(display_url)s' is already a branch."
 
 
2693
class AlreadyTree(BzrDirError):
 
 
2695
    _fmt = "'%(display_url)s' is already a tree."
 
 
2698
class AlreadyCheckout(BzrDirError):
 
 
2700
    _fmt = "'%(display_url)s' is already a checkout."
 
 
2703
class AlreadyLightweightCheckout(BzrDirError):
 
 
2705
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
 
2708
class AlreadyUsingShared(BzrDirError):
 
 
2710
    _fmt = "'%(display_url)s' is already using a shared repository."
 
 
2713
class AlreadyStandalone(BzrDirError):
 
 
2715
    _fmt = "'%(display_url)s' is already standalone."
 
 
2718
class ReconfigurationNotSupported(BzrDirError):
 
 
2720
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
 
2723
class NoBindLocation(BzrDirError):
 
 
2725
    _fmt = "No location could be found to bind to at %(display_url)s."
 
 
2728
class UncommittedChanges(BzrError):
 
 
2730
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
 
2732
    def __init__(self, tree):
 
 
2733
        import bzrlib.urlutils as urlutils
 
 
2734
        display_url = urlutils.unescape_for_display(
 
 
2735
            tree.bzrdir.root_transport.base, 'ascii')
 
 
2736
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
 
2739
class MissingTemplateVariable(BzrError):
 
 
2741
    _fmt = 'Variable {%(name)s} is not available.'
 
 
2743
    def __init__(self, name):
 
 
2747
class NoTemplate(BzrError):
 
 
2749
    _fmt = 'No template specified.'
 
 
2752
class UnableCreateSymlink(BzrError):
 
 
2754
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
 
2756
    def __init__(self, path=None):
 
 
2760
                path_str = repr(str(path))
 
 
2761
            except UnicodeEncodeError:
 
 
2762
                path_str = repr(path)
 
 
2764
        self.path_str = path_str
 
 
2767
class UnsupportedTimezoneFormat(BzrError):
 
 
2769
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
 
2770
            'options are "utc", "original", "local".')
 
 
2772
    def __init__(self, timezone):
 
 
2773
        self.timezone = timezone
 
 
2776
class CommandAvailableInPlugin(StandardError):
 
 
2778
    internal_error = False
 
 
2780
    def __init__(self, cmd_name, plugin_metadata, provider):
 
 
2782
        self.plugin_metadata = plugin_metadata
 
 
2783
        self.cmd_name = cmd_name
 
 
2784
        self.provider = provider
 
 
2788
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
 
2789
                'However, the following official plugin provides this command: %s\n'
 
 
2790
                'You can install it by going to: %s'
 
 
2791
                % (self.cmd_name, self.plugin_metadata['name'], 
 
 
2792
                    self.plugin_metadata['url']))
 
 
2797
class NoPluginAvailable(BzrError):
 
 
2801
class NotATerminal(BzrError):
 
 
2803
    _fmt = 'Unable to ask for a password without real terminal.'
 
 
2806
class UnableEncodePath(BzrError):
 
 
2808
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
 
2809
            'user encoding %(user_encoding)s')
 
 
2811
    def __init__(self, path, kind):
 
 
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):