1
# Copyright (C) 2005, 2006, 2007 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
class BzrError(StandardError):
 
 
49
    Base class for errors raised by bzrlib.
 
 
51
    :cvar internal_error: if True this was probably caused by a bzr bug and
 
 
52
    should be displayed with a traceback; if False (or absent) this was
 
 
53
    probably a user or environment error and they don't need the gory details.
 
 
54
    (That can be overridden by -Derror on the command line.)
 
 
56
    :cvar _fmt: Format string to display the error; this is expanded
 
 
57
    by the instance's dict.
 
 
60
    internal_error = False
 
 
62
    def __init__(self, msg=None, **kwds):
 
 
63
        """Construct a new BzrError.
 
 
65
        There are two alternative forms for constructing these objects.
 
 
66
        Either a preformatted string may be passed, or a set of named
 
 
67
        arguments can be given.  The first is for generic "user" errors which
 
 
68
        are not intended to be caught and so do not need a specific subclass.
 
 
69
        The second case is for use with subclasses that provide a _fmt format
 
 
70
        string to print the arguments.  
 
 
72
        Keyword arguments are taken as parameters to the error, which can 
 
 
73
        be inserted into the format string template.  It's recommended 
 
 
74
        that subclasses override the __init__ method to require specific 
 
 
77
        :param msg: If given, this is the literal complete text for the error,
 
 
78
        not subject to expansion.
 
 
80
        StandardError.__init__(self)
 
 
82
            # I was going to deprecate this, but it actually turns out to be
 
 
83
            # quite handy - mbp 20061103.
 
 
84
            self._preformatted_string = msg
 
 
86
            self._preformatted_string = None
 
 
87
            for key, value in kwds.items():
 
 
88
                setattr(self, key, value)
 
 
91
        s = getattr(self, '_preformatted_string', None)
 
 
93
            # contains a preformatted message; must be cast to plain str
 
 
96
            fmt = self._get_format_string()
 
 
98
                s = fmt % self.__dict__
 
 
99
                # __str__() should always return a 'str' object
 
 
100
                # never a 'unicode' object.
 
 
101
                if isinstance(s, unicode):
 
 
102
                    return s.encode('utf8')
 
 
104
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
 
105
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
 
106
                % (self.__class__.__name__,
 
 
108
                   getattr(self, '_fmt', None),
 
 
111
    def _get_format_string(self):
 
 
112
        """Return format string for this exception or None"""
 
 
113
        fmt = getattr(self, '_fmt', None)
 
 
116
        fmt = getattr(self, '__doc__', None)
 
 
118
            symbol_versioning.warn("%s uses its docstring as a format, "
 
 
119
                    "it should use _fmt instead" % self.__class__.__name__,
 
 
122
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
 
123
            % (self.__class__.__name__,
 
 
125
               getattr(self, '_fmt', None),
 
 
129
class BzrNewError(BzrError):
 
 
130
    """Deprecated error base class."""
 
 
131
    # base classes should override the docstring with their human-
 
 
132
    # readable explanation
 
 
134
    def __init__(self, *args, **kwds):
 
 
135
        # XXX: Use the underlying BzrError to always generate the args
 
 
136
        # attribute if it doesn't exist.  We can't use super here, because
 
 
137
        # exceptions are old-style classes in python2.4 (but new in 2.5).
 
 
139
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
 
140
             'please convert %s to use BzrError instead'
 
 
141
             % self.__class__.__name__,
 
 
144
        BzrError.__init__(self, *args)
 
 
145
        for key, value in kwds.items():
 
 
146
            setattr(self, key, value)
 
 
150
            # __str__() should always return a 'str' object
 
 
151
            # never a 'unicode' object.
 
 
152
            s = self.__doc__ % self.__dict__
 
 
153
            if isinstance(s, unicode):
 
 
154
                return s.encode('utf8')
 
 
156
        except (TypeError, NameError, ValueError, KeyError), e:
 
 
157
            return 'Unprintable exception %s(%r): %r' \
 
 
158
                % (self.__class__.__name__,
 
 
162
class AlreadyBuilding(BzrError):
 
 
164
    _fmt = "The tree builder is already building a tree."
 
 
167
class BzrCheckError(BzrError):
 
 
169
    _fmt = "Internal check failed: %(message)s"
 
 
171
    internal_error = True
 
 
173
    def __init__(self, message):
 
 
174
        BzrError.__init__(self)
 
 
175
        self.message = message
 
 
178
class DisabledMethod(BzrError):
 
 
180
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
 
182
    internal_error = True
 
 
184
    def __init__(self, class_name):
 
 
185
        BzrError.__init__(self)
 
 
186
        self.class_name = class_name
 
 
189
class IncompatibleAPI(BzrError):
 
 
191
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
 
192
        'It supports versions "%(minimum)s" to "%(current)s".'
 
 
194
    def __init__(self, api, wanted, minimum, current):
 
 
197
        self.minimum = minimum
 
 
198
        self.current = current
 
 
201
class InvalidEntryName(BzrError):
 
 
203
    _fmt = "Invalid entry name: %(name)s"
 
 
205
    internal_error = True
 
 
207
    def __init__(self, name):
 
 
208
        BzrError.__init__(self)
 
 
212
class InvalidRevisionNumber(BzrError):
 
 
214
    _fmt = "Invalid revision number %(revno)s"
 
 
216
    def __init__(self, revno):
 
 
217
        BzrError.__init__(self)
 
 
221
class InvalidRevisionId(BzrError):
 
 
223
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
 
225
    def __init__(self, revision_id, branch):
 
 
226
        # branch can be any string or object with __str__ defined
 
 
227
        BzrError.__init__(self)
 
 
228
        self.revision_id = revision_id
 
 
231
class ReservedId(BzrError):
 
 
233
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
 
235
    def __init__(self, revision_id):
 
 
236
        self.revision_id = revision_id
 
 
239
class NoHelpTopic(BzrError):
 
 
241
    _fmt = ("No help could be found for '%(topic)s'. "
 
 
242
        "Please use 'bzr help topics' to obtain a list of topics.")
 
 
244
    def __init__(self, topic):
 
 
248
class NoSuchId(BzrError):
 
 
250
    _fmt = "The file id %(file_id)s is not present in the tree %(tree)s."
 
 
252
    def __init__(self, tree, file_id):
 
 
253
        BzrError.__init__(self)
 
 
254
        self.file_id = file_id
 
 
258
class InventoryModified(BzrError):
 
 
260
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
 
261
            " so a clean inventory cannot be read without data loss.")
 
 
263
    internal_error = True
 
 
265
    def __init__(self, tree):
 
 
269
class NoWorkingTree(BzrError):
 
 
271
    _fmt = "No WorkingTree exists for %(base)s."
 
 
273
    def __init__(self, base):
 
 
274
        BzrError.__init__(self)
 
 
278
class NotBuilding(BzrError):
 
 
280
    _fmt = "Not currently building a tree."
 
 
283
class NotLocalUrl(BzrError):
 
 
285
    _fmt = "%(url)s is not a local path."
 
 
287
    def __init__(self, url):
 
 
291
class WorkingTreeAlreadyPopulated(BzrError):
 
 
293
    _fmt = """Working tree already populated in %(base)s"""
 
 
295
    internal_error = True
 
 
297
    def __init__(self, base):
 
 
300
class BzrCommandError(BzrError):
 
 
301
    """Error from user command"""
 
 
303
    internal_error = False
 
 
305
    # Error from malformed user command; please avoid raising this as a
 
 
306
    # generic exception not caused by user input.
 
 
308
    # I think it's a waste of effort to differentiate between errors that
 
 
309
    # are not intended to be caught anyway.  UI code need not subclass
 
 
310
    # BzrCommandError, and non-UI code should not throw a subclass of
 
 
311
    # BzrCommandError.  ADHB 20051211
 
 
312
    def __init__(self, msg):
 
 
313
        # Object.__str__() must return a real string
 
 
314
        # returning a Unicode string is a python error.
 
 
315
        if isinstance(msg, unicode):
 
 
316
            self.msg = msg.encode('utf8')
 
 
324
class NotWriteLocked(BzrError):
 
 
326
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
 
328
    def __init__(self, not_locked):
 
 
329
        self.not_locked = not_locked
 
 
332
class BzrOptionError(BzrCommandError):
 
 
334
    _fmt = "Error in command line options"
 
 
337
class BadOptionValue(BzrError):
 
 
339
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
 
341
    def __init__(self, name, value):
 
 
342
        BzrError.__init__(self, name=name, value=value)
 
 
345
class StrictCommitFailed(BzrError):
 
 
347
    _fmt = "Commit refused because there are unknown files in the tree"
 
 
350
# XXX: Should be unified with TransportError; they seem to represent the
 
 
352
class PathError(BzrError):
 
 
354
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
 
356
    def __init__(self, path, extra=None):
 
 
357
        BzrError.__init__(self)
 
 
360
            self.extra = ': ' + str(extra)
 
 
365
class NoSuchFile(PathError):
 
 
367
    _fmt = "No such file: %(path)r%(extra)s"
 
 
370
class FileExists(PathError):
 
 
372
    _fmt = "File exists: %(path)r%(extra)s"
 
 
375
class RenameFailedFilesExist(BzrError):
 
 
376
    """Used when renaming and both source and dest exist."""
 
 
378
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
 
381
    def __init__(self, source, dest, extra=None):
 
 
382
        BzrError.__init__(self)
 
 
383
        self.source = str(source)
 
 
384
        self.dest = str(dest)
 
 
386
            self.extra = ' ' + str(extra)
 
 
391
class NotADirectory(PathError):
 
 
393
    _fmt = "%(path)r is not a directory %(extra)s"
 
 
396
class NotInWorkingDirectory(PathError):
 
 
398
    _fmt = "%(path)r is not in the working directory %(extra)s"
 
 
401
class DirectoryNotEmpty(PathError):
 
 
403
    _fmt = "Directory not empty: %(path)r%(extra)s"
 
 
406
class ReadingCompleted(BzrError):
 
 
408
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
 
409
            "called upon it - the request has been completed and no more "
 
 
412
    internal_error = True
 
 
414
    def __init__(self, request):
 
 
415
        self.request = request
 
 
418
class ResourceBusy(PathError):
 
 
420
    _fmt = "Device or resource busy: %(path)r%(extra)s"
 
 
423
class PermissionDenied(PathError):
 
 
425
    _fmt = "Permission denied: %(path)r%(extra)s"
 
 
428
class InvalidURL(PathError):
 
 
430
    _fmt = "Invalid url supplied to transport: %(path)r%(extra)s"
 
 
433
class InvalidURLJoin(PathError):
 
 
435
    _fmt = "Invalid URL join request: %(args)s%(extra)s"
 
 
437
    def __init__(self, msg, base, args):
 
 
438
        PathError.__init__(self, base, msg)
 
 
439
        self.args = [base] + list(args)
 
 
442
class UnknownHook(BzrError):
 
 
444
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
 
446
    def __init__(self, hook_type, hook_name):
 
 
447
        BzrError.__init__(self)
 
 
448
        self.type = hook_type
 
 
449
        self.hook = hook_name
 
 
452
class UnsupportedProtocol(PathError):
 
 
454
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
 
456
    def __init__(self, url, extra):
 
 
457
        PathError.__init__(self, url, extra=extra)
 
 
460
class ShortReadvError(PathError):
 
 
462
    _fmt = ("readv() read %(actual)s bytes rather than %(length)s bytes"
 
 
463
            " at %(offset)s for %(path)s%(extra)s")
 
 
465
    internal_error = True
 
 
467
    def __init__(self, path, offset, length, actual, extra=None):
 
 
468
        PathError.__init__(self, path, extra=extra)
 
 
474
class PathNotChild(BzrError):
 
 
476
    _fmt = "Path %(path)r is not a child of path %(base)r%(extra)s"
 
 
478
    internal_error = True
 
 
480
    def __init__(self, path, base, extra=None):
 
 
481
        BzrError.__init__(self)
 
 
485
            self.extra = ': ' + str(extra)
 
 
490
class InvalidNormalization(PathError):
 
 
492
    _fmt = "Path %(path)r is not unicode normalized"
 
 
495
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
 
496
# the exception object is a bit undesirable.
 
 
497
# TODO: Probably this behavior of should be a common superclass 
 
 
498
class NotBranchError(PathError):
 
 
500
    _fmt = "Not a branch: %(path)s"
 
 
502
    def __init__(self, path):
 
 
503
       import bzrlib.urlutils as urlutils
 
 
504
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
 
507
class NoSubmitBranch(PathError):
 
 
509
    _fmt = 'No submit branch available for branch "%(path)s"'
 
 
511
    def __init__(self, branch):
 
 
512
       import bzrlib.urlutils as urlutils
 
 
513
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
 
516
class AlreadyBranchError(PathError):
 
 
518
    _fmt = "Already a branch: %(path)s."
 
 
521
class BranchExistsWithoutWorkingTree(PathError):
 
 
523
    _fmt = "Directory contains a branch, but no working tree \
 
 
524
(use bzr checkout if you wish to build a working tree): %(path)s"
 
 
527
class AtomicFileAlreadyClosed(PathError):
 
 
529
    _fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
 
 
532
    def __init__(self, path, function):
 
 
533
        PathError.__init__(self, path=path, extra=None)
 
 
534
        self.function = function
 
 
537
class InaccessibleParent(PathError):
 
 
539
    _fmt = ("Parent not accessible given base %(base)s and"
 
 
540
            " relative path %(path)s")
 
 
542
    def __init__(self, path, base):
 
 
543
        PathError.__init__(self, path)
 
 
547
class NoRepositoryPresent(BzrError):
 
 
549
    _fmt = "No repository present: %(path)r"
 
 
550
    def __init__(self, bzrdir):
 
 
551
        BzrError.__init__(self)
 
 
552
        self.path = bzrdir.transport.clone('..').base
 
 
555
class FileInWrongBranch(BzrError):
 
 
557
    _fmt = "File %(path)s in not in branch %(branch_base)s."
 
 
559
    def __init__(self, branch, path):
 
 
560
        BzrError.__init__(self)
 
 
562
        self.branch_base = branch.base
 
 
566
class UnsupportedFormatError(BzrError):
 
 
568
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
 
571
class UnknownFormatError(BzrError):
 
 
573
    _fmt = "Unknown branch format: %(format)r"
 
 
576
class IncompatibleFormat(BzrError):
 
 
578
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
580
    def __init__(self, format, bzrdir_format):
 
 
581
        BzrError.__init__(self)
 
 
583
        self.bzrdir = bzrdir_format
 
 
586
class IncompatibleRepositories(BzrError):
 
 
588
    _fmt = "Repository %(target)s is not compatible with repository"\
 
 
591
    def __init__(self, source, target):
 
 
592
        BzrError.__init__(self, target=target, source=source)
 
 
595
class IncompatibleRevision(BzrError):
 
 
597
    _fmt = "Revision is not compatible with %(repo_format)s"
 
 
599
    def __init__(self, repo_format):
 
 
600
        BzrError.__init__(self)
 
 
601
        self.repo_format = repo_format
 
 
604
class AlreadyVersionedError(BzrError):
 
 
605
    """Used when a path is expected not to be versioned, but it is."""
 
 
607
    _fmt = "%(context_info)s%(path)s is already versioned"
 
 
609
    def __init__(self, path, context_info=None):
 
 
610
        """Construct a new AlreadyVersionedError.
 
 
