~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: John Arbash Meinel
  • Date: 2008-09-26 22:14:42 UTC
  • mto: This revision was merged to the branch mainline in revision 3747.
  • Revision ID: john@arbash-meinel.com-20080926221442-3r67j99sr9rwe9w0
Make message optional, don't check the memory flag directly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
44
44
# 'unprintable'.
45
45
 
46
46
 
 
47
# return codes from the bzr program
 
48
EXIT_OK = 0
 
49
EXIT_ERROR = 3
 
50
EXIT_INTERNAL_ERROR = 4
 
51
 
 
52
 
47
53
class BzrError(StandardError):
48
54
    """
49
55
    Base class for errors raised by bzrlib.
87
93
            for key, value in kwds.items():
88
94
                setattr(self, key, value)
89
95
 
90
 
    def __str__(self):
 
96
    def _format(self):
91
97
        s = getattr(self, '_preformatted_string', None)
92
98
        if s is not None:
93
 
            # contains a preformatted message; must be cast to plain str
94
 
            return str(s)
 
99
            # contains a preformatted message
 
100
            return s
95
101
        try:
96
102
            fmt = self._get_format_string()
97
103
            if fmt:
98
 
                s = fmt % self.__dict__
 
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
99
109
                # __str__() should always return a 'str' object
100
110
                # never a 'unicode' object.
101
 
                if isinstance(s, unicode):
102
 
                    return s.encode('utf8')
103
111
                return s
104
112
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
105
113
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
108
116
                   getattr(self, '_fmt', None),
109
117
                   e)
110
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
 
111
139
    def _get_format_string(self):
112
140
        """Return format string for this exception or None"""
113
141
        fmt = getattr(self, '_fmt', None)
125
153
               getattr(self, '_fmt', None),
126
154
               )
127
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
 
128
172
 
129
173
class BzrNewError(BzrError):
130
174
    """Deprecated error base class."""
164
208
    _fmt = "The tree builder is already building a tree."
165
209
 
166
210
 
167
 
class BzrCheckError(BzrError):
 
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):
168
219
    
169
220
    _fmt = "Internal check failed: %(message)s"
170
221
 
171
 
    internal_error = True
172
 
 
173
222
    def __init__(self, message):
174
223
        BzrError.__init__(self)
175
224
        self.message = message
176
225
 
177
226
 
178
 
class DisabledMethod(BzrError):
 
227
class DirstateCorrupt(BzrError):
 
228
 
 
229
    _fmt = "The dirstate file (%(state)s) appears to be corrupt: %(msg)s"
 
230
 
 
231
    def __init__(self, state, msg):
 
232
        BzrError.__init__(self)
 
233
        self.state = state
 
234
        self.msg = msg
 
235
 
 
236
 
 
237
class DisabledMethod(InternalBzrError):
179
238
 
180
239
    _fmt = "The smart server method '%(class_name)s' is disabled."
181
240
 
182
 
    internal_error = True
183
 
 
184
241
    def __init__(self, class_name):
185
242
        BzrError.__init__(self)
186
243
        self.class_name = class_name
198
255
        self.current = current
199
256
 
200
257
 
201
 
class InvalidEntryName(BzrError):
 
258
class InProcessTransport(BzrError):
 
259
 
 
260
    _fmt = "The transport '%(transport)s' is only accessible within this " \
 
261
        "process."
 
262
 
 
263
    def __init__(self, transport):
 
264
        self.transport = transport
 
265
 
 
266
 
 
267
class InvalidEntryName(InternalBzrError):
202
268
    
203
269
    _fmt = "Invalid entry name: %(name)s"
204
270
 
205
 
    internal_error = True
206
 
 
207
271
    def __init__(self, name):
208
272
        BzrError.__init__(self)
209
273
        self.name = name
228
292
        self.revision_id = revision_id
229
293
        self.branch = branch
230
294
 
 
295
 
231
296
class ReservedId(BzrError):
232
297
 
233
298
    _fmt = "Reserved revision-id {%(revision_id)s}"
236
301
        self.revision_id = revision_id
237
302
 
238
303
 
 
304
class RootMissing(InternalBzrError):
 
305
 
 
306
    _fmt = ("The root entry of a tree must be the first entry supplied to "
 
307
        "record_entry_contents.")
 
308
 
 
309
 
 
310
class NoPublicBranch(BzrError):
 
311
 
 
312
    _fmt = 'There is no public branch set for "%(branch_url)s".'
 
313
 
 
314
    def __init__(self, branch):
 
315
        import bzrlib.urlutils as urlutils
 
316
        public_location = urlutils.unescape_for_display(branch.base, 'ascii')
 
317
        BzrError.__init__(self, branch_url=public_location)
 
318
 
 
319
 
239
320
class NoHelpTopic(BzrError):
240
321
 
241
322
    _fmt = ("No help could be found for '%(topic)s'. "
247
328
 
248
329
class NoSuchId(BzrError):
249
330
 
250
 
    _fmt = "The file id %(file_id)s is not present in the tree %(tree)s."
 
331
    _fmt = 'The file id "%(file_id)s" is not present in the tree %(tree)s.'
251
332
    
252
333
    def __init__(self, tree, file_id):
253
334
        BzrError.__init__(self)
255
336
        self.tree = tree
256
337
 
257
338
 
258
 
class InventoryModified(BzrError):
 
339
class NoSuchIdInRepository(NoSuchId):
 
340
 
 
341
    _fmt = ('The file id "%(file_id)s" is not present in the repository'
 
342
            ' %(repository)r')
 
343
 
 
344
    def __init__(self, repository, file_id):
 
345
        BzrError.__init__(self, repository=repository, file_id=file_id)
 
346
 
 
347
 
 
348
class NotStacked(BranchError):
 
349
 
 
350
    _fmt = "The branch '%(branch)s' is not stacked."
 
351
 
 
352
 
 
353
class InventoryModified(InternalBzrError):
259
354
 
260
355
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
261
356
            " so a clean inventory cannot be read without data loss.")
262
357
 
263
 
    internal_error = True
264
 
 
265
358
    def __init__(self, tree):
266
359
        self.tree = tree
267
360
 
268
361
 
269
362
class NoWorkingTree(BzrError):
270
363
 
271
 
    _fmt = "No WorkingTree exists for %(base)s."
 
364
    _fmt = 'No WorkingTree exists for "%(base)s".'
272
365
    
273
366
    def __init__(self, base):
274
367
        BzrError.__init__(self)
288
381
        self.url = url
289
382
 
290
383
 
291
 
class WorkingTreeAlreadyPopulated(BzrError):
292
 
 
293
 
    _fmt = """Working tree already populated in %(base)s"""
294
 
 
295
 
    internal_error = True
 
384
class WorkingTreeAlreadyPopulated(InternalBzrError):
 
385
 
 
386
    _fmt = 'Working tree already populated in "%(base)s"'
296
387
 
297
388
    def __init__(self, base):
298
389
        self.base = base
299
390
 
 
391
 
300
392
class BzrCommandError(BzrError):
301
393
    """Error from user command"""
302
394
 
303
 
    internal_error = False
304
 
 
305
395
    # Error from malformed user command; please avoid raising this as a
306
396
    # generic exception not caused by user input.
307
397
    #
309
399
    # are not intended to be caught anyway.  UI code need not subclass
310
400
    # BzrCommandError, and non-UI code should not throw a subclass of
311
401
    # BzrCommandError.  ADHB 20051211
312
 
    def __init__(self, msg):
313
 
        # Object.__str__() must return a real string
314
 
        # returning a Unicode string is a python error.
315
 
        if isinstance(msg, unicode):
316
 
            self.msg = msg.encode('utf8')
317
 
        else:
318
 
            self.msg = msg
319
 
 
320
 
    def __str__(self):
321
 
        return self.msg
322
402
 
323
403
 
324
404
class NotWriteLocked(BzrError):
334
414
    _fmt = "Error in command line options"
335
415
 
336
416
 
 
417
class BadIndexFormatSignature(BzrError):
 
418
 
 
419
    _fmt = "%(value)s is not an index of type %(_type)s."
 
420
 
 
421
    def __init__(self, value, _type):
 
422
        BzrError.__init__(self)
 
423
        self.value = value
 
424
        self._type = _type
 
425
 
 
426
 
 
427
class BadIndexData(BzrError):
 
428
 
 
429
    _fmt = "Error in data for index %(value)s."
 
430
 
 
431
    def __init__(self, value):
 
432
        BzrError.__init__(self)
 
433
        self.value = value
 
434
 
 
435
 
 
436
class BadIndexDuplicateKey(BzrError):
 
437
 
 
438
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
439
 
 
440
    def __init__(self, key, index):
 
441
        BzrError.__init__(self)
 
442
        self.key = key
 
443
        self.index = index
 
444
 
 
445
 
 
446
class BadIndexKey(BzrError):
 
447
 
 
448
    _fmt = "The key '%(key)s' is not a valid key."
 
449
 
 
450
    def __init__(self, key):
 
451
        BzrError.__init__(self)
 
452
        self.key = key
 
453
 
 
454
 
 
455
class BadIndexOptions(BzrError):
 
456
 
 
457
    _fmt = "Could not parse options for index %(value)s."
 
458
 
 
459
    def __init__(self, value):
 
460
        BzrError.__init__(self)
 
461
        self.value = value
 
462
 
 
463
 
 
464
class BadIndexValue(BzrError):
 
465
 
 
466
    _fmt = "The value '%(value)s' is not a valid value."
 
467
 
 
468
    def __init__(self, value):
 
469
        BzrError.__init__(self)
 
470
        self.value = value
 
471
 
 
472
 
337
473
class BadOptionValue(BzrError):
338
474
 
339
475
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
380
516
    """Used when renaming and both source and dest exist."""
381
517
 
382
518
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
383
 
            "%(extra)s")
 
519
            " (Use --after to tell bzr about a rename that has already"
 
520
            " happened)%(extra)s")
384
521
 
385
522
    def __init__(self, source, dest, extra=None):
386
523
        BzrError.__init__(self)
394
531
 
395
532
class NotADirectory(PathError):
396
533
 
397
 
    _fmt = "%(path)r is not a directory %(extra)s"
 
534
    _fmt = '"%(path)s" is not a directory %(extra)s'
398
535
 
399
536
 
400
537
class NotInWorkingDirectory(PathError):
401
538
 
402
 
    _fmt = "%(path)r is not in the working directory %(extra)s"
 
539
    _fmt = '"%(path)s" is not in the working directory %(extra)s'
403
540
 
404
541
 
405
542
class DirectoryNotEmpty(PathError):
406
543
 
407
 
    _fmt = "Directory not empty: %(path)r%(extra)s"
408
 
 
409
 
 
410
 
class ReadingCompleted(BzrError):
 
544
    _fmt = 'Directory not empty: "%(path)s"%(extra)s'
 
545
 
 
546
 
 
547
class HardLinkNotSupported(PathError):
 
548
 
 
549
    _fmt = 'Hard-linking "%(path)s" is not supported'
 
550
 
 
551
 
 
552
class ReadingCompleted(InternalBzrError):
411
553
    
412
554
    _fmt = ("The MediumRequest '%(request)s' has already had finish_reading "
413
555
            "called upon it - the request has been completed and no more "
414
556
            "data may be read.")
415
557
 
416
 
    internal_error = True
417
 
 
418
558
    def __init__(self, request):
419
559
        self.request = request
420
560
 
421
561
 
422
562
class ResourceBusy(PathError):
423
563
 
424
 
    _fmt = "Device or resource busy: %(path)r%(extra)s"
 
564
    _fmt = 'Device or resource busy: "%(path)s"%(extra)s'
425
565
 
426
566
 
427
567
class PermissionDenied(PathError):
428
568
 
429
 
    _fmt = "Permission denied: %(path)r%(extra)s"
 
569
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
430
570
 
431
571
 
432
572
class InvalidURL(PathError):
433
573
 
434
 
    _fmt = "Invalid url supplied to transport: %(path)r%(extra)s"
 
574
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
435
575
 
436
576
 
437
577
class InvalidURLJoin(PathError):
438
578
 
439
 
    _fmt = "Invalid URL join request: %(args)s%(extra)s"
440
 
 
441
 
    def __init__(self, msg, base, args):
442
 
        PathError.__init__(self, base, msg)
443
 
        self.args = [base] + list(args)
 
579
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
580
 
 
581
    def __init__(self, reason, base, join_args):
 
582
        self.reason = reason
 
583
        self.base = base
 
584
        self.join_args = join_args
 
585
        PathError.__init__(self, base, reason)
 
586
 
 
587
 
 
588
class InvalidRebaseURLs(PathError):
 
589
 
 
590
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
591
 
 
592
    def __init__(self, from_, to):
 
593
        self.from_ = from_
 
594
        self.to = to
 
595
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
596
 
 
597
 
 
598
class UnavailableRepresentation(InternalBzrError):
 
599
 
 
600
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
601
        "is encoded as '%(native)s'.")
 
602
 
 
603
    def __init__(self, key, wanted, native):
 
604
        InternalBzrError.__init__(self)
 
605
        self.wanted = wanted
 
606
        self.native = native
 
607
        self.key = key
444
608
 
445
609
 
446
610
class UnknownHook(BzrError):
461
625
        PathError.__init__(self, url, extra=extra)
462
626
 
463
627
 
 
628
class UnstackableBranchFormat(BzrError):
 
629
 
 
630
    _fmt = ("The branch '%(url)s'(%(format)s) is not a stackable format. "
 
631
        "You will need to upgrade the branch to permit branch stacking.")
 
632
 
 
633
    def __init__(self, format, url):
 
634
        BzrError.__init__(self)
 
635
        self.format = format
 
636
        self.url = url
 
637
 
 
638
 
 
639
class UnstackableRepositoryFormat(BzrError):
 
640
 
 
641
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
642
        "You will need to upgrade the repository to permit branch stacking.")
 
643
 
 
644
    def __init__(self, format, url):
 
645
        BzrError.__init__(self)
 
646
        self.format = format
 
647
        self.url = url
 
648
 
 
649
 
464
650
class ReadError(PathError):
465
651
    
466
652
    _fmt = """Error reading from %(path)r."""
468
654
 
469
655
class ShortReadvError(PathError):
470
656
 
471
 
    _fmt = ("readv() read %(actual)s bytes rather than %(length)s bytes"
472
 
            " at %(offset)s for %(path)s%(extra)s")
 
657
    _fmt = ('readv() read %(actual)s bytes rather than %(length)s bytes'
 
658
            ' at %(offset)s for "%(path)s"%(extra)s')
473
659
 
474
660
    internal_error = True
475
661
 
480
666
        self.actual = actual
481
667
 
482
668
 
483
 
class PathNotChild(BzrError):
 
669
class PathNotChild(PathError):
484
670
 
485
 
    _fmt = "Path %(path)r is not a child of path %(base)r%(extra)s"
 
671
    _fmt = 'Path "%(path)s" is not a child of path "%(base)s"%(extra)s'
486
672
 
487
673
    internal_error = True
488
674
 
498
684
 
499
685
class InvalidNormalization(PathError):
500
686
 
501
 
    _fmt = "Path %(path)r is not unicode normalized"
 
687
    _fmt = 'Path "%(path)s" is not unicode normalized'
502
688
 
503
689
 
504
690
# TODO: This is given a URL; we try to unescape it but doing that from inside
506
692
# TODO: Probably this behavior of should be a common superclass 
507
693
class NotBranchError(PathError):
508
694
 
509
 
    _fmt = "Not a branch: %(path)s"
 
695
    _fmt = 'Not a branch: "%(path)s".'
510
696
 
511
697
    def __init__(self, path):
512
698
       import bzrlib.urlutils as urlutils
524
710
 
525
711
class AlreadyBranchError(PathError):
526
712
 
527
 
    _fmt = "Already a branch: %(path)s."
 
713
    _fmt = 'Already a branch: "%(path)s".'
528
714
 
529
715
 
530
716
class BranchExistsWithoutWorkingTree(PathError):
531
717
 
532
 
    _fmt = "Directory contains a branch, but no working tree \
533
 
(use bzr checkout if you wish to build a working tree): %(path)s"
 
718
    _fmt = 'Directory contains a branch, but no working tree \
 
719
(use bzr checkout if you wish to build a working tree): "%(path)s"'
534
720
 
535
721
 
536
722
class AtomicFileAlreadyClosed(PathError):
537
723
 
538
 
    _fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
539
 
            " %(path)s")
 
724
    _fmt = ('"%(function)s" called on an AtomicFile after it was closed:'
 
725
            ' "%(path)s"')
540
726
 
541
727
    def __init__(self, path, function):
542
728
        PathError.__init__(self, path=path, extra=None)
545
731
 
546
732
class InaccessibleParent(PathError):
547
733
 
548
 
    _fmt = ("Parent not accessible given base %(base)s and"
549
 
            " relative path %(path)s")
 
734
    _fmt = ('Parent not accessible given base "%(base)s" and'
 
735
            ' relative path "%(path)s"')
550
736
 
551
737
    def __init__(self, path, base):
552
738
        PathError.__init__(self, path)
555
741
 
556
742
class NoRepositoryPresent(BzrError):
557
743
 
558
 
    _fmt = "No repository present: %(path)r"
 
744
    _fmt = 'No repository present: "%(path)s"'
559
745
    def __init__(self, bzrdir):
560
746
        BzrError.__init__(self)
561
747
        self.path = bzrdir.transport.clone('..').base
563
749
 
564
750
class FileInWrongBranch(BzrError):
565
751
 
566
 
    _fmt = "File %(path)s in not in branch %(branch_base)s."
 
752
    _fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
567
753
 
568
754
    def __init__(self, branch, path):
569
755
        BzrError.__init__(self)
579
765
 
580
766
class UnknownFormatError(BzrError):
581
767
    
582
 
    _fmt = "Unknown branch format: %(format)r"
 
768
    _fmt = "Unknown %(kind)s format: %(format)r"
 
769
 
 
770
    def __init__(self, format, kind='branch'):
 
771
        self.kind = kind
 
772
        self.format = format
583
773
 
584
774
 
585
775
class IncompatibleFormat(BzrError):
594
784
 
595
785
class IncompatibleRepositories(BzrError):
596
786
 
597
 
    _fmt = "Repository %(target)s is not compatible with repository"\
598
 
        " %(source)s"
 
787
    _fmt = "%(target)s\n" \
 
788
            "is not compatible with\n" \
 
789
            "%(source)s\n" \
 
790
            "%(details)s"
599
791
 
600
 
    def __init__(self, source, target):
601
 
        BzrError.__init__(self, target=target, source=source)
 
792
    def __init__(self, source, target, details=None):
 
793
        if details is None:
 
794
            details = "(no details)"
 
795
        BzrError.__init__(self, target=target, source=source, details=details)
602
796
 
603
797
 
604
798
class IncompatibleRevision(BzrError):
613
807
class AlreadyVersionedError(BzrError):
614
808
    """Used when a path is expected not to be versioned, but it is."""
615
809
 
616
 
    _fmt = "%(context_info)s%(path)s is already versioned"
 
810
    _fmt = "%(context_info)s%(path)s is already versioned."
617
811
 
618
812
    def __init__(self, path, context_info=None):
619
813
        """Construct a new AlreadyVersionedError.
