/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-07-29 08:40:05 UTC
  • mfrom: (3535.7.1 bzr)
  • Revision ID: pqm@pqm.ubuntu.com-20080729084005-ohq1fb6mheyeaqr6
Improved 'Using saved location' message for 'bzr send'. (Toni Ruottu)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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
 
16
 
 
17
"""Exceptions for bzr, and reporting of them.
 
18
"""
 
19
 
 
20
 
 
21
from bzrlib import (
 
22
    osutils,
 
23
    symbol_versioning,
 
24
    )
 
25
from bzrlib.patches import (
 
26
    MalformedHunkHeader,
 
27
    MalformedLine,
 
28
    MalformedPatchHeader,
 
29
    PatchConflict,
 
30
    PatchSyntax,
 
31
    )
 
32
 
 
33
 
 
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 
 
36
# to me.
 
37
 
 
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.
 
41
 
 
42
# TODO: selftest assertRaises should probably also check that every error
 
43
# raised can be formatted as a string successfully, and without giving
 
44
# 'unprintable'.
 
45
 
 
46
 
 
47
# return codes from the bzr program
 
48
EXIT_OK = 0
 
49
EXIT_ERROR = 3
 
50
EXIT_INTERNAL_ERROR = 4
 
51
 
 
52
 
 
53
class BzrError(StandardError):
 
54
    """
 
55
    Base class for errors raised by bzrlib.
 
56
 
 
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.)
 
61
 
 
62
    :cvar _fmt: Format string to display the error; this is expanded
 
63
    by the instance's dict.
 
64
    """
 
65
    
 
66
    internal_error = False
 
67
 
 
68
    def __init__(self, msg=None, **kwds):
 
69
        """Construct a new BzrError.
 
70
 
 
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.  
 
77
 
 
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 
 
81
        parameters.
 
82
 
 
83
        :param msg: If given, this is the literal complete text for the error,
 
84
        not subject to expansion.
 
85
        """
 
86
        StandardError.__init__(self)
 
87
        if msg is not None:
 
88
            # I was going to deprecate this, but it actually turns out to be
 
89
            # quite handy - mbp 20061103.
 
90
            self._preformatted_string = msg
 
91
        else:
 
92
            self._preformatted_string = None
 
93
            for key, value in kwds.items():
 
94
                setattr(self, key, value)
 
95
 
 
96
    def _format(self):
 
97
        s = getattr(self, '_preformatted_string', None)
 
98
        if s is not None:
 
99
            # contains a preformatted message
 
100
            return s
 
101
        try:
 
102
            fmt = self._get_format_string()
 
103
            if fmt:
 
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')
 
108
                s = fmt % d
 
109
                # __str__() should always return a 'str' object
 
110
                # never a 'unicode' object.
 
111
                return s
 
112
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
113
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
114
                % (self.__class__.__name__,
 
115
                   self.__dict__,
 
116
                   getattr(self, '_fmt', None),
 
117
                   e)
 
118
 
 
119
    def __unicode__(self):
 
120
        u = self._format()
 
121
        if isinstance(u, str):
 
122
            # Try decoding the str using the default encoding.
 
123
            u = unicode(u)
 
124
        elif not isinstance(u, unicode):
 
125
            # Try to make a unicode object from it, because __unicode__ must
 
126
            # return a unicode object.
 
127
            u = unicode(u)
 
128
        return u
 
129
    
 
130
    def __str__(self):
 
131
        s = self._format()
 
132
        if isinstance(s, unicode):
 
133
            s = s.encode('utf8')
 
134
        else:
 
135
            # __str__ must return a str.
 
136
            s = str(s)
 
137
        return s
 
138
 
 
139
    def _get_format_string(self):
 
140
        """Return format string for this exception or None"""
 
141
        fmt = getattr(self, '_fmt', None)
 
142
        if fmt is not None:
 
143
            return fmt
 
144
        fmt = getattr(self, '__doc__', None)
 
145
        if fmt is not None:
 
146
            symbol_versioning.warn("%s uses its docstring as a format, "
 
147
                    "it should use _fmt instead" % self.__class__.__name__,
 
148
                    DeprecationWarning)
 
149
            return fmt
 
150
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
151
            % (self.__class__.__name__,
 
152
               self.__dict__,
 
153
               getattr(self, '_fmt', None),
 
154
               )
 
155
 
 
156
    def __eq__(self, other):
 
157
        if self.__class__ != other.__class__:
 
158
            return NotImplemented
 
159
        return self.__dict__ == other.__dict__
 
160
 
 
161
 
 
162
class InternalBzrError(BzrError):
 
163
    """Base class for errors that are internal in nature.
 
164
 
 
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.
 
168
    """
 
169
 
 
170
    internal_error = True
 
171
 
 
172
 
 
173
class BzrNewError(BzrError):
 
174
    """Deprecated error base class."""
 
175
    # base classes should override the docstring with their human-
 
176
    # readable explanation
 
177
 
 
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).
 
182
        # --bmc, 20060426
 
183
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
184
             'please convert %s to use BzrError instead'
 
185
             % self.__class__.__name__,
 
186
             DeprecationWarning,
 
187
             stacklevel=2)
 
188
        BzrError.__init__(self, *args)
 
189
        for key, value in kwds.items():
 
190
            setattr(self, key, value)
 
191
 
 
192
    def __str__(self):
 
193
        try:
 
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')
 
199
            return s
 
200
        except (TypeError, NameError, ValueError, KeyError), e:
 
201
            return 'Unprintable exception %s(%r): %r' \
 
202
                % (self.__class__.__name__,
 
203
                   self.__dict__, e)
 
204
 
 
205
 
 
206
class AlreadyBuilding(BzrError):
 
207
    
 
208
    _fmt = "The tree builder is already building a tree."
 
209
 
 
210
 
 
211
class BranchError(BzrError):
 
212
    """Base class for concrete 'errors about a branch'."""
 
213
 
 
214
    def __init__(self, branch):
 
215
        BzrError.__init__(self, branch=branch)
 
216
 
 
217
 
 
218
class BzrCheckError(InternalBzrError):
 
219
    
 
220
    _fmt = "Internal check failed: %(message)s"
 
221
 
 
222
    def __init__(self, message):
 
223
        BzrError.__init__(self)
 
224
        self.message = message
 
225
 
 
226
 
 
227
class DisabledMethod(InternalBzrError):
 
228
 
 
229
    _fmt = "The smart server method '%(class_name)s' is disabled."
 
230
 
 
231
    def __init__(self, class_name):
 
232
        BzrError.__init__(self)
 
233
        self.class_name = class_name
 
234
 
 
235
 
 
236
class IncompatibleAPI(BzrError):
 
237
 
 
238
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
 
239
        'It supports versions "%(minimum)s" to "%(current)s".'
 
240
 
 
241
    def __init__(self, api, wanted, minimum, current):
 
242
        self.api = api
 
243
        self.wanted = wanted
 
244
        self.minimum = minimum
 
245
        self.current = current
 
246
 
 
247
 
 
248
class InProcessTransport(BzrError):
 
249
 
 
250
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
251
        "process."
 
252
 
 
253
    def __init__(self, transport):
 
254
        self.transport = transport
 
255
 
 
256
 
 
257
class InvalidEntryName(InternalBzrError):
 
258
    
 
259
    _fmt = "Invalid entry name: %(name)s"
 
260
 
 
261
    def __init__(self, name):
 
262
        BzrError.__init__(self)
 
263
        self.name = name
 
264
 
 
265
 
 
266
class InvalidRevisionNumber(BzrError):
 
267
    
 
268
    _fmt = "Invalid revision number %(revno)s"
 
269
 
 
270
    def __init__(self, revno):
 
271
        BzrError.__init__(self)
 
272
        self.revno = revno
 
273
 
 
274
 
 
275
class InvalidRevisionId(BzrError):
 
276
 
 
277
    _fmt = "Invalid revision-id {%(revision_id)s} in %(branch)s"
 
278
 
 
279
    def __init__(self, revision_id, branch):
 
280
        # branch can be any string or object with __str__ defined
 
281
        BzrError.__init__(self)
 
282
        self.revision_id = revision_id
 
283
        self.branch = branch
 
284
 
 
285
 
 
286
class ReservedId(BzrError):
 
287
 
 
288
    _fmt = "Reserved revision-id {%(revision_id)s}"
 
289
 
 
290
    def __init__(self, revision_id):
 
291
        self.revision_id = revision_id
 
292
 
 
293
 
 
294
class RootMissing(InternalBzrError):
 
295
 
 
296
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
297
        "record_entry_contents.")
 
298
 
 
299
 
 
300
class NoPublicBranch(BzrError):
 
301
 
 
302
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
303
 
 
304
    def __init__(self, branch):
 
305
        import bzrlib.urlutils as urlutils
 
306
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
307
        BzrError.__init__(self, branch_url=public_location)
 
308
 
 
309
 
 
310
class NoHelpTopic(BzrError):
 
311
 
 
312
    _fmt = ("No help could be found for '%(topic)s'. "
 
313
        "Please use 'bzr help topics' to obtain a list of topics.")
 
314
 
 
315
    def __init__(self, topic):
 
316
        self.topic = topic
 
317
 
 
318
 
 
319
class NoSuchId(BzrError):
 
320
 
 
321
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
 
322
    
 
323
    def __init__(self, tree, file_id):
 
324
        BzrError.__init__(self)
 
325
        self.file_id = file_id
 
326
        self.tree = tree
 
327
 
 
328
 
 
329
class NoSuchIdInRepository(NoSuchId):
 
330
 
 
331
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
332
            ' %(repository)r')
 
333
 
 
334
    def __init__(self, repository, file_id):
 
335
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
336
 
 
337
 
 
338
class NotStacked(BranchError):
 
339
 
 
340
    _fmt = "The branch '%(branch)s' is not stacked."
 
341
 
 
342
 
 
343
class InventoryModified(InternalBzrError):
 
344
 
 
345
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
346
            " so a clean inventory cannot be read without data loss.")
 
347
 
 
348
    def __init__(self, tree):
 
349
        self.tree = tree
 
350
 
 
351
 
 
352
class NoWorkingTree(BzrError):
 
353
 
 
354
    _fmt = 'No WorkingTree exists for "%(base)s".'
 
355
    
 
356
    def __init__(self, base):
 
357
        BzrError.__init__(self)
 
358
        self.base = base
 
359
 
 
360
 
 
361
class NotBuilding(BzrError):
 
362
 
 
363
    _fmt = "Not currently building a tree."
 
364
 
 
365
 
 
366
class NotLocalUrl(BzrError):
 
367
 
 
368
    _fmt = "%(url)s is not a local path."
 
369
 
 
370
    def __init__(self, url):
 
371
        self.url = url
 
372
 
 
373
 
 
374
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
375
 
 
376
    _fmt = 'Working tree already populated in "%(base)s"'
 
377
 
 
378
    def __init__(self, base):
 
379
        self.base = base
 
380
 
 
381
 
 
382
class BzrCommandError(BzrError):
 
383
    """Error from user command"""
 
384
 
 
385
    # Error from malformed user command; please avoid raising this as a
 
386
    # generic exception not caused by user input.
 
387
    #
 
388
    # I think it's a waste of effort to differentiate between errors that
 
389
    # are not intended to be caught anyway.  UI code need not subclass
 
390
    # BzrCommandError, and non-UI code should not throw a subclass of
 
391
    # BzrCommandError.  ADHB 20051211
 
392
 
 
393
 
 
394
class NotWriteLocked(BzrError):
 
395
 
 
396
    _fmt = """%(not_locked)r is not write locked but needs to be."""
 
397
 
 
398
    def __init__(self, not_locked):
 
399
        self.not_locked = not_locked
 
400
 
 
401
 
 
402
class BzrOptionError(BzrCommandError):
 