612
        :param path: This is the path which is versioned,
 
 
613
        which should be in a user friendly form.
 
 
614
        :param context_info: If given, this is information about the context,
 
 
615
        which could explain why this is expected to not be versioned.
 
 
617
        BzrError.__init__(self)
 
 
619
        if context_info is None:
 
 
620
            self.context_info = ''
 
 
622
            self.context_info = context_info + ". "
 
 
625
class NotVersionedError(BzrError):
 
 
626
    """Used when a path is expected to be versioned, but it is not."""
 
 
628
    _fmt = "%(context_info)s%(path)s is not versioned"
 
 
630
    def __init__(self, path, context_info=None):
 
 
631
        """Construct a new NotVersionedError.
 
 
633
        :param path: This is the path which is not versioned,
 
 
634
        which should be in a user friendly form.
 
 
635
        :param context_info: If given, this is information about the context,
 
 
636
        which could explain why this is expected to be versioned.
 
 
638
        BzrError.__init__(self)
 
 
640
        if context_info is None:
 
 
641
            self.context_info = ''
 
 
643
            self.context_info = context_info + ". "
 
 
646
class PathsNotVersionedError(BzrError):
 
 
647
    """Used when reporting several paths which are not versioned"""
 
 
649
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
 
651
    def __init__(self, paths):
 
 
652
        from bzrlib.osutils import quotefn
 
 
653
        BzrError.__init__(self)
 
 
655
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
658
class PathsDoNotExist(BzrError):
 
 
660
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
 
662
    # used when reporting that paths are neither versioned nor in the working
 
 
665
    def __init__(self, paths, extra=None):
 
 
667
        from bzrlib.osutils import quotefn
 
 
668
        BzrError.__init__(self)
 
 
670
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
 
672
            self.extra = ': ' + str(extra)
 
 
677
class BadFileKindError(BzrError):
 
 
679
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
 
681
    def __init__(self, filename, kind):
 
 
682
        BzrError.__init__(self, filename=filename, kind=kind)
 
 
685
class ForbiddenControlFileError(BzrError):
 
 
687
    _fmt = "Cannot operate on %(filename)s because it is a control file"
 
 
690
class LockError(BzrError):
 
 
692
    _fmt = "Lock error: %(msg)s"
 
 
694
    internal_error = True
 
 
696
    # All exceptions from the lock/unlock functions should be from
 
 
697
    # this exception class.  They will be translated as necessary. The
 
 
698
    # original exception is available as e.original_error
 
 
700
    # New code should prefer to raise specific subclasses
 
 
701
    def __init__(self, message):
 
 
702
        # Python 2.5 uses a slot for StandardError.message,
 
 
703
        # so use a different variable name
 
 
704
        # so it is exposed in self.__dict__
 
 
708
class LockActive(LockError):
 
 
710
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
 
712
    internal_error = False
 
 
714
    def __init__(self, lock_description):
 
 
715
        self.lock_description = lock_description
 
 
718
class CommitNotPossible(LockError):
 
 
720
    _fmt = "A commit was attempted but we do not have a write lock open."
 
 
726
class AlreadyCommitted(LockError):
 
 
728
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
 
734
class ReadOnlyError(LockError):
 
 
736
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
 
738
    # TODO: There should also be an error indicating that you need a write
 
 
739
    # lock and don't have any lock at all... mbp 20070226
 
 
741
    def __init__(self, obj):
 
 
745
class ReadOnlyLockError(LockError):
 
 
747
    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
 
 
749
    def __init__(self, fname, msg):
 
 
750
        LockError.__init__(self, '')
 
 
755
class OutSideTransaction(BzrError):
 
 
757
    _fmt = ("A transaction related operation was attempted after"
 
 
758
            " the transaction finished.")
 
 
761
class ObjectNotLocked(LockError):
 
 
763
    _fmt = "%(obj)r is not locked"
 
 
765
    # this can indicate that any particular object is not locked; see also
 
 
766
    # LockNotHeld which means that a particular *lock* object is not held by
 
 
767
    # the caller -- perhaps they should be unified.
 
 
768
    def __init__(self, obj):
 
 
772
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
 
774
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
 
776
    def __init__(self, obj):
 
 
780
class UnlockableTransport(LockError):
 
 
782
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
 
784
    def __init__(self, transport):
 
 
785
        self.transport = transport
 
 
788
class LockContention(LockError):
 
 
790
    _fmt = "Could not acquire lock %(lock)s"
 
 
791
    # TODO: show full url for lock, combining the transport and relative
 
 
794
    internal_error = False
 
 
796
    def __init__(self, lock):
 
 
800
class LockBroken(LockError):
 
 
802
    _fmt = ("Lock was broken while still open: %(lock)s"
 
 
803
            " - check storage consistency!")
 
 
805
    internal_error = False
 
 
807
    def __init__(self, lock):
 
 
811
class LockBreakMismatch(LockError):
 
 
813
    _fmt = ("Lock was released and re-acquired before being broken:"
 
 
814
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
 
816
    internal_error = False
 
 
818
    def __init__(self, lock, holder, target):
 
 
824
class LockNotHeld(LockError):
 
 
826
    _fmt = "Lock not held: %(lock)s"
 
 
828
    internal_error = False
 
 
830
    def __init__(self, lock):
 
 
834
class TokenLockingNotSupported(LockError):
 
 
836
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
 
838
    internal_error = True
 
 
840
    def __init__(self, obj):
 
 
844
class TokenMismatch(LockBroken):
 
 
846
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
 
848
    internal_error = True
 
 
850
    def __init__(self, given_token, lock_token):
 
 
851
        self.given_token = given_token
 
 
852
        self.lock_token = lock_token
 
 
855
class PointlessCommit(BzrError):
 
 
857
    _fmt = "No changes to commit"
 
 
860
class CannotCommitSelectedFileMerge(BzrError):
 
 
862
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
 
863
        ' files %(files_str)s'
 
 
865
    def __init__(self, files):
 
 
866
        files_str = ', '.join(files)
 
 
867
        BzrError.__init__(self, files=files, files_str=files_str)
 
 
870
class UpgradeReadonly(BzrError):
 
 
872
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
 
875
class UpToDateFormat(BzrError):
 
 
877
    _fmt = "The branch format %(format)s is already at the most recent format."
 
 
879
    def __init__(self, format):
 
 
880
        BzrError.__init__(self)
 
 
884
class StrictCommitFailed(Exception):
 
 
886
    _fmt = "Commit refused because there are unknowns in the tree."
 
 
889
class NoSuchRevision(BzrError):
 
 
891
    _fmt = "Branch %(branch)s has no revision %(revision)s"
 
 
893
    internal_error = True
 
 
895
    def __init__(self, branch, revision):
 
 
896
        BzrError.__init__(self, branch=branch, revision=revision)
 
 
899
class NotLeftParentDescendant(BzrError):
 
 
901
    _fmt = ("Revision %(old_revision)s is not the left parent of"
 
 
902
            " %(new_revision)s, but branch %(branch_location)s expects this")
 
 
904
    internal_error = True
 
 
906
    def __init__(self, branch, old_revision, new_revision):
 
 
907
        BzrError.__init__(self, branch_location=branch.base,
 
 
908
                          old_revision=old_revision,
 
 
909
                          new_revision=new_revision)
 
 
912
class NoSuchRevisionSpec(BzrError):
 
 
914
    _fmt = "No namespace registered for string: %(spec)r"
 
 
916
    def __init__(self, spec):
 
 
917
        BzrError.__init__(self, spec=spec)
 
 
920
class NoSuchRevisionInTree(NoSuchRevision):
 
 
921
    """When using Tree.revision_tree, and the revision is not accessible."""
 
 
923
    _fmt = "The revision id %(revision_id)s is not present in the tree %(tree)s."
 
 
925
    def __init__(self, tree, revision_id):
 
 
926
        BzrError.__init__(self)
 
 
928
        self.revision_id = revision_id
 
 
931
class InvalidRevisionSpec(BzrError):
 
 
933
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
934
            " %(branch)s%(extra)s")
 
 
936
    def __init__(self, spec, branch, extra=None):
 
 
937
        BzrError.__init__(self, branch=branch, spec=spec)
 
 
939
            self.extra = '\n' + str(extra)
 
 
944
class HistoryMissing(BzrError):
 
 
946
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
 
949
class AppendRevisionsOnlyViolation(BzrError):
 
 
951
    _fmt = ('Operation denied because it would change the main history,'
 
 
952
           ' which is not permitted by the append_revisions_only setting on'
 
 
953
           ' branch "%(location)s".')
 
 
955
    def __init__(self, location):
 
 
956
       import bzrlib.urlutils as urlutils
 
 
957
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
958
       BzrError.__init__(self, location=location)
 
 
961
class DivergedBranches(BzrError):
 
 
963
    _fmt = ("These branches have diverged."
 
 
964
            " Use the merge command to reconcile them.")
 
 
966
    internal_error = False
 
 
968
    def __init__(self, branch1, branch2):
 
 
969
        self.branch1 = branch1
 
 
970
        self.branch2 = branch2
 
 
973
class NotLefthandHistory(BzrError):
 
 
975
    _fmt = "Supplied history does not follow left-hand parents"
 
 
977
    internal_error = True
 
 
979
    def __init__(self, history):
 
 
980
        BzrError.__init__(self, history=history)
 
 
983
class UnrelatedBranches(BzrError):
 
 
985
    _fmt = ("Branches have no common ancestor, and"
 
 
986
            " no merge base revision was specified.")
 
 
988
    internal_error = False
 
 
991
class NoCommonAncestor(BzrError):
 
 
993
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
 
995
    def __init__(self, revision_a, revision_b):
 
 
996
        self.revision_a = revision_a
 
 
997
        self.revision_b = revision_b
 
 
1000
class NoCommonRoot(BzrError):
 
 
1002
    _fmt = ("Revisions are not derived from the same root: "
 
 
1003
           "%(revision_a)s %(revision_b)s.")
 
 
1005
    def __init__(self, revision_a, revision_b):
 
 
1006
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
 
1009
class NotAncestor(BzrError):
 
 
1011
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
 
1013
    def __init__(self, rev_id, not_ancestor_id):
 
 
1014
        BzrError.__init__(self, rev_id=rev_id,
 
 
1015
            not_ancestor_id=not_ancestor_id)
 
 
1018
class InstallFailed(BzrError):
 
 
1020
    def __init__(self, revisions):
 
 
1021
        revision_str = ", ".join(str(r) for r in revisions)
 
 
1022
        msg = "Could not install revisions:\n%s" % revision_str
 
 
1023
        BzrError.__init__(self, msg)
 
 
1024
        self.revisions = revisions
 
 
1027
class AmbiguousBase(BzrError):
 
 
1029
    def __init__(self, bases):
 
 
1030
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
 
1032
        msg = ("The correct base is unclear, because %s are all equally close"
 
 
1034
        BzrError.__init__(self, msg)
 
 
1038
class NoCommits(BzrError):
 
 
1040
    _fmt = "Branch %(branch)s has no commits."
 
 
1042
    def __init__(self, branch):
 
 
1043
        BzrError.__init__(self, branch=branch)
 
 
1046
class UnlistableStore(BzrError):
 
 
1048
    def __init__(self, store):
 
 
1049
        BzrError.__init__(self, "Store %s is not listable" % store)
 
 
1053
class UnlistableBranch(BzrError):
 
 
1055
    def __init__(self, br):
 
 
1056
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
 
1059
class BoundBranchOutOfDate(BzrError):
 
 
1061
    _fmt = ("Bound branch %(branch)s is out of date"
 
 
1062
            " with master branch %(master)s.")
 
 
1064
    def __init__(self, branch, master):
 
 
1065
        BzrError.__init__(self)
 
 
1066
        self.branch = branch
 
 
1067
        self.master = master
 
 
1070
class CommitToDoubleBoundBranch(BzrError):
 
 
1072
    _fmt = ("Cannot commit to branch %(branch)s."
 
 
1073
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
 
1075
    def __init__(self, branch, master, remote):
 
 
1076
        BzrError.__init__(self)
 
 
1077
        self.branch = branch
 
 
1078
        self.master = master
 
 
1079
        self.remote = remote
 
 
1082
class OverwriteBoundBranch(BzrError):
 
 
1084
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
 
1086
    def __init__(self, branch):
 
 
1087
        BzrError.__init__(self)
 
 
1088
        self.branch = branch
 
 
1091
class BoundBranchConnectionFailure(BzrError):
 
 
1093
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
 
1094
            " => %(target)s: %(error)s")
 
 
1096
    def __init__(self, branch, target, error):
 
 
1097
        BzrError.__init__(self)
 
 
1098
        self.branch = branch
 
 
1099
        self.target = target
 
 
1103
class WeaveError(BzrError):
 
 
1105
    _fmt = "Error in processing weave: %(message)s"
 
 
1107
    def __init__(self, message=None):
 
 
1108
        BzrError.__init__(self)
 
 
1109
        self.message = message
 
 
1112
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1114
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1116
    def __init__(self, revision_id, weave):
 
 
1118
        WeaveError.__init__(self)
 
 
1119
        self.revision_id = revision_id
 
 
1123
class WeaveRevisionNotPresent(WeaveError):
 
 
1125
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1127
    def __init__(self, revision_id, weave):
 
 
1128
        WeaveError.__init__(self)
 
 
1129
        self.revision_id = revision_id
 
 
1133
class WeaveFormatError(WeaveError):
 
 
1135
    _fmt = "Weave invariant violated: %(what)s"
 
 
1137
    def __init__(self, what):
 
 
1138
        WeaveError.__init__(self)
 
 
1142
class WeaveParentMismatch(WeaveError):
 
 
1144
    _fmt = "Parents are mismatched between two revisions."
 
 
1147
class WeaveInvalidChecksum(WeaveError):
 
 
1149
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1152
class WeaveTextDiffers(WeaveError):
 
 
1154
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1155
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1157
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1158
        WeaveError.__init__(self)
 
 
1159
        self.revision_id = revision_id
 
 
1160
        self.weave_a = weave_a
 
 
1161
        self.weave_b = weave_b
 
 
1164
class WeaveTextDiffers(WeaveError):
 
 
1166
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1167
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1169
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1170
        WeaveError.__init__(self)
 
 
1171
        self.revision_id = revision_id
 
 
1172
        self.weave_a = weave_a
 
 
1173
        self.weave_b = weave_b
 
 
1176
class VersionedFileError(BzrError):
 
 
1178
    _fmt = "Versioned file error"
 
 
1181
class RevisionNotPresent(VersionedFileError):
 
 
1183
    _fmt = "Revision {%(revision_id)s} not present in %(file_id)s."
 
 
1185
    def __init__(self, revision_id, file_id):
 
 
1186
        VersionedFileError.__init__(self)
 
 
1187
        self.revision_id = revision_id
 
 
1188
        self.file_id = file_id
 
 
1191
class RevisionAlreadyPresent(VersionedFileError):
 
 
1193
    _fmt = "Revision {%(revision_id)s} already present in %(file_id)s."
 
 
1195
    def __init__(self, revision_id, file_id):
 
 
1196
        VersionedFileError.__init__(self)
 
 
1197
        self.revision_id = revision_id
 
 
1198
        self.file_id = file_id
 
 
1201
class KnitError(BzrError):
 
 
1205
    internal_error = True
 
 
1208
class KnitHeaderError(KnitError):
 
 
1210
    _fmt = "Knit header error: %(badline)r unexpected for file %(filename)s"
 
 
1212
    def __init__(self, badline, filename):
 
 
1213
        KnitError.__init__(self)
 
 
1214
        self.badline = badline
 
 
1215
        self.filename = filename
 
 
1218
class KnitCorrupt(KnitError):
 
 
1220
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1222
    def __init__(self, filename, how):
 
 
1223
        KnitError.__init__(self)
 
 
1224
        self.filename = filename
 
 
1228
class KnitIndexUnknownMethod(KnitError):
 
 
1229
    """Raised when we don't understand the storage method.
 
 