634
828
class NotVersionedError(BzrError):
635
829
    """Used when a path is expected to be versioned, but it is not."""
636
830
 
637
 
    _fmt = "%(context_info)s%(path)s is not versioned"
 
831
    _fmt = "%(context_info)s%(path)s is not versioned."
638
832
 
639
833
    def __init__(self, path, context_info=None):
640
834
        """Construct a new NotVersionedError.
691
885
        BzrError.__init__(self, filename=filename, kind=kind)
692
886
 
693
887
 
 
888
class BadFilenameEncoding(BzrError):
 
889
 
 
890
    _fmt = ('Filename %(filename)r is not valid in your current filesystem'
 
891
            ' encoding %(fs_encoding)s')
 
892
 
 
893
    def __init__(self, filename, fs_encoding):
 
894
        BzrError.__init__(self)
 
895
        self.filename = filename
 
896
        self.fs_encoding = fs_encoding
 
897
 
 
898
 
694
899
class ForbiddenControlFileError(BzrError):
695
900
 
696
 
    _fmt = "Cannot operate on %(filename)s because it is a control file"
697
 
 
698
 
 
699
 
class LockError(BzrError):
 
901
    _fmt = 'Cannot operate on "%(filename)s" because it is a control file'
 
902
 
 
903
 
 
904
class LockError(InternalBzrError):
700
905
 
701
906
    _fmt = "Lock error: %(msg)s"
702
907
 
703
 
    internal_error = True
704
 
 
705
908
    # All exceptions from the lock/unlock functions should be from
706
909
    # this exception class.  They will be translated as necessary. The
707
910
    # original exception is available as e.original_error
709
912
    # New code should prefer to raise specific subclasses
710
913
    def __init__(self, message):
711
914
        # Python 2.5 uses a slot for StandardError.message,
712
 
        # so use a different variable name
713
 
        # so it is exposed in self.__dict__
 
915
        # so use a different variable name.  We now work around this in
 
916
        # BzrError.__str__, but this member name is kept for compatability.
714
917
        self.msg = message
715
918
 
716
919
 
751
954
        self.obj = obj
752
955
 
753
956
 
754
 
class ReadOnlyLockError(LockError):
755
 
 
756
 
    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
757
 
 
758
 
    def __init__(self, fname, msg):
 
957
class LockFailed(LockError):
 
958
 
 
959
    internal_error = False
 
960
 
 
961
    _fmt = "Cannot lock %(lock)s: %(why)s"
 
962
 
 
963
    def __init__(self, lock, why):
759
964
        LockError.__init__(self, '')
760
 
        self.fname = fname
761
 
        self.msg = msg
 
965
        self.lock = lock
 
966
        self.why = why
762
967
 
763
968
 
764
969
class OutSideTransaction(BzrError):
788
993
 
789
994
class UnlockableTransport(LockError):
790
995
 
 
996
    internal_error = False
 
997
 
791
998
    _fmt = "Cannot lock: transport is read only: %(transport)s"
792
999
 
793
1000
    def __init__(self, transport):
796
1003
 
797
1004
class LockContention(LockError):
798
1005
 
799
 
    _fmt = "Could not acquire lock %(lock)s"
 
1006
    _fmt = 'Could not acquire lock "%(lock)s"'
800
1007
    # TODO: show full url for lock, combining the transport and relative
801
1008
    # bits?
802
1009
 
844
1051
 
845
1052
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
846
1053
 
847
 
    internal_error = True
848
 
 
849
1054
    def __init__(self, obj):
850
1055
        self.obj = obj
851
1056
 
876
1081
        BzrError.__init__(self, files=files, files_str=files_str)
877
1082
 
878
1083
 
 
1084
class BadCommitMessageEncoding(BzrError):
 
1085
 
 
1086
    _fmt = 'The specified commit message contains characters unsupported by '\
 
1087
        'the current encoding.'
 
1088
 
 
1089
 
879
1090
class UpgradeReadonly(BzrError):
880
1091
 
881
1092
    _fmt = "Upgrade URL cannot work with readonly URLs."
895
1106
    _fmt = "Commit refused because there are unknowns in the tree."
896
1107
 
897
1108
 
898
 
class NoSuchRevision(BzrError):
899
 
 
900
 
    _fmt = "Branch %(branch)s has no revision %(revision)s"
901
 
 
902
 
    internal_error = True
 
1109
class NoSuchRevision(InternalBzrError):
 
1110
 
 
1111
    _fmt = "%(branch)s has no revision %(revision)s"
903
1112
 
904
1113
    def __init__(self, branch, revision):
 
1114
        # 'branch' may sometimes be an internal object like a KnitRevisionStore
905
1115
        BzrError.__init__(self, branch=branch, revision=revision)
906
1116
 
907
1117
 
908
 
class NotLeftParentDescendant(BzrError):
909
 
 
910
 
    _fmt = ("Revision %(old_revision)s is not the left parent of"
911
 
            " %(new_revision)s, but branch %(branch_location)s expects this")
912
 
 
913
 
    internal_error = True
914
 
 
915
 
    def __init__(self, branch, old_revision, new_revision):
916
 
        BzrError.__init__(self, branch_location=branch.base,
917
 
                          old_revision=old_revision,
918
 
                          new_revision=new_revision)
 
1118
class RangeInChangeOption(BzrError):
 
1119
 
 
1120
    _fmt = "Option --change does not accept revision ranges"
919
1121
 
920
1122
 
921
1123
class NoSuchRevisionSpec(BzrError):
929
1131
class NoSuchRevisionInTree(NoSuchRevision):
930
1132
    """When using Tree.revision_tree, and the revision is not accessible."""
931
1133
    
932
 
    _fmt = "The revision id %(revision_id)s is not present in the tree %(tree)s."
 
1134
    _fmt = "The revision id {%(revision_id)s} is not present in the tree %(tree)s."
933
1135
 
934
1136
    def __init__(self, tree, revision_id):
935
1137
        BzrError.__init__(self)
972
1174
    _fmt = ("These branches have diverged."
973
1175
            " Use the merge command to reconcile them.")
974
1176
 
975
 
    internal_error = False
976
 
 
977
1177
    def __init__(self, branch1, branch2):
978
1178
        self.branch1 = branch1
979
1179
        self.branch2 = branch2
980
1180
 
981
1181
 
982
 
class NotLefthandHistory(BzrError):
 
1182
class NotLefthandHistory(InternalBzrError):
983
1183
 
984
1184
    _fmt = "Supplied history does not follow left-hand parents"
985
1185
 
986
 
    internal_error = True
987
 
 
988
1186
    def __init__(self, history):
989
1187
        BzrError.__init__(self, history=history)
990
1188
 
994
1192
    _fmt = ("Branches have no common ancestor, and"
995
1193
            " no merge base revision was specified.")
996
1194
 
997
 
    internal_error = False
 
1195
 
 
1196
class CannotReverseCherrypick(BzrError):
 
1197
 
 
1198
    _fmt = ('Selected merge cannot perform reverse cherrypicks.  Try merge3'
 
1199
            ' or diff3.')
998
1200
 
999
1201
 
1000
1202
class NoCommonAncestor(BzrError):
1044
1246
        self.bases = bases
1045
1247
 
1046
1248
 
1047
 
class NoCommits(BzrError):
 
1249
class NoCommits(BranchError):
1048
1250
 
1049
1251
    _fmt = "Branch %(branch)s has no commits."
1050
1252
 
1051
 
    def __init__(self, branch):
1052
 
        BzrError.__init__(self, branch=branch)
1053
 
 
1054
1253
 
1055
1254
class UnlistableStore(BzrError):
1056
1255
 
1067
1266
 
1068
1267
class BoundBranchOutOfDate(BzrError):
1069
1268
 
1070
 
    _fmt = ("Bound branch %(branch)s is out of date"
1071
 
            " with master branch %(master)s.")
 
1269
    _fmt = ("Bound branch %(branch)s is out of date with master branch"
 
1270
            " %(master)s.")
1072
1271
 
1073
1272
    def __init__(self, branch, master):
1074
1273
        BzrError.__init__(self)
1150
1349
 
1151
1350
class WeaveParentMismatch(WeaveError):
1152
1351
 
1153
 
    _fmt = "Parents are mismatched between two revisions."
 
1352
    _fmt = "Parents are mismatched between two revisions. %(message)s"
1154
1353
    
1155
1354
 
1156
1355
class WeaveInvalidChecksum(WeaveError):
1189
1388
 
1190
1389
class RevisionNotPresent(VersionedFileError):
1191
1390
    
1192
 
    _fmt = "Revision {%(revision_id)s} not present in %(file_id)s."
 
1391
    _fmt = 'Revision {%(revision_id)s} not present in "%(file_id)s".'
1193
1392
 
1194
1393
    def __init__(self, revision_id, file_id):
1195
1394
        VersionedFileError.__init__(self)
1199
1398
 
1200
1399
class RevisionAlreadyPresent(VersionedFileError):
1201
1400
    
1202
 
    _fmt = "Revision {%(revision_id)s} already present in %(file_id)s."
 
1401
    _fmt = 'Revision {%(revision_id)s} already present in "%(file_id)s".'
1203
1402
 
1204
1403
    def __init__(self, revision_id, file_id):
1205
1404
        VersionedFileError.__init__(self)
1207
1406
        self.file_id = file_id
1208
1407
 
1209
1408
 
1210
 
class KnitError(BzrError):
 
1409
class VersionedFileInvalidChecksum(VersionedFileError):
 
1410
 
 
1411
    _fmt = "Text did not match its checksum: %(message)s"
 
1412
 
 
1413
 
 
1414
class KnitError(InternalBzrError):
1211
1415
    
1212
1416
    _fmt = "Knit error"
1213
1417
 
1214
 
    internal_error = True
1215
 
 
1216
 
 
1217
 
class KnitHeaderError(KnitError):
1218
 
 
1219
 
    _fmt = "Knit header error: %(badline)r unexpected for file %(filename)s"
1220
 
 
1221
 
    def __init__(self, badline, filename):
1222
 
        KnitError.__init__(self)
1223
 
        self.badline = badline
1224
 
        self.filename = filename
1225
 
 
1226
1418
 
1227
1419
class KnitCorrupt(KnitError):
1228
1420
 
1234
1426
        self.how = how
1235
1427
 
1236
1428
 
 
1429
class KnitDataStreamIncompatible(KnitError):
 
1430
    # Not raised anymore, as we can convert data streams.  In future we may
 
1431
    # need it again for more exotic cases, so we're keeping it around for now.
 
1432
 
 
1433
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
1434
 
 
1435
    def __init__(self, stream_format, target_format):
 
1436
        self.stream_format = stream_format
 
1437
        self.target_format = target_format
 
1438
        
 
1439
 
 
1440
class KnitDataStreamUnknown(KnitError):
 
1441
    # Indicates a data stream we don't know how to handle.
 
1442
 
 
1443
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
1444
 
 
1445
    def __init__(self, stream_format):
 
1446
        self.stream_format = stream_format
 
1447
        
 
1448
 
 
1449
class KnitHeaderError(KnitError):
 
1450
 
 
1451
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
1452
 
 
1453
    def __init__(self, badline, filename):
 
1454
        KnitError.__init__(self)
 
1455
        self.badline = badline
 
1456
        self.filename = filename
 
1457
 
1237
1458
class KnitIndexUnknownMethod(KnitError):
1238
1459
    """Raised when we don't understand the storage method.