403
 
 
404
    _fmt = "Error in command line options"
 
405
 
 
406
 
 
407
class BadIndexFormatSignature(BzrError):
 
408
 
 
409
    _fmt = "%(value)s is not an index of type %(_type)s."
 
410
 
 
411
    def __init__(self, value, _type):
 
412
        BzrError.__init__(self)
 
413
        self.value = value
 
414
        self._type = _type
 
415
 
 
416
 
 
417
class BadIndexData(BzrError):
 
418
 
 
419
    _fmt = "Error in data for index %(value)s."
 
420
 
 
421
    def __init__(self, value):
 
422
        BzrError.__init__(self)
 
423
        self.value = value
 
424
 
 
425
 
 
426
class BadIndexDuplicateKey(BzrError):
 
427
 
 
428
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
429
 
 
430
    def __init__(self, key, index):
 
431
        BzrError.__init__(self)
 
432
        self.key = key
 
433
        self.index = index
 
434
 
 
435
 
 
436
class BadIndexKey(BzrError):
 
437
 
 
438
    _fmt = "The key '%(key)s' is not a valid key."
 
439
 
 
440
    def __init__(self, key):
 
441
        BzrError.__init__(self)
 
442
        self.key = key
 
443
 
 
444
 
 
445
class BadIndexOptions(BzrError):
 
446
 
 
447
    _fmt = "Could not parse options for index %(value)s."
 
448
 
 
449
    def __init__(self, value):
 
450
        BzrError.__init__(self)
 
451
        self.value = value
 
452
 
 
453
 
 
454
class BadIndexValue(BzrError):
 
455
 
 
456
    _fmt = "The value '%(value)s' is not a valid value."
 
457
 
 
458
    def __init__(self, value):
 
459
        BzrError.__init__(self)
 
460
        self.value = value
 
461
 
 
462
 
 
463
class BadOptionValue(BzrError):
 
464
 
 
465
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
466
 
 
467
    def __init__(self, name, value):
 
468
        BzrError.__init__(self, name=name, value=value)
 
469
 
 
470
    
 
471
class StrictCommitFailed(BzrError):
 
472
 
 
473
    _fmt = "Commit refused because there are unknown files in the tree"
 
474
 
 
475
 
 
476
# XXX: Should be unified with TransportError; they seem to represent the
 
477
# same thing
 
478
# RBC 20060929: I think that unifiying with TransportError would be a mistake
 
479
# - this is finer than a TransportError - and more useful as such. It 
 
480
# differentiates between 'transport has failed' and 'operation on a transport
 
481
# has failed.'
 
482
class PathError(BzrError):
 
483
    
 
484
    _fmt = "Generic path error: %(path)r%(extra)s)"
 
485
 
 
486
    def __init__(self, path, extra=None):
 
487
        BzrError.__init__(self)
 
488
        self.path = path
 
489
        if extra:
 
490
            self.extra = ': ' + str(extra)
 
491
        else:
 
492
            self.extra = ''
 
493
 
 
494
 
 
495
class NoSuchFile(PathError):
 
496
 
 
497
    _fmt = "No such file: %(path)r%(extra)s"
 
498
 
 
499
 
 
500
class FileExists(PathError):
 
501
 
 
502
    _fmt = "File exists: %(path)r%(extra)s"
 
503
 
 
504
 
 
505
class RenameFailedFilesExist(BzrError):
 
506
    """Used when renaming and both source and dest exist."""
 
507
 
 
508
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
 
509
            " (Use --after to tell bzr about a rename that has already"
 
510
            " happened)%(extra)s")
 
511
 
 
512
    def __init__(self, source, dest, extra=None):
 
513
        BzrError.__init__(self)
 
514
        self.source = str(source)
 
515
        self.dest = str(dest)
 
516
        if extra:
 
517
            self.extra = ' ' + str(extra)
 
518
        else:
 
519
            self.extra = ''
 
520
 
 
521
 
 
522
class NotADirectory(PathError):
 
523
 
 
524
    _fmt = '"%(path)s" is not a directory %(extra)s'
 
525
 
 
526
 
 
527
class NotInWorkingDirectory(PathError):
 
528
 
 
529
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
 
530
 
 
531
 
 
532
class DirectoryNotEmpty(PathError):
 
533
 
 
534
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
535
 
 
536
 
 
537
class HardLinkNotSupported(PathError):
 
538
 
 
539
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
540
 
 
541
 
 
542
class ReadingCompleted(InternalBzrError):
 
543
    
 
544
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
 
545
            "called upon it - the request has been completed and no more "
 
546
            "data may be read.")
 
547
 
 
548
    def __init__(self, request):
 
549
        self.request = request
 
550
 
 
551
 
 
552
class ResourceBusy(PathError):
 
553
 
 
554
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
 
555
 
 
556
 
 
557
class PermissionDenied(PathError):
 
558
 
 
559
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
560
 
 
561
 
 
562
class InvalidURL(PathError):
 
563
 
 
564
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
565
 
 
566
 
 
567
class InvalidURLJoin(PathError):
 
568
 
 
569
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
570
 
 
571
    def __init__(self, reason, base, join_args):
 
572
        self.reason = reason
 
573
        self.base = base
 
574
        self.join_args = join_args
 
575
        PathError.__init__(self, base, reason)
 
576
 
 
577
 
 
578
class InvalidRebaseURLs(PathError):
 
579
 
 
580
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
581
 
 
582
    def __init__(self, from_, to):
 
583
        self.from_ = from_
 
584
        self.to = to
 
585
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
586
 
 
587
 
 
588
class UnavailableRepresentation(InternalBzrError):
 
589
 
 
590
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
591
        "is encoded as '%(native)s'.")
 
592
 
 
593
    def __init__(self, key, wanted, native):
 
594
        InternalBzrError.__init__(self)
 
595
        self.wanted = wanted
 
596
        self.native = native
 
597
        self.key = key
 
598
 
 
599
 
 
600
class UnknownHook(BzrError):
 
601
 
 
602
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
603
 
 
604
    def __init__(self, hook_type, hook_name):
 
605
        BzrError.__init__(self)
 
606
        self.type = hook_type
 
607
        self.hook = hook_name
 
608
 
 
609
 
 
610
class UnsupportedProtocol(PathError):
 
611
 
 
612
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
613
 
 
614
    def __init__(self, url, extra):
 
615
        PathError.__init__(self, url, extra=extra)
 
616
 
 
617
 
 
618
class UnstackableBranchFormat(BzrError):
 
619
 
 
620
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
621
        "You will need to upgrade the branch to permit branch stacking.")
 
622
 
 
623
    def __init__(self, format, url):
 
624
        BzrError.__init__(self)
 
625
        self.format = format
 
626
        self.url = url
 
627
 
 
628
 
 
629
class UnstackableRepositoryFormat(BzrError):
 
630
 
 
631
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
632
        "You will need to upgrade the repository to permit branch stacking.")
 
633
 
 
634
    def __init__(self, format, url):
 
635
        BzrError.__init__(self)
 
636
        self.format = format
 
637
        self.url = url
 
638
 
 
639
 
 
640
class ReadError(PathError):
 
641
    
 
642
    _fmt = """Error reading from %(path)r."""
 
643
 
 
644
 
 
645
class ShortReadvError(PathError):
 
646
 
 
647
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
648
            ' at %(offset)s for "%(path)s"%(extra)s')
 
649
 
 
650
    internal_error = True
 
651
 
 
652
    def __init__(self, path, offset, length, actual, extra=None):
 
653
        PathError.__init__(self, path, extra=extra)
 
654
        self.offset = offset
 
655
        self.length = length
 
656
        self.actual = actual
 
657
 
 
658
 
 
659
class PathNotChild(PathError):
 
660
 
 
661
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
 
662
 
 
663
    internal_error = True
 
664
 
 
665
    def __init__(self, path, base, extra=None):
 
666
        BzrError.__init__(self)
 
667
        self.path = path
 
668
        self.base = base
 
669
        if extra:
 
670
            self.extra = ': ' + str(extra)
 
671
        else:
 
672
            self.extra = ''
 
673
 
 
674
 
 
675
class InvalidNormalization(PathError):
 
676
 
 
677
    _fmt = 'Path "%(path)s" is not unicode normalized'
 
678
 
 
679
 
 
680
# TODO: This is given a URL; we try to unescape it but doing that from inside
 
681
# the exception object is a bit undesirable.
 
682
# TODO: Probably this behavior of should be a common superclass 
 
683
class NotBranchError(PathError):
 
684
 
 
685
    _fmt = 'Not a branch: "%(path)s".'
 
686
 
 
687
    def __init__(self, path):
 
688
       import bzrlib.urlutils as urlutils
 
689
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
690
 
 
691
 
 
692
class NoSubmitBranch(PathError):
 
693
 
 
694
    _fmt = 'No submit branch available for branch "%(path)s"'
 
695
 
 
696
    def __init__(self, branch):
 
697
       import bzrlib.urlutils as urlutils
 
698
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
699
 
 
700
 
 
701
class AlreadyBranchError(PathError):
 
702
 
 
703
    _fmt = 'Already a branch: "%(path)s".'
 
704
 
 
705
 
 
706
class BranchExistsWithoutWorkingTree(PathError):
 
707
 
 
708
    _fmt = 'Directory contains a branch, but no working tree \
 
709
(use bzr checkout if you wish to build a working tree): "%(path)s"'
 
710
 
 
711
 
 
712
class AtomicFileAlreadyClosed(PathError):
 
713
 
 
714
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
715
            ' "%(path)s"')
 
716
 
 
717
    def __init__(self, path, function):
 
718
        PathError.__init__(self, path=path, extra=None)
 
719
        self.function = function
 
720
 
 
721
 
 
722
class InaccessibleParent(PathError):
 
723
 
 
724
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
725
            ' relative path "%(path)s"')
 
726
 
 
727
    def __init__(self, path, base):
 
728
        PathError.__init__(self, path)
 
729
        self.base = base
 
730
 
 
731
 
 
732
class NoRepositoryPresent(BzrError):
 
733
 
 
734
    _fmt = 'No repository present: "%(path)s"'
 
735
    def __init__(self, bzrdir):
 
736
        BzrError.__init__(self)
 
737
        self.path = bzrdir.transport.clone('..').base
 
738
 
 
739
 
 
740
class FileInWrongBranch(BzrError):
 
741
 
 
742
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
 
743
 
 
744
    def __init__(self, branch, path):
 
745
        BzrError.__init__(self)
 
746
        self.branch = branch
 
747
        self.branch_base = branch.base
 
748
        self.path = path
 
749
 
 
750
 
 
751
class UnsupportedFormatError(BzrError):
 
752
 
 
753
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
754
 
 
755
 
 
756
class UnknownFormatError(BzrError):
 
757
    
 
758
    _fmt = "Unknown %(kind)s format: %(format)r"
 
759
 
 
760
    def __init__(self, format, kind='branch'):
 
761
        self.kind = kind
 
762
        self.format = format
 
763
 
 
764
 
 
765
class IncompatibleFormat(BzrError):
 
766
    
 
767
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
768
 
 
769
    def __init__(self, format, bzrdir_format):
 
770
        BzrError.__init__(self)
 
771
        self.format = format
 
772
        self.bzrdir = bzrdir_format
 
773
 
 
774
 
 
775
class IncompatibleRepositories(BzrError):
 
776
 
 
777
    _fmt = "Repository %(target)s is not compatible with repository"\
 
778
        " %(source)s"
 
779
 
 
780
    def __init__(self, source, target):
 
781
        BzrError.__init__(self, target=target, source=source)
 
782
 
 
783
 
 
784
class IncompatibleRevision(BzrError):
 
785
    
 
786
    _fmt = "Revision is not compatible with %(repo_format)s"
 
787
 
 
788
    def __init__(self, repo_format):
 