1231
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1234
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1235
            " in options: %(options)r")
 
 
1237
    def __init__(self, filename, options):
 
 
1238
        KnitError.__init__(self)
 
 
1239
        self.filename = filename
 
 
1240
        self.options = options
 
 
1243
class NoSuchExportFormat(BzrError):
 
 
1245
    _fmt = "Export format %(format)r not supported"
 
 
1247
    def __init__(self, format):
 
 
1248
        BzrError.__init__(self)
 
 
1249
        self.format = format
 
 
1252
class TransportError(BzrError):
 
 
1254
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
 
1256
    def __init__(self, msg=None, orig_error=None):
 
 
1257
        if msg is None and orig_error is not None:
 
 
1258
            msg = str(orig_error)
 
 
1259
        if orig_error is None:
 
 
1264
        self.orig_error = orig_error
 
 
1265
        BzrError.__init__(self)
 
 
1268
class TooManyConcurrentRequests(BzrError):
 
 
1270
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
 
1271
            " Be sure to finish_writing and finish_reading on the"
 
 
1272
            " currently open request.")
 
 
1274
    internal_error = True
 
 
1276
    def __init__(self, medium):
 
 
1277
        self.medium = medium
 
 
1280
class SmartProtocolError(TransportError):
 
 
1282
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
 