1239
1460
 
1274
1495
        BzrError.__init__(self)
1275
1496
 
1276
1497
 
1277
 
class TooManyConcurrentRequests(BzrError):
 
1498
class TooManyConcurrentRequests(InternalBzrError):
1278
1499
 
1279
1500
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
1280
1501
            " Be sure to finish_writing and finish_reading on the"
1281
1502
            " currently open request.")
1282
1503
 
1283
 
    internal_error = True
1284
 
 
1285
1504
    def __init__(self, medium):
1286
1505
        self.medium = medium
1287
1506
 
1294
1513
        self.details = details
1295
1514
 
1296
1515
 
 
1516
class UnexpectedProtocolVersionMarker(TransportError):
 
1517
 
 
1518
    _fmt = "Received bad protocol version marker: %(marker)r"
 
1519
 
 
1520
    def __init__(self, marker):
 
1521
        self.marker = marker
 
1522
 
 
1523
 
 
1524
class UnknownSmartMethod(InternalBzrError):
 
1525
 
 
1526
    _fmt = "The server does not recognise the '%(verb)s' request."
 
1527
 
 
1528
    def __init__(self, verb):
 
1529
        self.verb = verb
 
1530
 
 
1531
 
 
1532
class SmartMessageHandlerError(InternalBzrError):
 