789
        BzrError.__init__(self)
 
790
        self.repo_format = repo_format
 
791
 
 
792
 
 
793
class AlreadyVersionedError(BzrError):
 
794
    """Used when a path is expected not to be versioned, but it is."""
 
795
 
 
796
    _fmt = "%(context_info)s%(path)s is already versioned."
 
797
 
 
798
    def __init__(self, path, context_info=None):
 
799
        """Construct a new AlreadyVersionedError.
 
800
 
 
801
        :param path: This is the path which is versioned,
 
802
        which should be in a user friendly form.
 
803
        :param context_info: If given, this is information about the context,
 
804
        which could explain why this is expected to not be versioned.
 
805
        """
 
806
        BzrError.__init__(self)
 
807
        self.path = path
 
808
        if context_info is None:
 
809
            self.context_info = ''
 
810
        else:
 
811
            self.context_info = context_info + ". "
 
812
 
 
813
 
 
814
class NotVersionedError(BzrError):
 
815
    """Used when a path is expected to be versioned, but it is not."""
 
816
 
 
817
    _fmt = "%(context_info)s%(path)s is not versioned."
 
818
 
 
819
    def __init__(self, path, context_info=None):
 
820
        """Construct a new NotVersionedError.
 
821
 
 
822
        :param path: This is the path which is not versioned,
 
823
        which should be in a user friendly form.
 
824
        :param context_info: If given, this is information about the context,
 
825
        which could explain why this is expected to be versioned.
 
826
        """
 
827
        BzrError.__init__(self)
 
828
        self.path = path
 
829
        if context_info is None:
 
830
            self.context_info = ''
 
831
        else:
 
832
            self.context_info = context_info + ". "
 
833
 
 
834
 
 
835
class PathsNotVersionedError(BzrError):
 
836
    """Used when reporting several paths which are not versioned"""
 
837
 
 
838
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
 
839
 
 
840
    def __init__(self, paths):
 
841
        from bzrlib.osutils import quotefn
 
842
        BzrError.__init__(self)
 
843
        self.paths = paths
 
844
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
845
 
 
846
 
 
847
class PathsDoNotExist(BzrError):
 
848
 
 
849
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
850
 
 
851
    # used when reporting that paths are neither versioned nor in the working
 
852
    # tree
 
853
 
 
854
    def __init__(self, paths, extra=None):
 
855
        # circular import
 
856
        from bzrlib.osutils import quotefn
 
857
        BzrError.__init__(self)
 
858
        self.paths = paths
 
859
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
 
860
        if extra:
 
861
            self.extra = ': ' + str(extra)
 
862
        else:
 
863
            self.extra = ''
 
864
 
 
865
 
 
866
class BadFileKindError(BzrError):
 
867
 
 
868
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
869
 
 
870
    def __init__(self, filename, kind):
 
871
        BzrError.__init__(self, filename=filename, kind=kind)
 
872
 
 
873
 
 
874
class BadFilenameEncoding(BzrError):
 
875
 
 
876
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
877
            ' encoding %(fs_encoding)s')
 
878
 
 
879
    def __init__(self, filename, fs_encoding):
 
880
        BzrError.__init__(self)
 
881
        self.filename = filename
 
882
        self.fs_encoding = fs_encoding
 
883
 
 
884
 
 
885
class ForbiddenControlFileError(BzrError):
 
886
 
 
887
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
888
 
 
889
 
 
890
class LockError(InternalBzrError):
 
891
 
 
892
    _fmt = "Lock error: %(msg)s"
 
893
 
 
894
    # All exceptions from the lock/unlock functions should be from
 
895
    # this exception class.  They will be translated as necessary. The
 
896
    # original exception is available as e.original_error
 
897
    #
 
898
    # New code should prefer to raise specific subclasses
 
899
    def __init__(self, message):
 
900
        # Python 2.5 uses a slot for StandardError.message,
 
901
        # so use a different variable name.  We now work around this in
 
902
        # BzrError.__str__, but this member name is kept for compatability.
 
903
        self.msg = message
 
904
 
 
905
 
 
906
class LockActive(LockError):
 
907
 
 
908
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
909
 
 
910
    internal_error = False
 
911
 
 
912
    def __init__(self, lock_description):
 
913
        self.lock_description = lock_description
 
914
 
 
915
 
 
916
class CommitNotPossible(LockError):
 
917
 
 
918
    _fmt = "A commit was attempted but we do not have a write lock open."
 
919
 
 
920
    def __init__(self):
 
921
        pass
 
922
 
 
923
 
 
924
class AlreadyCommitted(LockError):
 
925
 
 
926
    _fmt = "A rollback was requested, but is not able to be accomplished."
 
927
 
 
928
    def __init__(self):
 
929
        pass
 
930
 
 
931
 
 
932
class ReadOnlyError(LockError):
 
933
 
 
934
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
 
935
 
 
936
    # TODO: There should also be an error indicating that you need a write
 
937
    # lock and don't have any lock at all... mbp 20070226
 
938
 
 
939
    def __init__(self, obj):
 
940
        self.obj = obj
 
941
 
 
942
 
 
943
class LockFailed(LockError):
 
944
 
 
945
    internal_error = False
 
946
 
 
947
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
948
 
 
949
    def __init__(self, lock, why):
 
950
        LockError.__init__(self, '')
 
951
        self.lock = lock
 
952
        self.why = why
 
953
 
 
954
 
 
955
class OutSideTransaction(BzrError):
 
956
 
 
957
    _fmt = ("A transaction related operation was attempted after"
 
958
            " the transaction finished.")
 
959
 
 
960
 
 
961
class ObjectNotLocked(LockError):
 
962
 
 
963
    _fmt = "%(obj)r is not locked"
 
964
 
 
965
    # this can indicate that any particular object is not locked; see also
 
966
    # LockNotHeld which means that a particular *lock* object is not held by
 
967
    # the caller -- perhaps they should be unified.
 
968
    def __init__(self, obj):
 
969
        self.obj = obj
 
970
 
 
971
 
 
972
class ReadOnlyObjectDirtiedError(ReadOnlyError):
 
973
 
 
974
    _fmt = "Cannot change object %(obj)r in read only transaction"
 
975
 
 
976
    def __init__(self, obj):
 
977
        self.obj = obj
 
978
 
 
979
 
 
980
class UnlockableTransport(LockError):
 
981
 
 
982
    internal_error = False
 
983
 
 
984
    _fmt = "Cannot lock: transport is read only: %(transport)s"
 
985
 
 
986
    def __init__(self, transport):
 
987
        self.transport = transport
 
988
 
 
989
 
 
990
class LockContention(LockError):
 
991
 
 
992
    _fmt = 'Could not acquire lock "%(lock)s"'
 
993
    # TODO: show full url for lock, combining the transport and relative
 
994
    # bits?
 
995
 
 
996
    internal_error = False
 
997
 
 
998
    def __init__(self, lock):
 
999
        self.lock = lock
 
1000
 
 
1001
 
 
1002
class LockBroken(LockError):
 
1003
 
 
1004
    _fmt = ("Lock was broken while still open: %(lock)s"
 
1005
            " - check storage consistency!")
 
1006
 
 
1007
    internal_error = False
 
1008
 
 
1009
    def __init__(self, lock):
 
1010
        self.lock = lock
 
1011
 
 
1012
 
 
1013
class LockBreakMismatch(LockError):
 
1014
 
 
1015
    _fmt = ("Lock was released and re-acquired before being broken:"
 
1016
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
1017
 
 
1018
    internal_error = False
 
1019
 
 
1020
    def __init__(self, lock, holder, target):
 
1021
        self.lock = lock
 
1022
        self.holder = holder
 
1023
        self.target = target
 
1024
 
 
1025
 
 
1026
class LockNotHeld(LockError):
 
1027
 
 
1028
    _fmt = "Lock not held: %(lock)s"
 
1029
 
 
1030
    internal_error = False
 
1031
 
 
1032
    def __init__(self, lock):
 
1033
        self.lock = lock
 
1034
 
 
1035
 
 
1036
class TokenLockingNotSupported(LockError):
 
1037
 
 
1038
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
1039
 
 
1040
    def __init__(self, obj):
 
1041
        self.obj = obj
 
1042
 
 
1043
 
 
1044
class TokenMismatch(LockBroken):
 
1045
 
 
1046
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
1047
 
 
1048
    internal_error = True
 
1049
 
 
1050
    def __init__(self, given_token, lock_token):
 
1051
        self.given_token = given_token
 
1052
        self.lock_token = lock_token
 
1053
 
 
1054
 
 
1055
class PointlessCommit(BzrError):
 
1056
 
 
1057
    _fmt = "No changes to commit"
 
1058
 
 
1059
 
 
1060
class CannotCommitSelectedFileMerge(BzrError):
 
1061
 
 
1062
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
1063
        ' files %(files_str)s'
 
1064
 
 
1065
    def __init__(self, files):
 
1066
        files_str = ', '.join(files)
 
1067
        BzrError.__init__(self, files=files, files_str=files_str)
 
1068
 
 
1069
 
 
1070
class BadCommitMessageEncoding(BzrError):
 
1071
 
 
1072
    _fmt = 'The specified commit message contains characters unsupported by '\
 
1073
        'the current encoding.'
 
1074
 
 
1075
 
 
1076
class UpgradeReadonly(BzrError):
 
1077
 
 
1078
    _fmt = "Upgrade URL cannot work with readonly URLs."
 
1079
 
 
1080
 
 
1081
class UpToDateFormat(BzrError):
 
1082
 
 
1083
    _fmt = "The branch format %(format)s is already at the most recent format."
 
1084
 
 
1085
    def __init__(self, format):
 
1086
        BzrError.__init__(self)
 
1087
        self.format = format
 
1088
 
 
1089
 
 
1090
class StrictCommitFailed(Exception):
 
1091
 
 
1092
    _fmt = "Commit refused because there are unknowns in the tree."
 
1093
 
 
1094
 
 
1095
class NoSuchRevision(InternalBzrError):
 
1096
 
 
1097
    _fmt = "%(branch)s has no revision %(revision)s"
 
1098
 
 
1099
    def __init__(self, branch, revision):
 
1100
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
 
1101
        BzrError.__init__(self, branch=branch, revision=revision)
 
1102
 
 
1103
 
 
1104
class RangeInChangeOption(BzrError):
 
1105
 
 
1106
    _fmt = "Option --change does not accept revision ranges"
 
1107
 
 
1108
 
 
1109
class NoSuchRevisionSpec(BzrError):
 
1110
 
 
1111
    _fmt = "No namespace registered for string: %(spec)r"
 
1112
 
 
1113
    def __init__(self, spec):
 
1114
        BzrError.__init__(self, spec=spec)
 
1115
 
 
1116
 
 
1117
class NoSuchRevisionInTree(NoSuchRevision):
 
1118
    """When using Tree.revision_tree, and the revision is not accessible."""
 
1119
    
 
1120
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
 
1121
 
 
1122
    def __init__(self, tree, revision_id):
 
1123
        BzrError.__init__(self)
 
1124
        self.tree = tree
 
1125
        self.revision_id = revision_id
 
1126
 
 
1127
 
 
1128
class InvalidRevisionSpec(BzrError):
 
1129
 
 
1130
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
1131
            " %(branch)s%(extra)s")
 
1132
 
 
1133
    def __init__(self, spec, branch, extra=None):
 
1134
        BzrError.__init__(self, branch=branch, spec=spec)
 
1135
        if extra:
 
1136
            self.extra = '\n' + str(extra)
 
1137
        else:
 
1138
            self.extra = ''
 
1139
 
 
1140
 
 
1141
class HistoryMissing(BzrError):
 
1142
 
 
1143
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
1144
 
 
1145
 
 
1146
class AppendRevisionsOnlyViolation(BzrError):
 