1284
    def __init__(self, details):
 
 
1285
        self.details = details
 
 
1288
# A set of semi-meaningful errors which can be thrown
 
 
1289
class TransportNotPossible(TransportError):
 
 
1291
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
 
1294
class ConnectionError(TransportError):
 
 
1296
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
 
1299
class SocketConnectionError(ConnectionError):
 
 
1301
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
 
1303
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
 
1305
            msg = 'Failed to connect to'
 
 
1306
        if orig_error is None:
 
 
1309
            orig_error = '; ' + str(orig_error)
 
 
1310
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
 
1315
            self.port = ':%s' % port
 
 
1318
class ConnectionReset(TransportError):
 
 
1320
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
 
1323
class InvalidRange(TransportError):
 
 
1325
    _fmt = "Invalid range access in %(path)s at %(offset)s."
 
 
1327
    def __init__(self, path, offset):
 
 
1328
        TransportError.__init__(self, ("Invalid range access in %s at %d"
 
 
1331
        self.offset = offset
 
 
1334
class InvalidHttpResponse(TransportError):
 
 
1336
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
 
1338
    def __init__(self, path, msg, orig_error=None):
 
 
1340
        TransportError.__init__(self, msg, orig_error=orig_error)
 
 
1343
class InvalidHttpRange(InvalidHttpResponse):
 
 
1345
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
 
1347
    def __init__(self, path, range, msg):
 
 
1349
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1352
class InvalidHttpContentType(InvalidHttpResponse):
 
 
1354
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
 
1356
    def __init__(self, path, ctype, msg):
 
 
1358
        InvalidHttpResponse.__init__(self, path, msg)
 
 
1361
class RedirectRequested(TransportError):
 
 
1363
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
 
1365
    def __init__(self, source, target, is_permament=False, qual_proto=None):
 
 
1366
        self.source = source
 
 
1367
        self.target = target
 
 
1369
            self.permanently = ' permanently'
 
 
1371
            self.permanently = ''
 
 
1372
        self.is_permament = is_permament
 
 
1373
        self._qualified_proto = qual_proto
 
 
1374
        TransportError.__init__(self)
 
 
1376
    def _requalify_url(self, url):
 
 
1377
        """Restore the qualified proto in front of the url"""
 
 
1378
        # When this exception is raised, source and target are in
 
 
1379
        # user readable format. But some transports may use a
 
 
1380
        # different proto (http+urllib:// will present http:// to
 
 
1381
        # the user. If a qualified proto is specified, the code
 
 
1382
        # trapping the exception can get the qualified urls to
 
 
1383
        # properly handle the redirection themself (creating a
 
 
1384
        # new transport object from the target url for example).
 
 
1385
        # But checking that the scheme of the original and
 
 
1386
        # redirected urls are the same can be tricky. (see the
 
 
1387
        # FIXME in BzrDir.open_from_transport for the unique use
 
 
1389
        if self._qualified_proto is None:
 
 
1392
        # The TODO related to NotBranchError mention that doing
 
 
1393
        # that kind of manipulation on the urls may not be the
 
 
1394
        # exception object job. On the other hand, this object is
 
 
1395
        # the interface between the code and the user so
 
 
1396
        # presenting the urls in different ways is indeed its
 
 
1399
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
 
1400
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
 
1403
    def get_source_url(self):
 
 
1404
        return self._requalify_url(self.source)
 
 
1406
    def get_target_url(self):
 
 
1407
        return self._requalify_url(self.target)
 
 
1410
class TooManyRedirections(TransportError):
 
 
1412
    _fmt = "Too many redirections"
 
 
1414
class ConflictsInTree(BzrError):
 
 
1416
    _fmt = "Working tree has conflicts."
 
 
1419
class ParseConfigError(BzrError):
 
 
1421
    def __init__(self, errors, filename):
 
 
1422
        if filename is None:
 
 
1424
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1425
            (filename, ('\n'.join(e.message for e in errors)))
 
 
1426
        BzrError.__init__(self, message)
 
 
1429
class NoEmailInUsername(BzrError):
 
 
1431
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1433
    def __init__(self, username):
 
 
1434
        BzrError.__init__(self)
 
 
1435
        self.username = username
 
 
1438
class SigningFailed(BzrError):
 
 
1440
    _fmt = "Failed to gpg sign data with command %(command_line)r"
 
 
1442
    def __init__(self, command_line):
 
 
1443
        BzrError.__init__(self, command_line=command_line)
 
 
1446
class WorkingTreeNotRevision(BzrError):
 
 
1448
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
 
1449
            " the last commit, but weave merge requires that it be"
 
 
1452
    def __init__(self, tree):
 
 
1453
        BzrError.__init__(self, basedir=tree.basedir)
 
 
1456
class CantReprocessAndShowBase(BzrError):
 
 
1458
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
 
1459
           "the relationship of conflicting lines to the base")
 
 
1462
class GraphCycleError(BzrError):
 
 
1464
    _fmt = "Cycle in graph %(graph)r"
 
 
1466
    def __init__(self, graph):
 
 
1467
        BzrError.__init__(self)
 
 
1471
class WritingCompleted(BzrError):
 
 
1473
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
 
1474
            "called upon it - accept bytes may not be called anymore.")
 
 