1533
 
 
1534
    _fmt = "The message handler raised an exception: %(exc_value)s."
 
1535
 
 
1536
    def __init__(self, exc_info):
 
1537
        self.exc_type, self.exc_value, self.tb = exc_info
 
1538
        
 
1539
 
1297
1540
# A set of semi-meaningful errors which can be thrown
1298
1541
class TransportNotPossible(TransportError):
1299
1542
 
1331
1574
 
1332
1575
class InvalidRange(TransportError):
1333
1576
 
1334
 
    _fmt = "Invalid range access in %(path)s at %(offset)s."
1335
 
    
1336
 
    def __init__(self, path, offset):
1337
 
        TransportError.__init__(self, ("Invalid range access in %s at %d"
1338
 
                                       % (path, offset)))
 
1577
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
 
1578
 
 
1579
    def __init__(self, path, offset, msg=None):
 
1580
        TransportError.__init__(self, msg)
1339
1581
        self.path = path
1340
1582
        self.offset = offset
1341
1583
 
1352
1594
class InvalidHttpRange(InvalidHttpResponse):
1353
1595
 
1354
1596
    _fmt = "Invalid http range %(range)r for %(path)s: %(msg)s"
1355
 
    
 
1597
 
1356
1598
    def __init__(self, path, range, msg):