1147
 
 
1148
    _fmt = ('Operation denied because it would change the main history,'
 
1149
           ' which is not permitted by the append_revisions_only setting on'
 
1150
           ' branch "%(location)s".')
 
1151
 
 
1152
    def __init__(self, location):
 
1153
       import bzrlib.urlutils as urlutils
 
1154
       location = urlutils.unescape_for_display(location, 'ascii')
 
1155
       BzrError.__init__(self, location=location)
 
1156
 
 
1157
 
 
1158
class DivergedBranches(BzrError):
 
1159
 
 
1160
    _fmt = ("These branches have diverged."
 
1161
            " Use the merge command to reconcile them.")
 
1162
 
 
1163
    def __init__(self, branch1, branch2):
 
1164
        self.branch1 = branch1
 
1165
        self.branch2 = branch2
 
1166
 
 
1167
 
 
1168
class NotLefthandHistory(InternalBzrError):
 
1169
 
 
1170
    _fmt = "Supplied history does not follow left-hand parents"
 
1171
 
 
1172
    def __init__(self, history):
 
1173
        BzrError.__init__(self, history=history)
 
1174
 
 
1175
 
 
1176
class UnrelatedBranches(BzrError):
 
1177
 
 
1178
    _fmt = ("Branches have no common ancestor, and"
 
1179
            " no merge base revision was specified.")
 
1180
 
 
1181
 
 
1182
class CannotReverseCherrypick(BzrError):
 
1183
 
 
1184
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
1185
            ' or diff3.')
 
1186
 
 
1187
 
 
1188
class NoCommonAncestor(BzrError):
 
1189
    
 
1190
    _fmt = "Revisions have no common ancestor: %(revision_a)s %(revision_b)s"
 
1191
 
 
1192
    def __init__(self, revision_a, revision_b):
 
1193
        self.revision_a = revision_a
 
1194
        self.revision_b = revision_b
 
1195
 
 
1196
 
 
1197
class NoCommonRoot(BzrError):
 
1198
 
 
1199
    _fmt = ("Revisions are not derived from the same root: "
 
1200
           "%(revision_a)s %(revision_b)s.")
 
1201
 
 
1202
    def __init__(self, revision_a, revision_b):
 
1203
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
 
1204
 
 
1205
 
 
1206
class NotAncestor(BzrError):
 
1207
 
 
1208
    _fmt = "Revision %(rev_id)s is not an ancestor of %(not_ancestor_id)s"
 
1209
 
 
1210
    def __init__(self, rev_id, not_ancestor_id):
 
1211
        BzrError.__init__(self, rev_id=rev_id,
 
1212
            not_ancestor_id=not_ancestor_id)
 
1213
 
 
1214
 
 
1215
class InstallFailed(BzrError):
 
1216
 
 
1217
    def __init__(self, revisions):
 
1218
        revision_str = ", ".join(str(r) for r in revisions)
 
1219
        msg = "Could not install revisions:\n%s" % revision_str
 
1220
        BzrError.__init__(self, msg)
 
1221
        self.revisions = revisions
 
1222
 
 
1223
 
 
1224
class AmbiguousBase(BzrError):
 
1225
 
 
1226
    def __init__(self, bases):
 
1227
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
 
1228
                DeprecationWarning)
 
1229
        msg = ("The correct base is unclear, because %s are all equally close"
 
1230
                % ", ".join(bases))
 
1231
        BzrError.__init__(self, msg)
 
1232
        self.bases = bases
 
1233
 
 
1234
 
 
1235
class NoCommits(BranchError):
 
1236
 
 
1237
    _fmt = "Branch %(branch)s has no commits."
 
1238
 
 
1239
 
 
1240
class UnlistableStore(BzrError):
 
1241
 
 
1242
    def __init__(self, store):
 
1243
        BzrError.__init__(self, "Store %s is not listable" % store)
 
1244
 
 
1245
 
 
1246
 
 
1247
class UnlistableBranch(BzrError):
 
1248
 
 
1249
    def __init__(self, br):
 
1250
        BzrError.__init__(self, "Stores for branch %s are not listable" % br)
 
1251
 
 
1252
 
 
1253
class BoundBranchOutOfDate(BzrError):
 
1254
 
 
1255
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
1256
            " %(master)s.")
 
1257
 
 
1258
    def __init__(self, branch, master):
 
1259
        BzrError.__init__(self)
 
1260
        self.branch = branch
 
1261
        self.master = master
 
1262
 
 
1263
        
 
1264
class CommitToDoubleBoundBranch(BzrError):
 
1265
 
 
1266
    _fmt = ("Cannot commit to branch %(branch)s."
 
1267
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
1268
 
 
1269
    def __init__(self, branch, master, remote):
 
1270
        BzrError.__init__(self)
 
1271
        self.branch = branch
 
1272
        self.master = master
 
1273
        self.remote = remote
 
1274
 
 
1275
 
 
1276
class OverwriteBoundBranch(BzrError):
 
1277
 
 
1278
    _fmt = "Cannot pull --overwrite to a branch which is bound %(branch)s"
 
1279
 
 
1280
    def __init__(self, branch):
 
1281
        BzrError.__init__(self)
 
1282
        self.branch = branch
 
1283
 
 
1284
 
 
1285
class BoundBranchConnectionFailure(BzrError):
 
1286
 
 
1287
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
1288
            " => %(target)s: %(error)s")
 
1289
 
 
1290
    def __init__(self, branch, target, error):
 
1291
        BzrError.__init__(self)
 
1292
        self.branch = branch
 
1293
        self.target = target
 
1294
        self.error = error
 
1295
 
 
1296
 
 
1297
class WeaveError(BzrError):
 
1298
 
 
1299
    _fmt = "Error in processing weave: %(message)s"
 
1300
 
 
1301
    def __init__(self, message=None):
 
1302
        BzrError.__init__(self)
 
1303
        self.message = message
 
1304
 
 
1305
 
 
1306
class WeaveRevisionAlreadyPresent(WeaveError):
 
1307
 
 
1308
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
1309
 
 
1310
    def __init__(self, revision_id, weave):
 
1311
 
 
1312
        WeaveError.__init__(self)
 
1313
        self.revision_id = revision_id
 
1314
        self.weave = weave
 
1315
 
 
1316
 
 
1317
class WeaveRevisionNotPresent(WeaveError):
 
1318
 
 
1319
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
1320
 
 
1321
    def __init__(self, revision_id, weave):
 
1322
        WeaveError.__init__(self)
 
1323
        self.revision_id = revision_id
 
1324
        self.weave = weave
 
1325
 
 
1326
 
 
1327
class WeaveFormatError(WeaveError):
 
1328
 
 
1329
    _fmt = "Weave invariant violated: %(what)s"
 
1330
 
 
1331
    def __init__(self, what):
 
1332
        WeaveError.__init__(self)
 
1333
        self.what = what
 
1334
 
 
1335
 
 
1336
class WeaveParentMismatch(WeaveError):
 
1337
 
 
1338
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
1339
    
 
1340
 
 
1341
class WeaveInvalidChecksum(WeaveError):
 
1342
 
 
1343
    _fmt = "Text did not match it's checksum: %(message)s"
 
1344
 
 
1345
 
 
1346
class WeaveTextDiffers(WeaveError):
 