1476
    internal_error = True
 
 
1478
    def __init__(self, request):
 
 
1479
        self.request = request
 
 
1482
class WritingNotComplete(BzrError):
 
 
1484
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
 
1485
            "called upon it - until the write phase is complete no "
 
 
1486
            "data may be read.")
 
 
1488
    internal_error = True
 
 
1490
    def __init__(self, request):
 
 
1491
        self.request = request
 
 
1494
class NotConflicted(BzrError):
 
 
1496
    _fmt = "File %(filename)s is not conflicted."
 
 
1498
    def __init__(self, filename):
 
 
1499
        BzrError.__init__(self)
 
 
1500
        self.filename = filename
 
 
1503
class MediumNotConnected(BzrError):
 
 
1505
    _fmt = """The medium '%(medium)s' is not connected."""
 
 
1507
    internal_error = True
 
 
1509
    def __init__(self, medium):
 
 
1510
        self.medium = medium
 
 
1513
class MustUseDecorated(Exception):
 
 
1515
    _fmt = "A decorating function has requested its original command be used."
 
 
1518
class NoBundleFound(BzrError):
 
 
1520
    _fmt = "No bundle was found in %(filename)s"
 
 
1522
    def __init__(self, filename):
 
 
1523
        BzrError.__init__(self)
 
 