1357
1599
        self.range = range
1358
1600
        InvalidHttpResponse.__init__(self, path, msg)
1361
1603
class InvalidHttpContentType(InvalidHttpResponse):
1362
1604
 
1363
1605
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1364
 
    
 
1606
 
1365
1607
    def __init__(self, path, ctype, msg):
1366
1608
        self.ctype = ctype
1367
1609
        InvalidHttpResponse.__init__(self, path, msg)
1371
1613
 
1372
1614
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1373
1615
 
1374
 
    def __init__(self, source, target, is_permament=False, qual_proto=None):
 
1616
    def __init__(self, source, target, is_permanent=False, qual_proto=None):
1375
1617
        self.source = source
1376
1618
        self.target = target
1377
 
        if is_permament:
 
1619
        if is_permanent:
1378
1620
            self.permanently = ' permanently'
1379
1621
        else:
1380
1622
            self.permanently = ''
1381
 
        self.is_permament = is_permament
1382
1623
        self._qualified_proto = qual_proto
1383
1624
        TransportError.__init__(self)
1384
1625
 
1420
1661
 
1421
1662
    _fmt = "Too many redirections"
1422
1663
 
 
1664
 
1423
1665
class ConflictsInTree(BzrError):
1424
1666
 
1425
1667
    _fmt = "Working tree has conflicts."
1446
1688
 
1447
1689
class SigningFailed(BzrError):
1448
1690
 
1449
 
    _fmt = "Failed to gpg sign data with command %(command_line)r"
 
1691
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1450
1692
 
1451
1693
    def __init__(self, command_line):
1452
1694
        BzrError.__init__(self, command_line=command_line)
1477
1719
        self.graph = graph
1478
1720
 
1479
1721
 
1480
 
class WritingCompleted(BzrError):
 
1722
class WritingCompleted(InternalBzrError):
1481
1723
 
1482
1724
    _fmt = ("The MediumRequest '%(request)s' has already had finish_writing "
1483
1725
            "called upon it - accept bytes may not be called anymore.")
1484
1726
 
1485
 
    internal_error = True
1486
 
 
1487
1727
    def __init__(self, request):
1488
1728
        self.request = request
1489
1729
 
1490
1730
 
1491
 
class WritingNotComplete(BzrError):
 
1731
class WritingNotComplete(InternalBzrError):
1492
1732
 
1493
1733
    _fmt = ("The MediumRequest '%(request)s' has not has finish_writing "
1494
1734
            "called upon it - until the write phase is complete no "
1495
1735
            "data may be read.")
1496
1736
 
1497
 
    internal_error = True
1498
 
 
1499
1737
    def __init__(self, request):
1500
1738
        self.request = request
1501
1739
 
1509
1747
        self.filename = filename
1510
1748
 
1511
1749
 
1512
 
class MediumNotConnected(BzrError):
 
1750
class MediumNotConnected(InternalBzrError):
1513
1751
 
1514
1752
    _fmt = """The medium '%(medium)s' is not connected."""
1515
1753
 
1516
 
    internal_error = True
1517
 
 
1518
1754
    def __init__(self, medium):
1519
1755
        self.medium = medium
1520
1756
 
1526
1762
 
1527
1763
class NoBundleFound(BzrError):
1528
1764
 
1529
 
    _fmt = "No bundle was found in %(filename)s"
 
1765
    _fmt = 'No bundle was found in "%(filename)s".'
1530
1766
 
1531
1767
    def __init__(self, filename):
1532
1768
        BzrError.__init__(self)
1596
1832
        self.root_trans_id = transform.root
1597
1833
 
1598
1834
 
1599
 
class BzrBadParameter(BzrError):
 
1835
class BzrBadParameter(InternalBzrError):
1600
1836
 
1601
1837
    _fmt = "Bad parameter: %(param)r"
1602
1838
 
1603
 
    internal_error = True
1604
 
 
1605
1839
    # This exception should never be thrown, but it is a base class for all
1606
1840
    # parameter-to-function errors.
1607
1841
 
1669
1903
class BzrRemoveChangedFilesError(BzrError):
1670
1904
    """Used when user is trying to remove changed files."""
1671
1905
 