1347
 
 
1348
    _fmt = ("Weaves differ on text content. Revision:"
 
1349
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1350
 
 
1351
    def __init__(self, revision_id, weave_a, weave_b):
 
1352
        WeaveError.__init__(self)
 
1353
        self.revision_id = revision_id
 
1354
        self.weave_a = weave_a
 
1355
        self.weave_b = weave_b
 
1356
 
 
1357
 
 
1358
class WeaveTextDiffers(WeaveError):
 
1359
 
 
1360
    _fmt = ("Weaves differ on text content. Revision:"
 
1361
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
1362
 
 
1363
    def __init__(self, revision_id, weave_a, weave_b):
 
1364
        WeaveError.__init__(self)
 
1365
        self.revision_id = revision_id
 
1366
        self.weave_a = weave_a
 
1367
        self.weave_b = weave_b
 
1368
 
 
1369
 
 
1370
class VersionedFileError(BzrError):
 
1371
    
 
1372
    _fmt = "Versioned file error"
 
1373
 
 
1374
 
 
1375
class RevisionNotPresent(VersionedFileError):
 
1376
    
 
1377
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
 
1378
 
 
1379
    def __init__(self, revision_id, file_id):
 
1380
        VersionedFileError.__init__(self)
 
1381
        self.revision_id = revision_id
 
1382
        self.file_id = file_id
 
1383
 
 
1384
 
 
1385
class RevisionAlreadyPresent(VersionedFileError):
 
1386
    
 
1387
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
 
1388
 
 
1389
    def __init__(self, revision_id, file_id):
 
1390
        VersionedFileError.__init__(self)
 
1391
        self.revision_id = revision_id
 
1392
        self.file_id = file_id
 
1393
 
 
1394
 
 
1395
class VersionedFileInvalidChecksum(VersionedFileError):
 
1396
 
 
1397
    _fmt = "Text did not match its checksum: %(message)s"
 
1398
 
 
1399
 
 
1400
class KnitError(InternalBzrError):
 
1401
    
 
1402
    _fmt = "Knit error"
 
1403
 
 
1404
 
 
1405
class KnitCorrupt(KnitError):
 
1406
 
 
1407
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
1408
 
 
1409
    def __init__(self, filename, how):
 
1410
        KnitError.__init__(self)
 
1411
        self.filename = filename
 
1412
        self.how = how
 
1413
 
 
1414
 
 
1415
class KnitDataStreamIncompatible(KnitError):
 
1416
    # Not raised anymore, as we can convert data streams.  In future we may
 
1417
    # need it again for more exotic cases, so we're keeping it around for now.
 
1418
 
 
1419
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
1420
 
 
1421
    def __init__(self, stream_format, target_format):
 
1422
        self.stream_format = stream_format
 
1423
        self.target_format = target_format
 
1424
        
 
1425
 
 
1426
class KnitDataStreamUnknown(KnitError):
 
1427
    # Indicates a data stream we don't know how to handle.
 
1428
 
 
1429
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
1430
 
 
1431
    def __init__(self, stream_format):
 
1432
        self.stream_format = stream_format
 
1433
        
 
1434
 
 
1435
class KnitHeaderError(KnitError):
 
1436
 
 
1437
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
1438
 
 
1439
    def __init__(self, badline, filename):
 
1440
        KnitError.__init__(self)
 
1441
        self.badline = badline
 
1442
        self.filename = filename
 
1443
 
 
1444
class KnitIndexUnknownMethod(KnitError):
 
1445
    """Raised when we don't understand the storage method.
 
1446
 
 
1447
    Currently only 'fulltext' and 'line-delta' are supported.
 
1448
    """
 
1449
    
 
1450
    _fmt = ("Knit index %(filename)s does not have a known method"
 
1451
            " in options: %(options)r")
 
1452
 
 
1453
    def __init__(self, filename, options):
 
1454
        KnitError.__init__(self)
 
1455
        self.filename = filename
 
1456
        self.options = options
 
1457
 
 
1458
 
 
1459
class NoSuchExportFormat(BzrError):
 
1460
    
 
1461
    _fmt = "Export format %(format)r not supported"
 
1462
 
 
1463
    def __init__(self, format):
 
1464
        BzrError.__init__(self)
 
1465
        self.format = format
 
1466
 
 
1467
 
 
1468
class TransportError(BzrError):
 
1469
    
 
1470
    _fmt = "Transport error: %(msg)s %(orig_error)s"
 
1471
 
 
1472
    def __init__(self, msg=None, orig_error=None):
 
1473
        if msg is None and orig_error is not None:
 
1474
            msg = str(orig_error)
 
1475
        if orig_error is None:
 
1476
            orig_error = ''
 
1477
        if msg is None:
 
1478
            msg =  ''
 
1479
        self.msg = msg
 
1480
        self.orig_error = orig_error
 
1481
        BzrError.__init__(self)
 
1482
 
 
1483
 
 
1484
class TooManyConcurrentRequests(InternalBzrError):
 
1485
 
 
1486
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
1487
            " Be sure to finish_writing and finish_reading on the"
 
1488
            " currently open request.")
 
1489
 
 
1490
    def __init__(self, medium):
 
1491
        self.medium = medium
 
1492
 
 
1493
 
 
1494
class SmartProtocolError(TransportError):
 
1495
 
 
1496
    _fmt = "Generic bzr smart protocol error: %(details)s"
 
1497
 
 
1498
    def __init__(self, details):
 
1499
        self.details = details
 
1500
 
 
1501
 
 
1502
class UnexpectedProtocolVersionMarker(TransportError):
 
1503
 
 
1504
    _fmt = "Received bad protocol version marker: %(marker)r"
 
1505
 
 
1506
    def __init__(self, marker):
 
1507
        self.marker = marker
 
1508
 
 
1509
 
 
1510
class UnknownSmartMethod(InternalBzrError):
 
1511
 
 
1512
    _fmt = "The server does not recognise the '%(verb)s' request."
 
1513
 
 
1514
    def __init__(self, verb):
 
1515
        self.verb = verb
 
1516
 
 
1517
 
 
1518
class SmartMessageHandlerError(InternalBzrError):
 
1519
 
 
1520
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
1521
 
 
1522
    def __init__(self, exc_info):
 
1523
        self.exc_type, self.exc_value, self.tb = exc_info
 
1524
        
 
1525
 
 
1526
# A set of semi-meaningful errors which can be thrown
 
1527
class TransportNotPossible(TransportError):
 
1528
 
 
1529
    _fmt = "Transport operation not possible: %(msg)s %(orig_error)s"
 
1530
 
 
1531
 
 
1532
class ConnectionError(TransportError):
 
1533
 
 
1534
    _fmt = "Connection error: %(msg)s %(orig_error)s"
 
1535
 
 
1536
 
 
1537
class SocketConnectionError(ConnectionError):
 
1538
 
 
1539
    _fmt = "%(msg)s %(host)s%(port)s%(orig_error)s"
 
1540
 
 
1541
    def __init__(self, host, port=None, msg=None, orig_error=None):
 
1542
        if msg is None:
 
1543
            msg = 'Failed to connect to'
 
1544
        if orig_error is None:
 
1545
            orig_error = ''
 
1546
        else:
 
1547
            orig_error = '; ' + str(orig_error)
 
1548
        ConnectionError.__init__(self, msg=msg, orig_error=orig_error)
 
1549
        self.host = host
 
1550
        if port is None:
 
1551
            self.port = ''
 
1552
        else:
 
1553
            self.port = ':%s' % port
 
1554
 
 
1555
 
 
1556
class ConnectionReset(TransportError):
 
1557
 
 
1558
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
 
1559
 
 
1560
 
 
1561
class InvalidRange(TransportError):
 
1562
 
 
1563
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
1564
 
 
1565
    def __init__(self, path, offset, msg=None):
 
1566
        TransportError.__init__(self, msg)
 
1567
        self.path = path
 
1568
        self.offset = offset
 
1569
 
 
1570
 
 
1571
class InvalidHttpResponse(TransportError):
 
1572
 
 
1573
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
1574
 
 
1575
    def __init__(self, path, msg, orig_error=None):
 
1576
        self.path = path
 
1577
        TransportError.__init__(self, msg, orig_error=orig_error)
 
1578
 
 
1579
 
 
1580
class InvalidHttpRange(InvalidHttpResponse):
 
1581
 
 
1582
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
 
1583
 
 
1584
    def __init__(self, path, range, msg):
 
1585
        self.range = range
 
1586
        InvalidHttpResponse.__init__(self, path, msg)
 
1587
 
 
1588
 
 
1589
class InvalidHttpContentType(InvalidHttpResponse):
 
1590
 
 
1591
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
 
1592
 
 
1593
    def __init__(self, path, ctype, msg):
 
1594
        self.ctype = ctype
 
1595
        InvalidHttpResponse.__init__(self, path, msg)
 
1596
 
 
1597
 
 
1598
class RedirectRequested(TransportError):
 
1599
 
 
1600
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
1601
 
 
1602
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
 
1603
        self.source = source
 
1604
        self.target = target
 
1605
        if is_permanent:
 
1606
            self.permanently = ' permanently'
 
1607
        else:
 
1608
            self.permanently = ''
 
1609
        self._qualified_proto = qual_proto
 
1610
        TransportError.__init__(self)
 
1611
 
 
1612
    def _requalify_url(self, url):
 
1613
        """Restore the qualified proto in front of the url"""
 
1614
        # When this exception is raised, source and target are in
 
1615
        # user readable format. But some transports may use a
 
1616
        # different proto (http+urllib:// will present http:// to
 
1617
        # the user. If a qualified proto is specified, the code
 
1618
        # trapping the exception can get the qualified urls to
 
1619
        # properly handle the redirection themself (creating a
 
1620
        # new transport object from the target url for example).
 
1621
        # But checking that the scheme of the original and
 
1622
        # redirected urls are the same can be tricky. (see the
 
1623
        # FIXME in BzrDir.open_from_transport for the unique use
 
1624
        # case so far).
 
1625
        if self._qualified_proto is None:
 
1626
            return url
 
1627
 
 
1628
        # The TODO related to NotBranchError mention that doing
 
1629
        # that kind of manipulation on the urls may not be the
 
1630
        # exception object job. On the other hand, this object is
 
1631
        # the interface between the code and the user so
 
1632
        # presenting the urls in different ways is indeed its
 
1633
        # job...
 
1634
        import urlparse
 
1635
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
1636
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
1637
                                   query, fragment))
 
1638
 
 
1639
    def get_source_url(self):
 
1640
        return self._requalify_url(self.source)
 
1641
 
 
1642
    def get_target_url(self):
 
1643
        return self._requalify_url(self.target)
 
1644
 
 
1645
 
 
1646
class TooManyRedirections(TransportError):
 
1647
 
 
1648
    _fmt = "Too many redirections"
 
1649
 
 
1650
 
 
1651
class ConflictsInTree(BzrError):
 
1652
 
 
1653
    _fmt = "Working tree has conflicts."
 
1654
 
 
1655
 
 
1656
class ParseConfigError(BzrError):
 
1657
 
 
1658
    def __init__(self, errors, filename):
 
1659
        if filename is None:
 
1660
            filename = ""
 
1661
        message = "Error(s) parsing config file %s:\n%s" % \
 
1662
            (filename, ('\n'.join(e.message for e in errors)))
 
1663
        BzrError.__init__(self, message)
 
1664
 
 
1665
 
 
1666
class NoEmailInUsername(BzrError):
 
1667
 
 
1668
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
1669
 
 
1670
    def __init__(self, username):
 
1671
        BzrError.__init__(self)
 
1672
        self.username = username
 
1673
 
 
1674
 
 
1675
class SigningFailed(BzrError):
 
1676
 
 
1677
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
1678
 
 
1679
    def __init__(self, command_line):
 
1680
        BzrError.__init__(self, command_line=command_line)
 
1681
 
 
1682
 
 
1683
class WorkingTreeNotRevision(BzrError):
 
1684
 
 
1685
    _fmt = ("The working tree for %(basedir)s has changed since" 
 
1686
            " the last commit, but weave merge requires that it be"
 
1687
            " unchanged")
 
1688
 
 
1689
    def __init__(self, tree):
 
1690
        BzrError.__init__(self, basedir=tree.basedir)
 
1691
 
 
1692
 
 
1693
class CantReprocessAndShowBase(BzrError):
 
1694
 
 
1695
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
1696
           "the relationship of conflicting lines to the base")
 
1697
 
 
1698
 
 
1699
class GraphCycleError(BzrError):
 
1700
 
 
1701
    _fmt = "Cycle in graph %(graph)r"
 
1702
 
 
1703
    def __init__(self, graph):
 
1704
        BzrError.__init__(self)
 
1705
        self.graph = graph
 
1706
 
 
1707
 
 
1708
class WritingCompleted(InternalBzrError):
 
1709
 
 
1710
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
 
1711
            "called upon it - accept bytes may not be called anymore.")
 
1712
 
 
1713
    def __init__(self, request):
 
1714
        self.request = request
 
1715
 
 
1716
 
 
1717
class WritingNotComplete(InternalBzrError):
 
1718
 
 
1719
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
 
1720
            "called upon it - until the write phase is complete no "
 
1721
            "data may be read.")
 
1722
 
 
1723
    def __init__(self, request):
 
1724
        self.request = request
 
1725
 
 
1726
 
 
1727
class NotConflicted(BzrError):
 
1728
 
 
1729
    _fmt = "File %(filename)s is not conflicted."
 
1730
 
 
1731
    def __init__(self, filename):
 
1732
        BzrError.__init__(self)
 
1733
        self.filename = filename
 
1734
 
 
1735
 
 
1736
class MediumNotConnected(InternalBzrError):
 
1737
 
 
1738
    _fmt = """The medium '%(medium)s' is not connected."""
 
1739
 
 
1740
    def __init__(self, medium):
 
1741
        self.medium = medium
 
1742
 
 
1743
 
 
1744
class MustUseDecorated(Exception):
 
1745
 
 
1746
    _fmt = "A decorating function has requested its original command be used."
 
1747
 
 
1748
 
 
1749
class NoBundleFound(BzrError):
 
1750
 
 
1751
    _fmt = 'No bundle was found in "%(filename)s".'
 
1752
 
 
1753
    def __init__(self, filename):
 
1754
        BzrError.__init__(self)
 
1755
        self.filename = filename
 
1756
 
 
1757
 
 
1758
class BundleNotSupported(BzrError):
 
1759
 
 
1760
    _fmt = "Unable to handle bundle version %(version)s: %(msg)s"
 
1761
 
 
1762
    def __init__(self, version, msg):
 
1763
        BzrError.__init__(self)
 
1764
        self.version = version
 
1765
        self.msg = msg
 
1766
 
 
1767
 
 
1768
class MissingText(BzrError):
 
1769
 
 
1770
    _fmt = ("Branch %(base)s is missing revision"
 
1771
            " %(text_revision)s of %(file_id)s")
 
1772
 
 
1773
    def __init__(self, branch, text_revision, file_id):
 
1774
        BzrError.__init__(self)
 
1775
        self.branch = branch
 
1776
        self.base = branch.base
 
1777
        self.text_revision = text_revision
 
1778
        self.file_id = file_id
 
1779
 
 
1780
 
 
1781
class DuplicateFileId(BzrError):
 
1782
 
 
1783
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
1784
 
 
1785
    def __init__(self, file_id, entry):
 
1786
        BzrError.__init__(self)
 
1787
        self.file_id = file_id
 
1788
        self.entry = entry
 
1789
 
 
1790
 
 
1791
class DuplicateKey(BzrError):
 
1792
 
 
1793
    _fmt = "Key %(key)s is already present in map"
 
1794
 
 
1795
 
 
1796
class DuplicateHelpPrefix(BzrError):
 
1797
 
 
1798
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
1799
 
 
1800
    def __init__(self, prefix):
 
1801
        self.prefix = prefix
 
1802
 
 
1803
 
 
1804
class MalformedTransform(BzrError):
 
1805
 
 
1806
    _fmt = "Tree transform is malformed %(conflicts)r"
 
1807
 
 
1808
 
 
1809
class NoFinalPath(BzrError):
 