1524
        self.filename = filename
 
 
1527
class BundleNotSupported(BzrError):
 
 
1529
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
 
1531
    def __init__(self, version, msg):
 
 
1532
        BzrError.__init__(self)
 
 
1533
        self.version = version
 
 
1537
class MissingText(BzrError):
 
 
1539
    _fmt = ("Branch %(base)s is missing revision"
 
 
1540
            " %(text_revision)s of %(file_id)s")
 
 
1542
    def __init__(self, branch, text_revision, file_id):
 
 
1543
        BzrError.__init__(self)
 
 
1544
        self.branch = branch
 
 
1545
        self.base = branch.base
 
 
1546
        self.text_revision = text_revision
 
 
1547
        self.file_id = file_id
 
 
1550
class DuplicateFileId(BzrError):
 
 
1552
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
 
1554
    def __init__(self, file_id, entry):
 
 
1555
        BzrError.__init__(self)
 
 
1556
        self.file_id = file_id
 
 
1560
class DuplicateKey(BzrError):
 
 
1562
    _fmt = "Key %(key)s is already present in map"
 
 
1565
class DuplicateHelpPrefix(BzrError):
 
 
1567
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
 
1569
    def __init__(self, prefix):
 
 
1570
        self.prefix = prefix
 
 
1573
class MalformedTransform(BzrError):
 
 
1575
    _fmt = "Tree transform is malformed %(conflicts)r"
 
 
1578
class NoFinalPath(BzrError):
 
 
1580
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
 
1581
            "file-id: %(file_id)r\n"
 
 
1582
            "root trans-id: %(root_trans_id)r\n")
 
 
1584
    def __init__(self, trans_id, transform):
 
 
1585
        self.trans_id = trans_id
 
 
1586
        self.file_id = transform.final_file_id(trans_id)
 
 
1587
        self.root_trans_id = transform.root
 
 
1590
class BzrBadParameter(BzrError):
 
 
1592
    _fmt = "Bad parameter: %(param)r"
 
 
1594
    internal_error = True
 
 
1596
    # This exception should never be thrown, but it is a base class for all
 
 
1597
    # parameter-to-function errors.
 
 
1599
    def __init__(self, param):
 
 
1600
        BzrError.__init__(self)
 
 
1604
class BzrBadParameterNotUnicode(BzrBadParameter):
 
 
1606
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
 
1609
class ReusingTransform(BzrError):
 
 
1611
    _fmt = "Attempt to reuse a transform that has already been applied."
 
 
1614
class CantMoveRoot(BzrError):
 
 
1616
    _fmt = "Moving the root directory is not supported at this time"
 
 
1619
class BzrMoveFailedError(BzrError):
 
 
1621
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1623
    def __init__(self, from_path='', to_path='', extra=None):
 
 