1672
 
    _fmt = ("Can't remove changed or unknown files:\n%(changes_as_text)s"
 
1906
    _fmt = ("Can't safely remove modified or unknown files:\n"
 
1907
        "%(changes_as_text)s"
1673
1908
        "Use --keep to not delete them, or --force to delete them regardless.")
1674
1909
 
1675
1910
    def __init__(self, tree_delta):
1740
1975
        self.format = format
1741
1976
 
1742
1977
 
 
1978
class NoDiffFound(BzrError):
 
1979
 
 
1980
    _fmt = 'Could not find an appropriate Differ for file "%(path)s"'
 
1981
 
 
1982
    def __init__(self, path):
 
1983
        BzrError.__init__(self, path)
 
1984
 
 
1985
 
 
1986
class ExecutableMissing(BzrError):
 
1987
 
 
1988
    _fmt = "%(exe_name)s could not be found on this machine"
 
1989
 
 
1990
    def __init__(self, exe_name):
 
1991
        BzrError.__init__(self, exe_name=exe_name)
 
1992
 
 
1993
 
1743
1994
class NoDiff(BzrError):
1744
1995
 
1745
1996
    _fmt = "Diff is not installed on this machine: %(msg)s"
1753
2004
    _fmt = "Diff3 is not installed on this machine."
1754
2005
 
1755
2006
 
 
2007
class ExistingContent(BzrError):
 
2008
    # Added in bzrlib 0.92, used by VersionedFile.add_lines.
 
2009
 
 
2010
    _fmt = "The content being inserted is already present."
 
2011
 
 
2012
 
1756
2013
class ExistingLimbo(BzrError):
1757
2014
 
1758
2015
    _fmt = """This tree contains left-over files from a failed operation.
1764
2021
       self.limbo_dir = limbo_dir
1765
2022
 
1766
2023
 
 
2024
class ExistingPendingDeletion(BzrError):
 
2025
 
 
2026
    _fmt = """This tree contains left-over files from a failed operation.
 
2027
    Please examine %(pending_deletion)s to see if it contains any files you
 
2028
    wish to keep, and delete it when you are done."""
 
2029
 
 
2030
    def __init__(self, pending_deletion):
 
2031
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2032
 
 
2033
 
1767
2034
class ImmortalLimbo(BzrError):
1768
2035
 
1769
 
    _fmt = """Unable to delete transform temporary directory $(limbo_dir)s.
 
2036
    _fmt = """Unable to delete transform temporary directory %(limbo_dir)s.
1770
2037
    Please examine %(limbo_dir)s to see if it contains any files you wish to
1771
2038
    keep, and delete it when you are done."""
1772
2039
 
1775
2042
       self.limbo_dir = limbo_dir
1776
2043
 
1777
2044
 
 
2045
class ImmortalPendingDeletion(BzrError):
 
2046
 
 
2047
    _fmt = ("Unable to delete transform temporary directory "
 
2048
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
2049
    "contains any files you wish to keep, and delete it when you are done.")
 
2050
 
 
2051
    def __init__(self, pending_deletion):
 
2052
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
2053
 
 
2054
 
1778
2055
class OutOfDateTree(BzrError):
1779
2056
 
1780
2057
    _fmt = "Working tree is out of date, please run 'bzr update'."
1807
2084
    _fmt = "Format error in conflict listings"
1808
2085
 
1809
2086
 
 
2087
class CorruptDirstate(BzrError):
 
2088
 
 
2089
    _fmt = ("Inconsistency in dirstate file %(dirstate_path)s.\n"
 
2090
            "Error: %(description)s")
 
2091
 
 
2092
    def __init__(self, dirstate_path, description):
 
2093
        BzrError.__init__(self)
 
2094
        self.dirstate_path = dirstate_path
 
2095
        self.description = description
 
2096
 
 
2097
 
1810
2098
class CorruptRepository(BzrError):
1811
2099
 
1812
2100
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
1817
2105
        self.repo_path = repo.bzrdir.root_transport.base
1818
2106
 
1819
2107
 
 
2108
class InconsistentDelta(BzrError):
 
2109
    """Used when we get a delta that is not valid."""
 
2110
 
 
2111
    _fmt = ("An inconsistent delta was supplied involving %(path)r,"
 
2112
            " %(file_id)r\nreason: %(reason)s")
 
2113
 
 
2114
    def __init__(self, path, file_id, reason):
 
2115
        BzrError.__init__(self)
 
2116
        self.path = path
 
2117
        self.file_id = file_id
 
2118
        self.reason = reason
 
2119
 
 
2120
 
1820
2121
class UpgradeRequired(BzrError):
1821
2122
 
1822
2123
    _fmt = "To use this feature you must upgrade your branch at %(path)s."
1826
2127
        self.path = path
1827
2128
 
1828
2129
 
 
2130
class RepositoryUpgradeRequired(UpgradeRequired):
 
2131
 
 
2132
    _fmt = "To use this feature you must upgrade your repository at %(path)s."
 
2133
 
 
2134
 
1829
2135
class LocalRequiresBoundBranch(BzrError):
1830
2136
 
1831
2137
    _fmt = "Cannot perform local-only commits on unbound branches."
1963
2269
    _fmt = """This operation requires rich root data storage"""
1964
2270
 
1965
2271
 
1966
 
class NoSmartMedium(BzrError):
 
2272
class NoSmartMedium(InternalBzrError):
1967
2273
 
1968
2274
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
1969
2275
 
1970
 
    internal_error = True
1971
 
 
1972
2276
    def __init__(self, transport):
1973
2277
        self.transport = transport
1974
2278
 
1977
2281
 
1978
2282
    _fmt = "No smart server available at %(url)s"
1979
2283
 
 
2284
    @symbol_versioning.deprecated_method(symbol_versioning.one_four)
1980
2285
    def __init__(self, url):
1981
2286
        self.url = url
1982
2287
 
1996
2301
            " Please set BZR_SSH environment variable.")
1997
2302
 
1998
2303
 
 
2304
class GhostRevisionsHaveNoRevno(BzrError):
 
2305
    """When searching for revnos, if we encounter a ghost, we are stuck"""
 
2306
 
 
2307
    _fmt = ("Could not determine revno for {%(revision_id)s} because"
 
2308
            " its ancestry shows a ghost at {%(ghost_revision_id)s}")
 
2309
 
 
2310
    def __init__(self, revision_id, ghost_revision_id):
 
2311
        self.revision_id = revision_id
 
2312
        self.ghost_revision_id = ghost_revision_id
 
2313
 
 
2314
        
1999
2315
class GhostRevisionUnusableHere(BzrError):
2000
2316
 
2001
2317
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
2005
2321
        self.revision_id = revision_id
2006
2322
 
2007
2323
 
2008
 
class IllegalUseOfScopeReplacer(BzrError):
 
2324
class IllegalUseOfScopeReplacer(InternalBzrError):
2009
2325
 
2010
2326
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
2011
2327
            " %(msg)s%(extra)s")
2012
2328
 
2013
 
    internal_error = True
2014
 
 
2015
2329
    def __init__(self, name, msg, extra=None):
2016
2330
        BzrError.__init__(self)
2017
2331
        self.name = name
2022
2336
            self.extra = ''
2023
2337
 
2024
2338
 
2025
 
class InvalidImportLine(BzrError):
 
2339
class InvalidImportLine(InternalBzrError):
2026
2340
 
2027
2341
    _fmt = "Not a valid import statement: %(msg)\n%(text)s"
2028
2342
 
2029
 
    internal_error = True
2030
 
 
2031
2343
    def __init__(self, text, msg):
2032
2344
        BzrError.__init__(self)
2033
2345
        self.text = text
2034
2346
        self.msg = msg
2035
2347
 
2036
2348
 
2037
 
class ImportNameCollision(BzrError):
 
2349
class ImportNameCollision(InternalBzrError):
2038
2350
 
2039
2351
    _fmt = ("Tried to import an object to the same name as"
2040
2352
            " an existing object. %(name)s")
2041
2353
 
2042
 
    internal_error = True
2043
 
 
2044
2354
    def __init__(self, name):
2045
2355
        BzrError.__init__(self)
2046
2356
        self.name = name
2059
2369
        " branch location."
2060
2370
 
2061
2371
 
 
2372
class IllegalMergeDirectivePayload(BzrError):
 
2373
    """A merge directive contained something other than a patch or bundle"""
 
2374
 
 
2375
    _fmt = "Bad merge directive payload %(start)r"
 
2376
 
 
2377
    def __init__(self, start):
 
2378
        BzrError(self)
 
2379
        self.start = start
 
2380
 
 
2381
 
 
2382
class PatchVerificationFailed(BzrError):
 
2383
    """A patch from a merge directive could not be verified"""
 
2384
 
 
2385
    _fmt = "Preview patch does not match requested changes."
 
2386
 
 
2387
 