1810
 
 
1811
    _fmt = ("No final name for trans_id %(trans_id)r\n"
 
1812
            "file-id: %(file_id)r\n"
 
1813
            "root trans-id: %(root_trans_id)r\n")
 
1814
 
 
1815
    def __init__(self, trans_id, transform):
 
1816
        self.trans_id = trans_id
 
1817
        self.file_id = transform.final_file_id(trans_id)
 
1818
        self.root_trans_id = transform.root
 
1819
 
 
1820
 
 
1821
class BzrBadParameter(InternalBzrError):
 
1822
 
 
1823
    _fmt = "Bad parameter: %(param)r"
 
1824
 
 
1825
    # This exception should never be thrown, but it is a base class for all
 
1826
    # parameter-to-function errors.
 
1827
 
 
1828
    def __init__(self, param):
 
1829
        BzrError.__init__(self)
 
1830
        self.param = param
 
1831
 
 
1832
 
 
1833
class BzrBadParameterNotUnicode(BzrBadParameter):
 
1834
 
 
1835
    _fmt = "Parameter %(param)s is neither unicode nor utf8."
 
1836
 
 
1837
 
 
1838
class ReusingTransform(BzrError):
 
1839
 
 
1840
    _fmt = "Attempt to reuse a transform that has already been applied."
 
1841
 
 
1842
 
 
1843
class CantMoveRoot(BzrError):
 
1844
 
 
1845
    _fmt = "Moving the root directory is not supported at this time"
 
1846
 
 
1847
 
 
1848
class BzrMoveFailedError(BzrError):
 
1849
 
 
1850
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
1851
 
 
1852
    def __init__(self, from_path='', to_path='', extra=None):
 
1853
        BzrError.__init__(self)
 
1854
        if extra:
 
1855
            self.extra = ': ' + str(extra)
 
1856
        else:
 
1857
            self.extra = ''
 
1858
 
 
1859
        has_from = len(from_path) > 0
 
1860
        has_to = len(to_path) > 0
 
1861
        if has_from:
 
1862
            self.from_path = osutils.splitpath(from_path)[-1]
 
1863
        else:
 
1864
            self.from_path = ''
 
1865
 
 
1866
        if has_to:
 
1867
            self.to_path = osutils.splitpath(to_path)[-1]
 
1868
        else:
 
1869
            self.to_path = ''
 
1870
 
 
1871
        self.operator = ""
 
1872
        if has_from and has_to:
 
1873
            self.operator = " =>"
 
1874
        elif has_from:
 
1875
            self.from_path = "from " + from_path
 
1876
        elif has_to:
 
1877
            self.operator = "to"
 
1878
        else:
 
1879
            self.operator = "file"
 
1880
 
 
1881
 
 
1882
class BzrRenameFailedError(BzrMoveFailedError):
 
1883
 
 
1884
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
1885
 
 
1886
    def __init__(self, from_path, to_path, extra=None):
 
1887
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
 
1888
 
 
1889
class BzrRemoveChangedFilesError(BzrError):
 
1890
    """Used when user is trying to remove changed files."""
 
1891
 
 
1892
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
1893
        "%(changes_as_text)s"
 
1894
        "Use --keep to not delete them, or --force to delete them regardless.")
 
1895
 
 
1896
    def __init__(self, tree_delta):
 
1897
        BzrError.__init__(self)
 
1898
        self.changes_as_text = tree_delta.get_changes_as_text()
 
1899
        #self.paths_as_string = '\n'.join(changed_files)
 
1900
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
1901
 
 
1902
 
 
1903
class BzrBadParameterNotString(BzrBadParameter):
 
1904
 
 
1905
    _fmt = "Parameter %(param)s is not a string or unicode string."
 
1906
 
 
1907
 
 
1908
class BzrBadParameterMissing(BzrBadParameter):
 
1909
 
 
1910
    _fmt = "Parameter $(param)s is required but not present."
 
1911
 
 
1912
 
 
1913
class BzrBadParameterUnicode(BzrBadParameter):
 
1914
 
 
1915
    _fmt = ("Parameter %(param)s is unicode but"
 
1916
            " only byte-strings are permitted.")
 
1917
 
 
1918
 
 
1919
class BzrBadParameterContainsNewline(BzrBadParameter):
 
1920
 
 
1921
    _fmt = "Parameter %(param)s contains a newline."
 
1922
 
 
1923
 
 
1924
class DependencyNotPresent(BzrError):
 
1925
 
 
1926
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
1927
 
 
1928
    def __init__(self, library, error):
 
1929
        BzrError.__init__(self, library=library, error=error)
 
1930
 
 
1931
 
 
1932
class ParamikoNotPresent(DependencyNotPresent):
 
1933
 
 
1934
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
 
1935
 
 
1936
    def __init__(self, error):
 
1937
        DependencyNotPresent.__init__(self, 'paramiko', error)
 
1938
 
 
1939
 
 
1940
class PointlessMerge(BzrError):
 
1941
 
 
1942
    _fmt = "Nothing to merge."
 
1943
 
 
1944
 
 
1945
class UninitializableFormat(BzrError):
 
1946
 
 
1947
    _fmt = "Format %(format)s cannot be initialised by this version of bzr."
 
1948
 
 
1949
    def __init__(self, format):
 
1950
        BzrError.__init__(self)
 
1951
        self.format = format
 
1952
 
 
1953
 
 
1954
class BadConversionTarget(BzrError):
 
1955
 
 
1956
    _fmt = "Cannot convert to format %(format)s.  %(problem)s"
 
1957
 
 
1958
    def __init__(self, problem, format):
 
1959
        BzrError.__init__(self)
 
1960
        self.problem = problem
 
1961
        self.format = format
 
1962
 
 
1963
 
 
1964
class NoDiffFound(BzrError):
 
1965
 
 
1966
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
1967
 
 
1968
    def __init__(self, path):
 
1969
        BzrError.__init__(self, path)
 
1970
 
 
1971
 
 
1972
class ExecutableMissing(BzrError):
 
1973
 
 
1974
    _fmt = "%(exe_name)s could not be found on this machine"
 
1975
 
 
1976
    def __init__(self, exe_name):
 
1977
        BzrError.__init__(self, exe_name=exe_name)
 
1978
 
 
1979
 
 
1980
class NoDiff(BzrError):
 
1981
 
 
1982
    _fmt = "Diff is not installed on this machine: %(msg)s"
 
1983
 
 
1984
    def __init__(self, msg):
 
1985
        BzrError.__init__(self, msg=msg)
 
1986
 
 
1987
 
 
1988
class NoDiff3(BzrError):
 
1989
 
 
1990
    _fmt = "Diff3 is not installed on this machine."
 
1991
 
 
1992
 
 
1993
class ExistingContent(BzrError):
 
1994
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
1995
 
 
1996
    _fmt = "The content being inserted is already present."
 
1997
 
 
1998
 
 
1999
class ExistingLimbo(BzrError):
 
2000
 
 
2001
    _fmt = """This tree contains left-over files from a failed operation.
 
2002
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2003
    keep, and delete it when you are done."""
 
2004
    
 
2005
    def __init__(self, limbo_dir):
 
2006
       BzrError.__init__(self)
 
2007
       self.limbo_dir = limbo_dir
 
2008
 
 
2009
 
 
2010
class ExistingPendingDeletion(BzrError):
 
2011
 
 
2012
    _fmt = """This tree contains left-over files from a failed operation.
 
2013
    Please examine %(pending_deletion)s to see if it contains any files you
 
2014
    wish to keep, and delete it when you are done."""
 
2015
 
 
2016
    def __init__(self, pending_deletion):
 
2017
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2018
 
 
2019
 
 
2020
class ImmortalLimbo(BzrError):
 
2021
 
 
2022
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
 
2023
    Please examine %(limbo_dir)s to see if it contains any files you wish to
 
2024
    keep, and delete it when you are done."""
 
2025
 
 
2026
    def __init__(self, limbo_dir):
 
2027
       BzrError.__init__(self)
 
2028
       self.limbo_dir = limbo_dir
 
2029
 
 
2030
 
 
2031
class ImmortalPendingDeletion(BzrError):
 
2032
 
 
2033
    _fmt = ("Unable to delete transform temporary directory "
 
2034
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
2035
    "contains any files you wish to keep, and delete it when you are done.")
 
2036
 
 
2037
    def __init__(self, pending_deletion):
 
2038
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2039
 
 
2040
 
 
2041
class OutOfDateTree(BzrError):
 
2042
 
 
2043
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
2044
 
 
2045
    def __init__(self, tree):
 
2046
        BzrError.__init__(self)
 
2047
        self.tree = tree
 
2048
 
 
2049
 
 
2050
class PublicBranchOutOfDate(BzrError):
 
2051
 
 
2052
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
2053
        '"%(revstring)s".'
 
2054
 
 
2055
    def __init__(self, public_location, revstring):
 
2056
        import bzrlib.urlutils as urlutils
 
2057
        public_location = urlutils.unescape_for_display(public_location,
 
2058
                                                        'ascii')
 
2059
        BzrError.__init__(self, public_location=public_location,
 
2060
                          revstring=revstring)
 
2061
 
 
2062
 
 
2063
class MergeModifiedFormatError(BzrError):
 
2064
 
 
2065
    _fmt = "Error in merge modified format"
 
2066
 
 
2067
 
 
2068
class ConflictFormatError(BzrError):
 
2069
 
 
2070
    _fmt = "Format error in conflict listings"
 
2071
 
 
2072
 
 
2073
class CorruptDirstate(BzrError):
 
2074
 
 
2075
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
2076
            "Error: %(description)s")
 
2077
 
 
2078
    def __init__(self, dirstate_path, description):
 
2079
        BzrError.__init__(self)
 
2080
        self.dirstate_path = dirstate_path
 
2081
        self.description = description
 
2082
 
 
2083
 
 
2084
class CorruptRepository(BzrError):
 
2085
 
 
2086
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
2087
            "Please run bzr reconcile on this repository.")
 
2088
 
 
2089
    def __init__(self, repo):
 
2090
        BzrError.__init__(self)
 
2091
        self.repo_path = repo.bzrdir.root_transport.base
 
2092
 
 
2093
 
 
2094
class InconsistentDelta(BzrError):
 
2095
    """Used when we get a delta that is not valid."""
 
2096
 
 
2097
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
2098
            " %(file_id)r\nreason: %(reason)s")
 
2099
 
 
2100
    def __init__(self, path, file_id, reason):
 
2101
        BzrError.__init__(self)
 
2102
        self.path = path
 
2103
        self.file_id = file_id
 
2104
        self.reason = reason
 
2105
 
 
2106
 
 
2107
class UpgradeRequired(BzrError):
 
2108
 
 
2109
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
 
2110
 
 
2111
    def __init__(self, path):
 
2112
        BzrError.__init__(self)
 
2113
        self.path = path
 
2114
 
 
2115
 
 
2116
class RepositoryUpgradeRequired(UpgradeRequired):
 
2117
 
 
2118
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
2119
 
 
2120
 
 
2121
class LocalRequiresBoundBranch(BzrError):
 
2122
 
 
2123
    _fmt = "Cannot perform local-only commits on unbound branches."
 
2124
 
 
2125
 
 
2126
class MissingProgressBarFinish(BzrError):
 
2127
 
 
2128
    _fmt = "A nested progress bar was not 'finished' correctly."
 
2129
 
 
2130
 
 
2131
class InvalidProgressBarType(BzrError):
 
2132
 
 
2133
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
2134
            " is not a supported type Select one of: %(valid_types)s")
 
2135
 
 
2136
    def __init__(self, bar_type, valid_types):
 
2137
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
 
2138
 
 
2139
 
 
2140
class UnsupportedOperation(BzrError):
 
2141
 
 
2142
    _fmt = ("The method %(mname)s is not supported on"
 
2143
            " objects of type %(tname)s.")
 
2144
 
 
2145
    def __init__(self, method, method_self):
 
2146
        self.method = method
 
2147
        self.mname = method.__name__
 
2148
        self.tname = type(method_self).__name__
 
2149
 
 
2150
 
 
2151
class CannotSetRevisionId(UnsupportedOperation):
 
2152
    """Raised when a commit is attempting to set a revision id but cant."""
 
2153
 
 
2154
 
 
2155
class NonAsciiRevisionId(UnsupportedOperation):
 
2156
    """Raised when a commit is attempting to set a non-ascii revision id
 