1624
        BzrError.__init__(self)
 
 
1626
            self.extra = ': ' + str(extra)
 
 
1630
        has_from = len(from_path) > 0
 
 
1631
        has_to = len(to_path) > 0
 
 
1633
            self.from_path = osutils.splitpath(from_path)[-1]
 
 
1638
            self.to_path = osutils.splitpath(to_path)[-1]
 
 
1643
        if has_from and has_to:
 
 
1644
            self.operator = " =>"
 
 
1646
            self.from_path = "from " + from_path
 
 
1648
            self.operator = "to"
 
 
1650
            self.operator = "file"
 
 
1653
class BzrRenameFailedError(BzrMoveFailedError):
 
 
1655
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
 
1657
    def __init__(self, from_path, to_path, extra=None):
 
 
1658
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
 
1660
class BzrRemoveChangedFilesError(BzrError):
 
 
1661
    """Used when user is trying to remove changed files."""
 
 
1663
    _fmt = ("Can't remove changed or unknown files:\n%(changes_as_text)s"
 
 
1664
        "Use --keep to not delete them, or --force to delete them regardless.")
 
 
1666
    def __init__(self, tree_delta):
 
 
1667
        BzrError.__init__(self)
 
 
1668
        self.changes_as_text = tree_delta.get_changes_as_text()
 
 
1669
        #self.paths_as_string = '\n'.join(changed_files)
 
 
1670
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
 
1673
class BzrBadParameterNotString(BzrBadParameter):
 
 
1675
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
 
1678
class BzrBadParameterMissing(BzrBadParameter):
 
 
1680
    _fmt = "Parameter $(param)s is required but not present."
 
 
1683
class BzrBadParameterUnicode(BzrBadParameter):
 
 
1685
    _fmt = ("Parameter %(param)s is unicode but"
 
 
1686
            " only byte-strings are permitted.")
 
 
1689
class BzrBadParameterContainsNewline(BzrBadParameter):
 
 
1691
    _fmt = "Parameter %(param)s contains a newline."
 
 
1694
class DependencyNotPresent(BzrError):
 
 
1696
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
 
1698
    def __init__(self, library, error):
 
 
1699
        BzrError.__init__(self, library=library, error=error)
 
 
1702
class ParamikoNotPresent(DependencyNotPresent):
 
 
1704
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
 
1706
    def __init__(self, error):
 
 
1707
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
 
1710
class PointlessMerge(BzrError):
 
 
1712
    _fmt = "Nothing to merge."
 
 
1715
class UninitializableFormat(BzrError):
 
 
1717
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
 
1719
    def __init__(self, format):
 
 
1720
        BzrError.__init__(self)
 
 
1721
        self.format = format
 
 
1724
class BadConversionTarget(BzrError):
 
 
1726
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
 
1728
    def __init__(self, problem, format):
 
 
1729
        BzrError.__init__(self)
 
 
1730
        self.problem = problem
 
 
1731
        self.format = format
 
 
1734
class NoDiff(BzrError):
 
 
1736
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
 
1738
    def __init__(self, msg):
 
 
1739
        BzrError.__init__(self, msg=msg)
 
 
1742
class NoDiff3(BzrError):
 
 
1744
    _fmt = "Diff3 is not installed on this machine."
 
 
1747
class ExistingLimbo(BzrError):
 
 
1749
    _fmt = """This tree contains left-over files from a failed operation.
 
 
1750
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
1751
    keep, and delete it when you are done."""
 
 
1753
    def __init__(self, limbo_dir):
 
 
1754
       BzrError.__init__(self)
 
 
1755
       self.limbo_dir = limbo_dir
 
 
1758
class ImmortalLimbo(BzrError):
 
 
1760
    _fmt = """Unable to delete transform temporary directory $(limbo_dir)s.
 
 
1761
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
 
1762
    keep, and delete it when you are done."""
 
 
1764
    def __init__(self, limbo_dir):
 
 
1765
       BzrError.__init__(self)
 
 
1766
       self.limbo_dir = limbo_dir
 
 
1769
class OutOfDateTree(BzrError):
 
 
1771
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
 
1773
    def __init__(self, tree):
 
 
1774
        BzrError.__init__(self)
 
 
1778
class PublicBranchOutOfDate(BzrError):
 
 
1780
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
 
1783
    def __init__(self, public_location, revstring):
 
 
1784
        import bzrlib.urlutils as urlutils
 
 
1785
        public_location = urlutils.unescape_for_display(public_location,
 
 
1787
        BzrError.__init__(self, public_location=public_location,
 
 
1788
                          revstring=revstring)
 
 
1791
class MergeModifiedFormatError(BzrError):
 
 
1793
    _fmt = "Error in merge modified format"
 
 
1796
class ConflictFormatError(BzrError):
 
 
1798
    _fmt = "Format error in conflict listings"
 
 
1801
class CorruptRepository(BzrError):
 
 
1803
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
 
1804
            "Please run bzr reconcile on this repository.")
 
 
1806
    def __init__(self, repo):
 
 
1807
        BzrError.__init__(self)
 
 
1808
        self.repo_path = repo.bzrdir.root_transport.base
 
 
1811
class UpgradeRequired(BzrError):
 
 
1813
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
 
1815
    def __init__(self, path):
 
 
1816
        BzrError.__init__(self)
 
 
1820
class LocalRequiresBoundBranch(BzrError):
 
 
1822
    _fmt = "Cannot perform local-only commits on unbound branches."
 
 
1825
class MissingProgressBarFinish(BzrError):
 
 
1827
    _fmt = "A nested progress bar was not 'finished' correctly."
 
 
1830
class InvalidProgressBarType(BzrError):
 
 
1832
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
 
1833
            " is not a supported type Select one of: %(valid_types)s")
 
 
1835
    def __init__(self, bar_type, valid_types):
 
 
1836
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
 
1839
class UnsupportedOperation(BzrError):
 
 
1841
    _fmt = ("The method %(mname)s is not supported on"
 
 
1842
            " objects of type %(tname)s.")
 
 
1844
    def __init__(self, method, method_self):
 
 
1845
        self.method = method
 
 
1846
        self.mname = method.__name__
 
 
1847
        self.tname = type(method_self).__name__
 
 
1850
class CannotSetRevisionId(UnsupportedOperation):
 
 
1851
    """Raised when a commit is attempting to set a revision id but cant."""
 
 
1854
class NonAsciiRevisionId(UnsupportedOperation):
 
 
1855
    """Raised when a commit is attempting to set a non-ascii revision id
 
 
1860
class BinaryFile(BzrError):
 
 
1862
    _fmt = "File is binary but should be text."
 
 
1865
class IllegalPath(BzrError):
 
 
1867
    _fmt = "The path %(path)s is not permitted on this platform"
 
 
1869
    def __init__(self, path):
 
 
1870
        BzrError.__init__(self)
 
 
1874
class TestamentMismatch(BzrError):
 
 
1876
    _fmt = """Testament did not match expected value.
 
 
1877
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
 
1880
    def __init__(self, revision_id, expected, measured):
 
 