2062
2388
class PatchMissing(BzrError):
2063
2389
    """Raise a patch type was specified but no patch supplied"""
2064
2390
 
2065
 
    _fmt = "patch_type was %(patch_type)s, but no patch was supplied."
 
2391
    _fmt = "Patch_type was %(patch_type)s, but no patch was supplied."
2066
2392
 
2067
2393
    def __init__(self, patch_type):
2068
2394
        BzrError.__init__(self)
2069
2395
        self.patch_type = patch_type
2070
2396
 
2071
2397
 
 
2398
class TargetNotBranch(BzrError):
 
2399
    """A merge directive's target branch is required, but isn't a branch"""
 
2400
 
 
2401
    _fmt = ("Your branch does not have all of the revisions required in "
 
2402
            "order to merge this merge directive and the target "
 
2403
            "location specified in the merge directive is not a branch: "
 
2404
            "%(location)s.")
 
2405
 
 
2406
    def __init__(self, location):
 
2407
        BzrError.__init__(self)
 
2408
        self.location = location
 
2409
 
 
2410
 
2072
2411
class UnsupportedInventoryKind(BzrError):
2073
2412
    
2074
2413
    _fmt = """Unsupported entry kind %(kind)s"""
2079
2418
 
2080
2419
class BadSubsumeSource(BzrError):
2081
2420
 
2082
 
    _fmt = """Can't subsume %(other_tree)s into %(tree)s.  %(reason)s"""
 
2421
    _fmt = "Can't subsume %(other_tree)s into %(tree)s. %(reason)s"
2083
2422
 
2084
2423
    def __init__(self, tree, other_tree, reason):
2085
2424
        self.tree = tree
2095
2434
        self.other_tree = other_tree
2096
2435
 
2097
2436
 
2098
 
class BadReferenceTarget(BzrError):
2099
 
 
2100
 
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s.  %(reason)s"
2101
 
 
2102
 
    internal_error = True
 
2437
class BadReferenceTarget(InternalBzrError):
 
2438
 
 
2439
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s." \
 
2440
           "%(reason)s"
2103
2441
 
2104
2442
    def __init__(self, tree, other_tree, reason):
2105
2443
        self.tree = tree
2118
2456
class TagsNotSupported(BzrError):
2119
2457
 
2120
2458
    _fmt = ("Tags not supported by %(branch)s;"
2121
 
            " you may be able to use bzr upgrade --dirstate-tags.")
 
2459
            " you may be able to use bzr upgrade.")
2122
2460
 
2123
2461
    def __init__(self, branch):
2124
2462
        self.branch = branch
2141
2479
        self.reason = reason
2142
2480
 
2143
2481
 
 
2482
class InvalidBugTrackerURL(BzrError):
 
2483
 
 
2484
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
2485
            "contain {id}: %(url)s")
 
2486
 
 
2487
    def __init__(self, abbreviation, url):
 
2488
        self.abbreviation = abbreviation
 
2489
        self.url = url
 
2490
 
 
2491
 
2144
2492
class UnknownBugTrackerAbbreviation(BzrError):
2145
2493
 
2146
2494
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
2159
2507
        self.response_tuple = response_tuple
2160
2508
 
2161
2509
 
 
2510
class ErrorFromSmartServer(BzrError):
 
2511
    """An error was received from a smart server.
 
2512
 
 
2513
    :seealso: UnknownErrorFromSmartServer
 
2514
    """
 
2515
 
 
2516
    _fmt = "Error received from smart server: %(error_tuple)r"
 
2517
 
 
2518
    internal_error = True
 
2519
 
 
2520
    def __init__(self, error_tuple):
 
2521
        self.error_tuple = error_tuple
 
2522
        try:
 
2523
            self.error_verb = error_tuple[0]
 
2524
        except IndexError:
 
2525
            self.error_verb = None
 
2526
        self.error_args = error_tuple[1:]
 
2527
 
 
2528
 
 
2529
class UnknownErrorFromSmartServer(BzrError):
 
2530
    """An ErrorFromSmartServer could not be translated into a typical bzrlib
 
2531
    error.
 
2532
 
 
2533
    This is distinct from ErrorFromSmartServer so that it is possible to
 
2534
    distinguish between the following two cases:
 
2535
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2536
        and so should provoke a traceback to the user.
 
2537
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
2538
        translated.  This is probably because the server sent us garbage, and
 
2539
        should not provoke a traceback.
 
2540
    """
 
2541
 
 
2542
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
 
2543
 
 
2544
    internal_error = False
 
2545
 
 
2546
    def __init__(self, error_from_smart_server):
 
2547
        """Constructor.
 
2548
 
 
2549
        :param error_from_smart_server: An ErrorFromSmartServer instance.
 
2550
        """
 
2551
        self.error_from_smart_server = error_from_smart_server
 
2552
        self.error_tuple = error_from_smart_server.error_tuple
 
2553
        
 
2554
 
2162
2555
class ContainerError(BzrError):
2163
2556
    """Base class of container errors."""
2164
2557
 
2175
2568
 
2176
2569
    _fmt = "Unexpected end of container stream"
2177
2570
 
2178
 
    internal_error = False
2179
 
 
2180
2571
 
2181
2572
class UnknownRecordTypeError(ContainerError):
2182
2573
 
2204
2595
 
2205
2596
class DuplicateRecordNameError(ContainerError):
2206
2597
 
2207
 
    _fmt = "Container has multiple records with the same name: \"%(name)s\""
 
2598
    _fmt = "Container has multiple records with the same name: %(name)s"
2208
2599
 
2209
2600
    def __init__(self, name):
2210
2601
        self.name = name
2211
2602
 
2212
2603
 
2213
 
class NoDestinationAddress(BzrError):
 
2604
class NoDestinationAddress(InternalBzrError):
2214
2605
 
2215
2606
    _fmt = "Message does not have a destination address."
2216
2607
 
2217
 
    internal_error = True
 
2608
 
 
2609
class RepositoryDataStreamError(BzrError):
 
2610
 
 
2611
    _fmt = "Corrupt or incompatible data stream: %(reason)s"
 
2612
 
 
2613
    def __init__(self, reason):
 
2614
        self.reason = reason
2218
2615
 
2219
2616
 
2220
2617
class SMTPError(BzrError):
2223
2620
 
2224
2621
    def __init__(self, error):
2225
2622
        self.error = error
 
2623
 
 
2624
 
 
2625
class NoMessageSupplied(BzrError):
 
2626
 
 
2627
    _fmt = "No message supplied."
 
2628
 
 
2629
 
 
2630
class NoMailAddressSpecified(BzrError):
 
2631
 
 
2632
    _fmt = "No mail-to address specified."
 
2633
 
 
2634
 
 
2635
class UnknownMailClient(BzrError):
 
2636
 
 
2637
    _fmt = "Unknown mail client: %(mail_client)s"
 
2638
 
 
2639
    def __init__(self, mail_client):
 
2640
        BzrError.__init__(self, mail_client=mail_client)
 
2641
 
 
2642
 
 
2643
class MailClientNotFound(BzrError):
 
2644
 
 
2645
    _fmt = "Unable to find mail client with the following names:"\
 
2646
        " %(mail_command_list_string)s"
 
2647
 
 
2648
    def __init__(self, mail_command_list):
 
2649
        mail_command_list_string = ', '.join(mail_command_list)
 
2650
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
2651
                          mail_command_list_string=mail_command_list_string)
 
2652
 
 
2653
class SMTPConnectionRefused(SMTPError):
 
2654
 
 
2655
    _fmt = "SMTP connection to %(host)s refused"
 
2656
 
 
2657
    def __init__(self, error, host):
 
2658
        self.error = error
 
2659
        self.host = host
 
2660
 
 
2661
 
 
2662
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
2663
 
 
2664
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
2665
 
 
2666
 
 
2667
class BzrDirError(BzrError):
 