2157
       but cant.
 
2158
    """
 
2159
 
 
2160
 
 
2161
class BinaryFile(BzrError):
 
2162
    
 
2163
    _fmt = "File is binary but should be text."
 
2164
 
 
2165
 
 
2166
class IllegalPath(BzrError):
 
2167
 
 
2168
    _fmt = "The path %(path)s is not permitted on this platform"
 
2169
 
 
2170
    def __init__(self, path):
 
2171
        BzrError.__init__(self)
 
2172
        self.path = path
 
2173
 
 
2174
 
 
2175
class TestamentMismatch(BzrError):
 
2176
 
 
2177
    _fmt = """Testament did not match expected value.
 
2178
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
2179
       {%(measured)s}"""
 
2180
 
 
2181
    def __init__(self, revision_id, expected, measured):
 
2182
        self.revision_id = revision_id
 
2183
        self.expected = expected
 
2184
        self.measured = measured
 
2185
 
 
2186
 
 
2187
class NotABundle(BzrError):
 
2188
    
 
2189
    _fmt = "Not a bzr revision-bundle: %(text)r"
 
2190
 
 
2191
    def __init__(self, text):
 
2192
        BzrError.__init__(self)
 
2193
        self.text = text
 
2194
 
 
2195
 
 
2196
class BadBundle(BzrError): 
 
2197
    
 
2198
    _fmt = "Bad bzr revision-bundle: %(text)r"
 
2199
 
 
2200
    def __init__(self, text):
 
2201
        BzrError.__init__(self)
 
2202
        self.text = text
 
2203
 
 
2204
 
 
2205
class MalformedHeader(BadBundle): 
 
2206
    
 
2207
    _fmt = "Malformed bzr revision-bundle header: %(text)r"
 
2208
 
 
2209
 
 
2210
class MalformedPatches(BadBundle): 
 
2211
    
 
2212
    _fmt = "Malformed patches in bzr revision-bundle: %(text)r"
 
2213
 
 
2214
 
 
2215
class MalformedFooter(BadBundle): 
 
2216
    
 
2217
    _fmt = "Malformed footer in bzr revision-bundle: %(text)r"
 
2218
 
 
2219
 
 
2220
class UnsupportedEOLMarker(BadBundle):
 
2221
    
 
2222
    _fmt = "End of line marker was not \\n in bzr revision-bundle"    
 
2223
 
 
2224
    def __init__(self):
 
2225
        # XXX: BadBundle's constructor assumes there's explanatory text, 
 
2226
        # but for this there is not
 
2227
        BzrError.__init__(self)
 
2228
 
 
2229
 
 
2230
class IncompatibleBundleFormat(BzrError):
 
2231
    
 
2232
    _fmt = "Bundle format %(bundle_format)s is incompatible with %(other)s"
 
2233
 
 
2234
    def __init__(self, bundle_format, other):
 
2235
        BzrError.__init__(self)
 
2236
        self.bundle_format = bundle_format
 
2237
        self.other = other
 
2238
 
 
2239
 
 
2240
class BadInventoryFormat(BzrError):
 
2241
    
 
2242
    _fmt = "Root class for inventory serialization errors"
 
2243
 
 
2244
 
 
2245
class UnexpectedInventoryFormat(BadInventoryFormat):
 
2246
 
 
2247
    _fmt = "The inventory was not in the expected format:\n %(msg)s"
 
2248
 
 
2249
    def __init__(self, msg):
 
2250
        BadInventoryFormat.__init__(self, msg=msg)
 
2251
 
 
2252
 
 
2253
class RootNotRich(BzrError):
 
2254
 
 
2255
    _fmt = """This operation requires rich root data storage"""
 
2256
 
 
2257
 
 
2258
class NoSmartMedium(InternalBzrError):
 
2259
 
 
2260
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
2261
 
 
2262
    def __init__(self, transport):
 
2263
        self.transport = transport
 
2264
 
 
2265
 
 
2266
class NoSmartServer(NotBranchError):
 
2267
 
 
2268
    _fmt = "No smart server available at %(url)s"
 
2269
 
 
2270
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
 
2271
    def __init__(self, url):
 
2272
        self.url = url
 
2273
 
 
2274
 
 
2275
class UnknownSSH(BzrError):
 
2276
 
 
2277
    _fmt = "Unrecognised value for BZR_SSH environment variable: %(vendor)s"
 
2278
 
 
2279
    def __init__(self, vendor):
 
2280
        BzrError.__init__(self)
 
2281
        self.vendor = vendor
 
2282
 
 
2283
 
 
2284
class SSHVendorNotFound(BzrError):
 
2285
 
 
2286
    _fmt = ("Don't know how to handle SSH connections."
 
2287
            " Please set BZR_SSH environment variable.")
 
2288
 
 
2289
 
 
2290
class GhostRevisionsHaveNoRevno(BzrError):
 
2291
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
2292
 
 
2293
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
2294
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
2295
 
 
2296
    def __init__(self, revision_id, ghost_revision_id):
 
2297
        self.revision_id = revision_id
 
2298
        self.ghost_revision_id = ghost_revision_id
 
2299
 
 
2300
        
 
2301
class GhostRevisionUnusableHere(BzrError):
 
2302
 
 
2303
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
 
2304
 
 
2305
    def __init__(self, revision_id):
 
2306
        BzrError.__init__(self)
 
2307
        self.revision_id = revision_id
 
2308
 
 
2309
 
 
2310
class IllegalUseOfScopeReplacer(InternalBzrError):
 
2311
 
 
2312
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
2313
            " %(msg)s%(extra)s")
 
2314
 
 
2315
    def __init__(self, name, msg, extra=None):
 
2316
        BzrError.__init__(self)
 
2317
        self.name = name
 
2318
        self.msg = msg
 
2319
        if extra:
 
2320
            self.extra = ': ' + str(extra)
 
2321
        else:
 
2322
            self.extra = ''
 
2323
 
 
2324
 
 
2325
class InvalidImportLine(InternalBzrError):
 
2326
 
 
2327
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
 
2328
 
 
2329
    def __init__(self, text, msg):
 
2330
        BzrError.__init__(self)
 
2331
        self.text = text
 
2332
        self.msg = msg
 
2333
 
 
2334
 
 
2335
class ImportNameCollision(InternalBzrError):
 
2336
 
 
2337
    _fmt = ("Tried to import an object to the same name as"
 
2338
            " an existing object. %(name)s")
 
2339
 
 
2340
    def __init__(self, name):
 
2341
        BzrError.__init__(self)
 
2342
        self.name = name
 
2343
 
 
2344
 
 
2345
class NotAMergeDirective(BzrError):
 
2346
    """File starting with %(firstline)r is not a merge directive"""
 
2347
    def __init__(self, firstline):
 
2348
        BzrError.__init__(self, firstline=firstline)
 
2349
 
 
2350
 
 
2351
class NoMergeSource(BzrError):
 
2352
    """Raise if no merge source was specified for a merge directive"""
 
2353
 
 
2354
    _fmt = "A merge directive must provide either a bundle or a public"\
 
2355
        " branch location."
 
2356
 
 
2357
 
 
2358
class IllegalMergeDirectivePayload(BzrError):
 
2359
    """A merge directive contained something other than a patch or bundle"""
 
2360
 
 
2361
    _fmt = "Bad merge directive payload %(start)r"
 
2362
 
 
2363
    def __init__(self, start):
 
2364
        BzrError(self)
 
2365
        self.start = start
 
2366
 
 
2367
 
 
2368
class PatchVerificationFailed(BzrError):
 
2369
    """A patch from a merge directive could not be verified"""
 
2370
 
 
2371
    _fmt = "Preview patch does not match requested changes."
 
2372
 
 
2373
 
 
2374
class PatchMissing(BzrError):
 
2375
    """Raise a patch type was specified but no patch supplied"""
 
2376
 
 
2377
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
 
2378
 
 
2379
    def __init__(self, patch_type):
 
2380
        BzrError.__init__(self)
 
2381
        self.patch_type = patch_type
 
2382
 
 
2383
 
 
2384
class UnsupportedInventoryKind(BzrError):
 
2385
    
 
2386
    _fmt = """Unsupported entry kind %(kind)s"""
 
2387
 
 
2388
    def __init__(self, kind):
 
2389
        self.kind = kind
 
2390
 
 
2391
 
 
2392
class BadSubsumeSource(BzrError):
 
2393
 
 
2394
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
 
2395
 
 
2396
    def __init__(self, tree, other_tree, reason):
 
2397
        self.tree = tree
 
2398
        self.other_tree = other_tree
 
2399
        self.reason = reason
 
2400
 
 
2401
 
 
2402
class SubsumeTargetNeedsUpgrade(BzrError):
 
2403
    
 
2404
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
2405
 
 
2406
    def __init__(self, other_tree):
 
2407
        self.other_tree = other_tree
 
2408
 
 
2409
 
 
2410
class BadReferenceTarget(InternalBzrError):
 
2411
 
 
2412
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
2413
           "%(reason)s"
 
2414
 
 
2415
    def __init__(self, tree, other_tree, reason):
 
2416
        self.tree = tree
 
2417
        self.other_tree = other_tree
 
2418
        self.reason = reason
 
2419
 
 
2420
 
 
2421
class NoSuchTag(BzrError):
 
2422
 
 
2423
    _fmt = "No such tag: %(tag_name)s"
 
2424
 
 
2425
    def __init__(self, tag_name):
 
2426
        self.tag_name = tag_name
 
2427
 
 
2428
 
 
2429
class TagsNotSupported(BzrError):
 
2430
 
 
2431
    _fmt = ("Tags not supported by %(branch)s;"
 
2432
            " you may be able to use bzr upgrade --dirstate-tags.")
 
2433
 
 
2434
    def __init__(self, branch):
 
2435
        self.branch = branch
 
2436
 
 
2437
        
 
2438
class TagAlreadyExists(BzrError):
 
2439
 
 
2440
    _fmt = "Tag %(tag_name)s already exists."
 
2441
 
 
2442
    def __init__(self, tag_name):
 
2443
        self.tag_name = tag_name
 
2444
 
 
2445
 
 
2446
class MalformedBugIdentifier(BzrError):
 
2447
 
 
2448
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
2449
 
 
2450
    def __init__(self, bug_id, reason):
 
2451
        self.bug_id = bug_id
 
2452
        self.reason = reason
 
2453
 
 
2454
 
 
2455
class InvalidBugTrackerURL(BzrError):
 
2456
 
 
2457
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
2458
            "contain {id}: %(url)s")
 
2459
 
 
2460
    def __init__(self, abbreviation, url):
 
2461
        self.abbreviation = abbreviation
 
2462
        self.url = url
 
2463
 
 
2464
 
 
2465
class UnknownBugTrackerAbbreviation(BzrError):
 
2466
 
 
2467
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
2468
            "on %(branch)s")
 
2469
 
 
2470
    def __init__(self, abbreviation, branch):
 
2471
        self.abbreviation = abbreviation
 
2472
        self.branch = branch
 
2473
 
 
2474
 
 
2475
class UnexpectedSmartServerResponse(BzrError):
 
2476
 
 
2477
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
2478
 
 
2479
    def __init__(self, response_tuple):
 
2480
        self.response_tuple = response_tuple
 
2481
 
 
2482
 
 
2483
class ErrorFromSmartServer(BzrError):
 
2484
 
 
2485
    _fmt = "Error received from smart server: %(error_tuple)r"
 
2486
 
 
2487
    internal_error = True
 
2488
 
 
2489
    def __init__(self, error_tuple):
 
2490
        self.error_tuple = error_tuple
 
2491
        try:
 
2492
            self.error_verb = error_tuple[0]
 
2493
        except IndexError:
 
2494
            self.error_verb = None
 
2495
        self.error_args = error_tuple[1:]
 
2496
 
 
2497
 
 
2498
class ContainerError(BzrError):
 
2499
    """Base class of container errors."""
 
2500
 
 
2501
 
 
2502
class UnknownContainerFormatError(ContainerError):
 
2503
 
 
2504
    _fmt = "Unrecognised container format: %(container_format)r"
 
2505
    
 
2506
    def __init__(self, container_format):
 
2507
        self.container_format = container_format
 
2508
 
 
2509
 
 
2510
class UnexpectedEndOfContainerError(ContainerError):
 
2511
 
 
2512
    _fmt = "Unexpected end of container stream"
 
2513
 
 
2514
 
 
2515
class UnknownRecordTypeError(ContainerError):
 
2516
 
 
2517
    _fmt = "Unknown record type: %(record_type)r"
 
2518
 
 
2519
    def __init__(self, record_type):
 
2520
        self.record_type = record_type
 
2521
 
 
2522
 
 
2523
class InvalidRecordError(ContainerError):
 
2524
 
 
2525
    _fmt = "Invalid record: %(reason)s"
 
2526
 
 
2527
    def __init__(self, reason):
 
2528
        self.reason = reason
 
2529
 
 
2530
 
 
2531
class ContainerHasExcessDataError(ContainerError):
 
2532
 
 
2533
    _fmt = "Container has data after end marker: %(excess)r"
 
2534
 
 
2535
    def __init__(self, excess):
 
2536
        self.excess = excess
 
2537
 
 
2538
 
 
2539
class DuplicateRecordNameError(ContainerError):
 
2540
 
 
2541
    _fmt = "Container has multiple records with the same name: %(name)s"
 
2542
 
 
2543
    def __init__(self, name):
 
2544
        self.name = name
 
2545
 
 
2546
 
 
2547
class NoDestinationAddress(InternalBzrError):
 
2548
 
 
2549
    _fmt = "Message does not have a destination address."
 
2550
 
 
2551
 
 
2552
class RepositoryDataStreamError(BzrError):
 
2553
 
 
2554
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
2555
 
 
2556
    def __init__(self, reason):
 
2557
        self.reason = reason
 
2558
 
 
2559
 
 
2560
class SMTPError(BzrError):
 
2561
 
 
2562
    _fmt = "SMTP error: %(error)s"
 
2563
 
 
2564
    def __init__(self, error):
 
2565
        self.error = error
 
2566
 
 
2567
 
 
2568
class NoMessageSupplied(BzrError):
 
2569
 
 
2570
    _fmt = "No message supplied."
 
2571
 
 
2572
 
 
2573
class NoMailAddressSpecified(BzrError):
 
2574
 
 
2575
    _fmt = "No mail-to address specified."
 
2576
 
 
2577
 
 
2578
class UnknownMailClient(BzrError):
 
2579
 
 
2580
    _fmt = "Unknown mail client: %(mail_client)s"
 
2581
 
 
2582
    def __init__(self, mail_client):
 
2583
        BzrError.__init__(self, mail_client=mail_client)
 
2584
 
 
2585
 
 
2586
class MailClientNotFound(BzrError):
 
2587
 
 
2588
    _fmt = "Unable to find mail client with the following names:"\
 
2589
        " %(mail_command_list_string)s"
 
2590
 
 
2591
    def __init__(self, mail_command_list):
 
2592
        mail_command_list_string = ', '.join(mail_command_list)
 
2593
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
2594
                          mail_command_list_string=mail_command_list_string)
 
2595
 
 
2596
class SMTPConnectionRefused(SMTPError):
 
2597
 
 
2598
    _fmt = "SMTP connection to %(host)s refused"
 
2599
 
 
2600
    def __init__(self, error, host):
 
2601
        self.error = error
 
2602
        self.host = host
 
2603
 
 
2604
 
 
2605
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
2606
 
 
2607
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
2608
 
 
2609
 
 
2610
class BzrDirError(BzrError):
 
2611
 
 
2612
    def __init__(self, bzrdir):
 
2613
        import bzrlib.urlutils as urlutils
 
2614
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
2615
                                                    'ascii')
 
2616
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
2617
 
 
2618
 
 
2619
class UnsyncedBranches(BzrDirError):
 
2620
 
 
2621
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
2622
            " bzr help sync-for-reconfigure.")
 
2623
 
 
2624
    def __init__(self, bzrdir, target_branch):
 
2625
        BzrDirError.__init__(self, bzrdir)
 
2626
        import bzrlib.urlutils as urlutils
 
2627
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
2628
                                                        'ascii')
 
2629
 
 
2630
 
 
2631
class AlreadyBranch(BzrDirError):
 
2632
 
 
2633
    _fmt = "'%(display_url)s' is already a branch."
 
2634
 
 
2635
 
 
2636
class AlreadyTree(BzrDirError):
 
2637
 
 
2638
    _fmt = "'%(display_url)s' is already a tree."
 
2639
 
 
2640
 
 
2641
class AlreadyCheckout(BzrDirError):
 
2642
 
 
2643
    _fmt = "'%(display_url)s' is already a checkout."
 
2644
 
 
2645
 
 
2646
class AlreadyLightweightCheckout(BzrDirError):
 
2647
 
 
2648
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
2649
 
 
2650
 
 
2651
class AlreadyUsingShared(BzrDirError):
 
2652
 
 
2653
    _fmt = "'%(display_url)s' is already using a shared repository."
 
2654
 
 
2655
 
 
2656
class AlreadyStandalone(BzrDirError):
 
2657
 
 
2658
    _fmt = "'%(display_url)s' is already standalone."
 
2659
 
 
2660
 
 
2661
class ReconfigurationNotSupported(BzrDirError):
 
2662
 
 
2663
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
2664
 
 
2665
 
 
2666
class NoBindLocation(BzrDirError):
 
2667
 
 
2668
    _fmt = "No location could be found to bind to at %(display_url)s."
 
2669
 
 
2670
 
 
2671
class UncommittedChanges(BzrError):
 
2672
 
 
2673
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
2674
 
 
2675
    def __init__(self, tree):
 
2676
        import bzrlib.urlutils as urlutils
 
2677
        display_url = urlutils.unescape_for_display(
 
2678
            tree.bzrdir.root_transport.base, 'ascii')
 
2679
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
2680
 
 
2681
 
 
2682
class MissingTemplateVariable(BzrError):
 
2683
 
 
2684
    _fmt = 'Variable {%(name)s} is not available.'
 
2685
 
 
2686
    def __init__(self, name):
 
2687
        self.name = name
 
2688
 
 
2689
 
 
2690
class NoTemplate(BzrError):
 
2691
 
 
2692
    _fmt = 'No template specified.'
 
2693
 
 
2694
 
 
2695
class UnableCreateSymlink(BzrError):
 
2696
 
 
2697
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
2698
 
 
2699
    def __init__(self, path=None):
 
2700
        path_str = ''
 
2701
        if path:
 
2702
            try:
 
2703
                path_str = repr(str(path))
 
2704
            except UnicodeEncodeError:
 
2705
                path_str = repr(path)
 
2706
            path_str += ' '
 
2707
        self.path_str = path_str
 
2708
 
 
2709
 
 
2710
class UnsupportedTimezoneFormat(BzrError):
 
2711
 
 
2712
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
2713
            'options are "utc", "original", "local".')
 
2714
 
 
2715
    def __init__(self, timezone):
 
2716
        self.timezone = timezone
 
2717
 
 
2718
 
 
2719
class CommandAvailableInPlugin(StandardError):
 
2720
    
 
2721
    internal_error = False
 
2722
 
 
2723
    def __init__(self, cmd_name, plugin_metadata, provider):
 
2724
        
 
2725
        self.plugin_metadata = plugin_metadata
 
2726
        self.cmd_name = cmd_name
 
2727
        self.provider = provider
 
2728
 
 
2729
    def __str__(self):
 
2730
 
 
2731
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
2732
                'However, the following official plugin provides this command: %s\n'
 
2733
                'You can install it by going to: %s'
 
2734
                % (self.cmd_name, self.plugin_metadata['name'], 
 
2735
                    self.plugin_metadata['url']))
 
2736
 
 
2737
        return _fmt
 
2738
 
 
2739
 
 
2740
class NoPluginAvailable(BzrError):
 
2741
    pass    
 
2742
 
 
2743
 
 
2744
class NotATerminal(BzrError):
 
2745
 
 
2746
    _fmt = 'Unable to ask for a password without real terminal.'
 
2747
 
 
2748
 
 
2749
class UnableEncodePath(BzrError):
 
2750
 
 
2751
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
2752
            'user encoding %(user_encoding)s')
 
2753
 
 
2754
    def __init__(self, path, kind):
 
2755
        self.path = path
 
2756
        self.kind = kind
 
2757
        self.user_encoding = osutils.get_user_encoding()
 
2758
 
 
2759
 
 
2760
class NoSuchAlias(BzrError):
 
2761
 
 
2762
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
2763
 
 
2764
    def __init__(self, alias_name):
 
2765
        BzrError.__init__(self, alias_name=alias_name)
 
2766
 
 
2767
 
 
2768
class DirectoryLookupFailure(BzrError):
 
2769
    """Base type for lookup errors."""
 
2770
 
 
2771
    pass
 
2772
 
 
2773
 
 
2774
class InvalidLocationAlias(DirectoryLookupFailure):
 
2775
 
 
2776
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
2777
 
 
2778
    def __init__(self, alias_name):
 
2779
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
2780
 
 
2781
 
 
2782
class UnsetLocationAlias(DirectoryLookupFailure):
 
2783
 
 
2784
    _fmt = 'No %(alias_name)s location assigned.'
 
2785
 
 
2786
    def __init__(self, alias_name):
 
2787
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
2788
 
 
2789
 
 
2790
class CannotBindAddress(BzrError):
 
2791
 
 
2792
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
2793
 
 
2794
    def __init__(self, host, port, orig_error):
 
2795
        BzrError.__init__(self, host=host, port=port,
 
2796
            orig_error=orig_error[1])
 
2797
 
 
2798
 
 
2799
class UnknownRules(BzrError):
 
2800
 
 
2801
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
2802
 
 
2803
    def __init__(self, unknowns):
 
2804
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
2805
 
 
2806
 
 
2807
class HookFailed(BzrError):
 
2808
    """Raised when a pre_change_branch_tip hook function fails anything other
 
2809
    than TipChangeRejected.
 
2810
    """
 
2811
 
 
2812
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
2813
            "%(traceback_text)s%(exc_value)s")
 
2814
 
 
2815
    def __init__(self, hook_stage, hook_name, exc_info):
 
2816
        import traceback
 
2817
        self.hook_stage = hook_stage
 
2818
        self.hook_name = hook_name
 
2819
        self.exc_info = exc_info
 
2820
        self.exc_type = exc_info[0]
 
2821
        self.exc_value = exc_info[1]
 
2822
        self.exc_tb = exc_info[2]
 
2823
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
2824
 
 
2825
 
 
2826
class TipChangeRejected(BzrError):
 
2827
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
2828
    explicitly abort a change to a branch tip.
 
2829
    """
 
2830
    
 
2831
    _fmt = u"Tip change rejected: %(msg)s"
 
2832
 
 
2833
    def __init__(self, msg):
 
2834
        self.msg = msg
 
2835