1881
        self.revision_id = revision_id
 
 
1882
        self.expected = expected
 
 
1883
        self.measured = measured
 
 
1886
class NotABundle(BzrError):
 
 
1888
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
 
1890
    def __init__(self, text):
 
 
1891
        BzrError.__init__(self)
 
 
1895
class BadBundle(BzrError): 
 
 
1897
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
 
1899
    def __init__(self, text):
 
 
1900
        BzrError.__init__(self)
 
 
1904
class MalformedHeader(BadBundle): 
 
 
1906
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
 
1909
class MalformedPatches(BadBundle): 
 
 
1911
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
 
1914
class MalformedFooter(BadBundle): 
 
 
1916
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
 
1919
class UnsupportedEOLMarker(BadBundle):
 
 
1921
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
 
1924
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
 
1925
        # but for this there is not
 
 
1926
        BzrError.__init__(self)
 
 
1929
class IncompatibleBundleFormat(BzrError):
 
 
1931
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
 
1933
    def __init__(self, bundle_format, other):
 
 
1934
        BzrError.__init__(self)
 
 
1935
        self.bundle_format = bundle_format
 
 
1939
class BadInventoryFormat(BzrError):
 
 
1941
    _fmt = "Root class for inventory serialization errors"
 
 
1944
class UnexpectedInventoryFormat(BadInventoryFormat):
 
 
1946
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
 
1948
    def __init__(self, msg):
 
 
1949
        BadInventoryFormat.__init__(self, msg=msg)
 
 
1952
class RootNotRich(BzrError):
 
 
1954
    _fmt = """This operation requires rich root data storage"""
 
 
1957
class NoSmartMedium(BzrError):
 
 
1959
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
 
1961
    internal_error = True
 
 
1963
    def __init__(self, transport):
 
 
1964
        self.transport = transport
 
 
1967
class NoSmartServer(NotBranchError):
 
 
1969
    _fmt = "No smart server available at %(url)s"
 
 
1971
    def __init__(self, url):
 
 
1975
class UnknownSSH(BzrError):
 
 
1977
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
 
1979
    def __init__(self, vendor):
 
 
1980
        BzrError.__init__(self)
 
 
1981
        self.vendor = vendor
 
 
1984
class SSHVendorNotFound(BzrError):
 
 
1986
    _fmt = ("Don't know how to handle SSH connections."
 
 
1987
            " Please set BZR_SSH environment variable.")
 
 
1990
class GhostRevisionUnusableHere(BzrError):
 
 
1992
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
 
1994
    def __init__(self, revision_id):
 
 
1995
        BzrError.__init__(self)
 
 
1996
        self.revision_id = revision_id
 
 
1999
class IllegalUseOfScopeReplacer(BzrError):
 
 
2001
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
 
2002
            " %(msg)s%(extra)s")
 
 
2004
    internal_error = True
 
 
2006
    def __init__(self, name, msg, extra=None):
 
 
2007
        BzrError.__init__(self)
 
 
2011
            self.extra = ': ' + str(extra)
 
 
2016
class InvalidImportLine(BzrError):
 
 
2018
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
 
2020
    internal_error = True
 
 
2022
    def __init__(self, text, msg):
 
 
2023
        BzrError.__init__(self)
 
 
2028
class ImportNameCollision(BzrError):
 
 
2030
    _fmt = ("Tried to import an object to the same name as"
 
 
2031
            " an existing object. %(name)s")
 
 
2033
    internal_error = True
 
 
2035
    def __init__(self, name):
 
 
2036
        BzrError.__init__(self)
 
 
2040
class NotAMergeDirective(BzrError):
 
 
2041
    """File starting with %(firstline)r is not a merge directive"""
 
 
2042
    def __init__(self, firstline):
 
 
2043
        BzrError.__init__(self, firstline=firstline)
 
 
2046
class NoMergeSource(BzrError):
 
 
2047
    """Raise if no merge source was specified for a merge directive"""
 
 
2049
    _fmt = "A merge directive must provide either a bundle or a public"\
 
 
2053
class PatchMissing(BzrError):
 
 
2054
    """Raise a patch type was specified but no patch supplied"""
 
 
2056
    _fmt = "patch_type was %(patch_type)s, but no patch was supplied."
 
 
2058
    def __init__(self, patch_type):
 
 
2059
        BzrError.__init__(self)
 
 
2060
        self.patch_type = patch_type
 
 
2063
class UnsupportedInventoryKind(BzrError):
 
 
2065
    _fmt = """Unsupported entry kind %(kind)s"""
 
 
2067
    def __init__(self, kind):
 
 
2071
class BadSubsumeSource(BzrError):
 
 
2073
    _fmt = """Can't subsume %(other_tree)s into %(tree)s.  %(reason)s"""
 
 
2075
    def __init__(self, tree, other_tree, reason):
 
 
2077
        self.other_tree = other_tree
 
 
2078
        self.reason = reason
 
 
2081
class SubsumeTargetNeedsUpgrade(BzrError):
 
 
2083
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
 
2085
    def __init__(self, other_tree):
 
 
2086
        self.other_tree = other_tree
 
 
2089
class BadReferenceTarget(BzrError):
 
 
2091
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s.  %(reason)s"
 
 
2093
    internal_error = True
 
 
2095
    def __init__(self, tree, other_tree, reason):
 
 
2097
        self.other_tree = other_tree
 
 
2098
        self.reason = reason
 
 
2101
class NoSuchTag(BzrError):
 
 
2103
    _fmt = "No such tag: %(tag_name)s"
 
 
2105
    def __init__(self, tag_name):
 
 
2106
        self.tag_name = tag_name
 
 
2109
class TagsNotSupported(BzrError):
 
 
2111
    _fmt = ("Tags not supported by %(branch)s;"
 
 
2112
            " you may be able to use bzr upgrade --dirstate-tags.")
 
 
2114
    def __init__(self, branch):
 
 
2115
        self.branch = branch
 
 
2118
class TagAlreadyExists(BzrError):
 
 
2120
    _fmt = "Tag %(tag_name)s already exists."
 
 
2122
    def __init__(self, tag_name):
 
 
2123
        self.tag_name = tag_name
 
 
2126
class MalformedBugIdentifier(BzrError):
 
 
2128
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
 
2130
    def __init__(self, bug_id, reason):
 
 
2131
        self.bug_id = bug_id
 
 
2132
        self.reason = reason
 
 
2135
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2137
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2140
    def __init__(self, abbreviation, branch):
 
 
2141
        self.abbreviation = abbreviation
 
 
2142
        self.branch = branch
 
 
2145
class UnexpectedSmartServerResponse(BzrError):
 
 
2147
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2149
    def __init__(self, response_tuple):
 
 
2150
        self.response_tuple = response_tuple
 
 
2153
class NoDestinationAddress(BzrError):
 
 
2155
    _fmt = "Message does not have a destination address."
 
 
2157
    internal_error = True
 
 
2160
class SMTPError(BzrError):
 
 
2162
    _fmt = "SMTP error: %(error)s"
 
 
2164
    def __init__(self, error):