2668
 
 
2669
    def __init__(self, bzrdir):
 
2670
        import bzrlib.urlutils as urlutils
 
2671
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
2672
                                                    'ascii')
 
2673
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
2674
 
 
2675
 
 
2676
class UnsyncedBranches(BzrDirError):
 
2677
 
 
2678
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
2679
            " bzr help sync-for-reconfigure.")
 
2680
 
 
2681
    def __init__(self, bzrdir, target_branch):
 
2682
        BzrDirError.__init__(self, bzrdir)
 
2683
        import bzrlib.urlutils as urlutils
 
2684
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
2685
                                                        'ascii')
 
2686
 
 
2687
 
 
2688
class AlreadyBranch(BzrDirError):
 
2689
 
 
2690
    _fmt = "'%(display_url)s' is already a branch."
 
2691
 
 
2692
 
 
2693
class AlreadyTree(BzrDirError):
 
2694
 
 
2695
    _fmt = "'%(display_url)s' is already a tree."
 
2696
 
 
2697
 
 
2698
class AlreadyCheckout(BzrDirError):
 
2699
 
 
2700
    _fmt = "'%(display_url)s' is already a checkout."
 
2701
 
 
2702
 
 
2703
class AlreadyLightweightCheckout(BzrDirError):
 
2704
 
 
2705
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
2706
 
 
2707
 
 
2708
class AlreadyUsingShared(BzrDirError):
 
2709
 
 
2710
    _fmt = "'%(display_url)s' is already using a shared repository."
 
2711
 
 
2712
 
 
2713
class AlreadyStandalone(BzrDirError):
 
2714
 
 
2715
    _fmt = "'%(display_url)s' is already standalone."
 
2716
 
 
2717
 
 
2718
class ReconfigurationNotSupported(BzrDirError):
 
2719
 
 
2720
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
2721
 
 
2722
 
 
2723
class NoBindLocation(BzrDirError):
 
2724
 
 
2725
    _fmt = "No location could be found to bind to at %(display_url)s."
 
2726
 
 
2727
 
 
2728
class UncommittedChanges(BzrError):
 
2729
 
 
2730
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
2731
 
 
2732
    def __init__(self, tree):
 
2733
        import bzrlib.urlutils as urlutils
 
2734
        display_url = urlutils.unescape_for_display(
 
2735
            tree.bzrdir.root_transport.base, 'ascii')
 
2736
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
2737
 
 
2738
 
 
2739
class MissingTemplateVariable(BzrError):
 
2740
 
 
2741
    _fmt = 'Variable {%(name)s} is not available.'
 
2742
 
 
2743
    def __init__(self, name):
 
2744
        self.name = name
 
2745
 
 
2746
 
 
2747
class NoTemplate(BzrError):
 
2748
 
 
2749
    _fmt = 'No template specified.'
 
2750
 
 
2751
 
 
2752
class UnableCreateSymlink(BzrError):
 
2753
 
 
2754
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
2755
 
 
2756
    def __init__(self, path=None):
 
2757
        path_str = ''
 
2758
        if path:
 
2759
            try:
 
2760
                path_str = repr(str(path))
 
2761
            except UnicodeEncodeError:
 
2762
                path_str = repr(path)
 
2763
            path_str += ' '
 
2764
        self.path_str = path_str
 
2765
 
 
2766
 
 
2767
class UnsupportedTimezoneFormat(BzrError):
 
2768
 
 
2769
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
2770
            'options are "utc", "original", "local".')
 
2771
 
 
2772
    def __init__(self, timezone):
 
2773
        self.timezone = timezone
 
2774
 
 
2775
 
 
2776
class CommandAvailableInPlugin(StandardError):
 
2777
    
 
2778
    internal_error = False
 
2779
 
 
2780
    def __init__(self, cmd_name, plugin_metadata, provider):
 
2781
        
 
2782
        self.plugin_metadata = plugin_metadata
 
2783
        self.cmd_name = cmd_name
 
2784
        self.provider = provider
 
2785
 
 
2786
    def __str__(self):
 
2787
 
 
2788
        _fmt = ('"%s" is not a standard bzr command. \n' 
 
2789
                'However, the following official plugin provides this command: %s\n'
 
2790
                'You can install it by going to: %s'
 
2791
                % (self.cmd_name, self.plugin_metadata['name'], 
 
2792
                    self.plugin_metadata['url']))
 
2793
 
 
2794
        return _fmt
 
2795
 
 
2796
 
 
2797
class NoPluginAvailable(BzrError):
 
2798
    pass    
 
2799
 
 
2800
 
 
2801
class NotATerminal(BzrError):
 
2802
 
 
2803
    _fmt = 'Unable to ask for a password without real terminal.'
 
2804
 
 
2805
 
 
2806
class UnableEncodePath(BzrError):
 
2807
 
 
2808
    _fmt = ('Unable to encode %(kind)s path %(path)r in '
 
2809
            'user encoding %(user_encoding)s')
 
2810
 
 
2811
    def __init__(self, path, kind):
 
2812
        self.path = path
 
2813
        self.kind = kind
 
2814
        self.user_encoding = osutils.get_user_encoding()
 
2815
 
 
2816
 
 
2817
class NoSuchAlias(BzrError):
 
2818
 
 
2819
    _fmt = ('The alias "%(alias_name)s" does not exist.')
 
2820
 
 
2821
    def __init__(self, alias_name):
 
2822
        BzrError.__init__(self, alias_name=alias_name)
 
2823
 
 
2824
 
 
2825
class DirectoryLookupFailure(BzrError):
 
2826
    """Base type for lookup errors."""
 
2827
 
 
2828
    pass
 
2829
 
 
2830
 
 
2831
class InvalidLocationAlias(DirectoryLookupFailure):
 
2832
 
 
2833
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
2834
 
 
2835
    def __init__(self, alias_name):
 
2836
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
2837
 
 
2838
 
 
2839
class UnsetLocationAlias(DirectoryLookupFailure):
 
2840
 
 
2841
    _fmt = 'No %(alias_name)s location assigned.'
 
2842
 
 
2843
    def __init__(self, alias_name):
 
2844
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
2845
 
 
2846
 
 
2847
class CannotBindAddress(BzrError):
 
2848
 
 
2849
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
2850
 
 
2851
    def __init__(self, host, port, orig_error):
 
2852
        BzrError.__init__(self, host=host, port=port,
 
2853
            orig_error=orig_error[1])
 
2854
 
 
2855
 
 
2856
class UnknownRules(BzrError):
 
2857
 
 
2858
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
2859
 
 
2860
    def __init__(self, unknowns):
 
2861
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
2862
 
 
2863
 
 
2864
class HookFailed(BzrError):
 
2865
    """Raised when a pre_change_branch_tip hook function fails anything other
 
2866
    than TipChangeRejected.
 
2867
    """
 
2868
 
 
2869
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
2870
            "%(traceback_text)s%(exc_value)s")
 
2871
 
 
2872
    def __init__(self, hook_stage, hook_name, exc_info):
 
2873
        import traceback
 
2874
        self.hook_stage = hook_stage
 
2875
        self.hook_name = hook_name
 
2876
        self.exc_info = exc_info
 
2877
        self.exc_type = exc_info[0]
 
2878
        self.exc_value = exc_info[1]
 
2879
        self.exc_tb = exc_info[2]
 
2880
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
2881
 
 
2882
 
 
2883
class TipChangeRejected(BzrError):
 
2884
    """A pre_change_branch_tip hook function may raise this to cleanly and
 
2885
    explicitly abort a change to a branch tip.
 
2886
    """
 
2887
    
 
2888
    _fmt = u"Tip change rejected: %(msg)s"
 
2889
 
 
2890
    def __init__(self, msg):
 
2891
        self.msg = msg
 
2892