~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Alexander Belchenko
  • Date: 2007-01-04 23:36:44 UTC
  • mfrom: (2224 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2225.
  • Revision ID: bialix@ukr.net-20070104233644-7znkxoj9b0y7ev28
merge bzr.dev

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 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
18
18
"""
19
19
 
20
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
 
    )
 
21
from bzrlib import symbol_versioning
 
22
from bzrlib.patches import (PatchSyntax, 
 
23
                            PatchConflict, 
 
24
                            MalformedPatchHeader,
 
25
                            MalformedHunkHeader,
 
26
                            MalformedLine,)
32
27
 
33
28
 
34
29
# TODO: is there any value in providing the .args field used by standard
48
43
    """
49
44
    Base class for errors raised by bzrlib.
50
45
 
51
 
    :cvar internal_error: if True this was probably caused by a bzr bug and
52
 
    should be displayed with a traceback; if False (or absent) this was
 
46
    :cvar internal_error: if true (or absent) this was probably caused by a
 
47
    bzr bug and should be displayed with a traceback; if False this was
53
48
    probably a user or environment error and they don't need the gory details.
54
49
    (That can be overridden by -Derror on the command line.)
55
50
 
102
97
                    return s.encode('utf8')
103
98
                return s
104
99
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
105
 
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
100
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%s' \
106
101
                % (self.__class__.__name__,
107
102
                   self.__dict__,
108
103
                   getattr(self, '_fmt', None),
109
 
                   e)
 
104
                   str(e))
110
105
 
111
106
    def _get_format_string(self):
112
107
        """Return format string for this exception or None"""
132
127
    # readable explanation
133
128
 
134
129
    def __init__(self, *args, **kwds):
135
 
        # XXX: Use the underlying BzrError to always generate the args
136
 
        # attribute if it doesn't exist.  We can't use super here, because
137
 
        # exceptions are old-style classes in python2.4 (but new in 2.5).
138
 
        # --bmc, 20060426
 
130
        # XXX: Use the underlying BzrError to always generate the args attribute
 
131
        # if it doesn't exist.  We can't use super here, because exceptions are
 
132
        # old-style classes in python2.4 (but new in 2.5).  --bmc, 20060426
139
133
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
140
 
             'please convert %s to use BzrError instead'
 
134
             'please convert %s to use BzrError instead' 
141
135
             % self.__class__.__name__,
142
136
             DeprecationWarning,
143
137
             stacklevel=2)
154
148
                return s.encode('utf8')
155
149
            return s
156
150
        except (TypeError, NameError, ValueError, KeyError), e:
157
 
            return 'Unprintable exception %s(%r): %r' \
 
151
            return 'Unprintable exception %s(%r): %s' \
158
152
                % (self.__class__.__name__,
159
 
                   self.__dict__, e)
 
153
                   self.__dict__, str(e))
160
154
 
161
155
 
162
156
class AlreadyBuilding(BzrError):
175
169
        self.message = message
176
170
 
177
171
 
178
 
class DisabledMethod(BzrError):
179
 
 
180
 
    _fmt = "The smart server method '%(class_name)s' is disabled."
181
 
 
182
 
    internal_error = True
183
 
 
184
 
    def __init__(self, class_name):
185
 
        BzrError.__init__(self)
186
 
        self.class_name = class_name
187
 
 
188
 
 
189
 
class IncompatibleAPI(BzrError):
190
 
 
191
 
    _fmt = 'The API for "%(api)s" is not compatible with "%(wanted)s". '\
192
 
        'It supports versions "%(minimum)s" to "%(current)s".'
193
 
 
194
 
    def __init__(self, api, wanted, minimum, current):
195
 
        self.api = api
196
 
        self.wanted = wanted
197
 
        self.minimum = minimum
198
 
        self.current = current
199
 
 
200
 
 
201
 
class InProcessTransport(BzrError):
202
 
 
203
 
    _fmt = "The transport '%(transport)s' is only accessible within this " \
204
 
        "process."
205
 
 
206
 
    def __init__(self, transport):
207
 
        self.transport = transport
208
 
 
209
 
 
210
172
class InvalidEntryName(BzrError):
211
173
    
212
174
    _fmt = "Invalid entry name: %(name)s"
237
199
        self.revision_id = revision_id
238
200
        self.branch = branch
239
201
 
240
 
class ReservedId(BzrError):
241
 
 
242
 
    _fmt = "Reserved revision-id {%(revision_id)s}"
243
 
 
244
 
    def __init__(self, revision_id):
245
 
        self.revision_id = revision_id
246
 
 
247
 
 
248
 
class NoHelpTopic(BzrError):
249
 
 
250
 
    _fmt = ("No help could be found for '%(topic)s'. "
251
 
        "Please use 'bzr help topics' to obtain a list of topics.")
252
 
 
253
 
    def __init__(self, topic):
254
 
        self.topic = topic
255
 
 
256
202
 
257
203
class NoSuchId(BzrError):
258
204
 
266
212
 
267
213
class InventoryModified(BzrError):
268
214
 
269
 
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
270
 
            " so a clean inventory cannot be read without data loss.")
 
215
    _fmt = ("The current inventory for the tree %(tree)r has been modified, "
 
216
            "so a clean inventory cannot be read without data loss.")
271
217
 
272
218
    internal_error = True
273
219
 
342
288
 
343
289
    _fmt = "Error in command line options"
344
290
 
345
 
 
346
 
class BadIndexFormatSignature(BzrError):
347
 
 
348
 
    _fmt = "%(value)s is not an index of type %(_type)s."
349
 
 
350
 
    def __init__(self, value, _type):
351
 
        BzrError.__init__(self)
352
 
        self.value = value
353
 
        self._type = _type
354
 
 
355
 
 
356
 
class BadIndexData(BzrError):
357
 
 
358
 
    _fmt = "Error in data for index %(value)s."
359
 
 
360
 
    def __init__(self, value):
361
 
        BzrError.__init__(self)
362
 
        self.value = value
363
 
 
364
 
 
365
 
class BadIndexDuplicateKey(BzrError):
366
 
 
367
 
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
368
 
 
369
 
    def __init__(self, key, index):
370
 
        BzrError.__init__(self)
371
 
        self.key = key
372
 
        self.index = index
373
 
 
374
 
 
375
 
class BadIndexKey(BzrError):
376
 
 
377
 
    _fmt = "The key '%(key)s' is not a valid key."
378
 
 
379
 
    def __init__(self, key):
380
 
        BzrError.__init__(self)
381
 
        self.key = key
382
 
 
383
 
 
384
 
class BadIndexOptions(BzrError):
385
 
 
386
 
    _fmt = "Could not parse options for index %(value)s."
387
 
 
388
 
    def __init__(self, value):
389
 
        BzrError.__init__(self)
390
 
        self.value = value
391
 
 
392
 
 
393
 
class BadIndexValue(BzrError):
394
 
 
395
 
    _fmt = "The value '%(value)s' is not a valid value."
396
 
 
397
 
    def __init__(self, value):
398
 
        BzrError.__init__(self)
399
 
        self.value = value
400
 
 
401
 
 
402
 
class BadOptionValue(BzrError):
403
 
 
404
 
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
405
 
 
406
 
    def __init__(self, name, value):
407
 
        BzrError.__init__(self, name=name, value=value)
408
 
 
409
291
    
410
292
class StrictCommitFailed(BzrError):
411
293
 
414
296
 
415
297
# XXX: Should be unified with TransportError; they seem to represent the
416
298
# same thing
417
 
# RBC 20060929: I think that unifiying with TransportError would be a mistake
418
 
# - this is finer than a TransportError - and more useful as such. It 
419
 
# differentiates between 'transport has failed' and 'operation on a transport
420
 
# has failed.'
421
299
class PathError(BzrError):
422
300
    
423
301
    _fmt = "Generic path error: %(path)r%(extra)s)"
441
319
    _fmt = "File exists: %(path)r%(extra)s"
442
320
 
443
321
 
444
 
class RenameFailedFilesExist(BzrError):
445
 
    """Used when renaming and both source and dest exist."""
446
 
 
447
 
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
448
 
            "%(extra)s")
449
 
 
450
 
    def __init__(self, source, dest, extra=None):
451
 
        BzrError.__init__(self)
452
 
        self.source = str(source)
453
 
        self.dest = str(dest)
454
 
        if extra:
455
 
            self.extra = ' ' + str(extra)
456
 
        else:
457
 
            self.extra = ''
458
 
 
459
 
 
460
 
class NotADirectory(PathError):
461
 
 
462
 
    _fmt = "%(path)r is not a directory %(extra)s"
463
 
 
464
 
 
465
 
class NotInWorkingDirectory(PathError):
466
 
 
467
 
    _fmt = "%(path)r is not in the working directory %(extra)s"
468
 
 
469
 
 
470
322
class DirectoryNotEmpty(PathError):
471
323
 
472
324
    _fmt = "Directory not empty: %(path)r%(extra)s"
508
360
        self.args = [base] + list(args)
509
361
 
510
362
 
511
 
class UnknownHook(BzrError):
512
 
 
513
 
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
514
 
 
515
 
    def __init__(self, hook_type, hook_name):
516
 
        BzrError.__init__(self)
517
 
        self.type = hook_type
518
 
        self.hook = hook_name
519
 
 
520
 
 
521
363
class UnsupportedProtocol(PathError):
522
364
 
523
365
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
526
368
        PathError.__init__(self, url, extra=extra)
527
369
 
528
370
 
529
 
class ReadError(PathError):
530
 
    
531
 
    _fmt = """Error reading from %(path)r."""
532
 
 
533
 
 
534
371
class ShortReadvError(PathError):
535
372
 
536
 
    _fmt = ("readv() read %(actual)s bytes rather than %(length)s bytes"
537
 
            " at %(offset)s for %(path)s%(extra)s")
 
373
    _fmt = "readv() read %(actual)s bytes rather than %(length)s bytes at %(offset)s for %(path)s%(extra)s"
538
374
 
539
375
    internal_error = True
540
376
 
545
381
        self.actual = actual
546
382
 
547
383
 
548
 
class PathNotChild(PathError):
 
384
class PathNotChild(BzrError):
549
385
 
550
386
    _fmt = "Path %(path)r is not a child of path %(base)r%(extra)s"
551
387
 
578
414
       self.path = urlutils.unescape_for_display(path, 'ascii')
579
415
 
580
416
 
581
 
class NoSubmitBranch(PathError):
582
 
 
583
 
    _fmt = 'No submit branch available for branch "%(path)s"'
584
 
 
585
 
    def __init__(self, branch):
586
 
       import bzrlib.urlutils as urlutils
587
 
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
588
 
 
589
 
 
590
417
class AlreadyBranchError(PathError):
591
418
 
592
419
    _fmt = "Already a branch: %(path)s."
600
427
 
601
428
class AtomicFileAlreadyClosed(PathError):
602
429
 
603
 
    _fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
604
 
            " %(path)s")
 
430
    _fmt = "'%(function)s' called on an AtomicFile after it was closed: %(path)s"
605
431
 
606
432
    def __init__(self, path, function):
607
433
        PathError.__init__(self, path=path, extra=None)
610
436
 
611
437
class InaccessibleParent(PathError):
612
438
 
613
 
    _fmt = ("Parent not accessible given base %(base)s and"
614
 
            " relative path %(path)s")
 
439
    _fmt = "Parent not accessible given base %(base)s and relative path %(path)s"
615
440
 
616
441
    def __init__(self, path, base):
617
442
        PathError.__init__(self, path)
638
463
 
639
464
 
640
465
class UnsupportedFormatError(BzrError):
641
 
 
642
 
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
 
466
    
 
467
    _fmt = "Unsupported branch format: %(format)s"
643
468
 
644
469
 
645
470
class UnknownFormatError(BzrError):
657
482
        self.bzrdir = bzrdir_format
658
483
 
659
484
 
660
 
class IncompatibleRepositories(BzrError):
661
 
 
662
 
    _fmt = "Repository %(target)s is not compatible with repository"\
663
 
        " %(source)s"
664
 
 
665
 
    def __init__(self, source, target):
666
 
        BzrError.__init__(self, target=target, source=source)
667
 
 
668
 
 
669
485
class IncompatibleRevision(BzrError):
670
486
    
671
487
    _fmt = "Revision is not compatible with %(repo_format)s"
675
491
        self.repo_format = repo_format
676
492
 
677
493
 
678
 
class AlreadyVersionedError(BzrError):
679
 
    """Used when a path is expected not to be versioned, but it is."""
680
 
 
681
 
    _fmt = "%(context_info)s%(path)s is already versioned"
682
 
 
683
 
    def __init__(self, path, context_info=None):
684
 
        """Construct a new AlreadyVersionedError.
685
 
 
686
 
        :param path: This is the path which is versioned,
687
 
        which should be in a user friendly form.
688
 
        :param context_info: If given, this is information about the context,
689
 
        which could explain why this is expected to not be versioned.
690
 
        """
691
 
        BzrError.__init__(self)
692
 
        self.path = path
693
 
        if context_info is None:
694
 
            self.context_info = ''
695
 
        else:
696
 
            self.context_info = context_info + ". "
697
 
 
698
 
 
699
494
class NotVersionedError(BzrError):
700
 
    """Used when a path is expected to be versioned, but it is not."""
701
 
 
702
 
    _fmt = "%(context_info)s%(path)s is not versioned"
703
 
 
704
 
    def __init__(self, path, context_info=None):
705
 
        """Construct a new NotVersionedError.
706
 
 
707
 
        :param path: This is the path which is not versioned,
708
 
        which should be in a user friendly form.
709
 
        :param context_info: If given, this is information about the context,
710
 
        which could explain why this is expected to be versioned.
711
 
        """
 
495
 
 
496
    _fmt = "%(path)s is not versioned"
 
497
 
 
498
    def __init__(self, path):
712
499
        BzrError.__init__(self)
713
500
        self.path = path
714
 
        if context_info is None:
715
 
            self.context_info = ''
716
 
        else:
717
 
            self.context_info = context_info + ". "
718
501
 
719
502
 
720
503
class PathsNotVersionedError(BzrError):
721
 
    """Used when reporting several paths which are not versioned"""
 
504
    # used when reporting several paths are not versioned
722
505
 
723
506
    _fmt = "Path(s) are not versioned: %(paths_as_string)s"
724
507
 
731
514
 
732
515
class PathsDoNotExist(BzrError):
733
516
 
734
 
    _fmt = "Path(s) do not exist: %(paths_as_string)s%(extra)s"
 
517
    _fmt = "Path(s) do not exist: %(paths_as_string)s"
735
518
 
736
519
    # used when reporting that paths are neither versioned nor in the working
737
520
    # tree
738
521
 
739
 
    def __init__(self, paths, extra=None):
 
522
    def __init__(self, paths):
740
523
        # circular import
741
524
        from bzrlib.osutils import quotefn
742
525
        BzrError.__init__(self)
743
526
        self.paths = paths
744
527
        self.paths_as_string = ' '.join([quotefn(p) for p in paths])
745
 
        if extra:
746
 
            self.extra = ': ' + str(extra)
747
 
        else:
748
 
            self.extra = ''
749
528
 
750
529
 
751
530
class BadFileKindError(BzrError):
752
531
 
753
 
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
754
 
 
755
 
    def __init__(self, filename, kind):
756
 
        BzrError.__init__(self, filename=filename, kind=kind)
 
532
    _fmt = "Cannot operate on %(filename)s of unsupported kind %(kind)s"
757
533
 
758
534
 
759
535
class ForbiddenControlFileError(BzrError):
763
539
 
764
540
class LockError(BzrError):
765
541
 
766
 
    _fmt = "Lock error: %(msg)s"
 
542
    _fmt = "Lock error: %(message)s"
767
543
 
768
544
    internal_error = True
769
545
 
773
549
    #
774
550
    # New code should prefer to raise specific subclasses
775
551
    def __init__(self, message):
776
 
        # Python 2.5 uses a slot for StandardError.message,
777
 
        # so use a different variable name
778
 
        # so it is exposed in self.__dict__
779
 
        self.msg = message
780
 
 
781
 
 
782
 
class LockActive(LockError):
783
 
 
784
 
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
785
 
 
786
 
    internal_error = False
787
 
 
788
 
    def __init__(self, lock_description):
789
 
        self.lock_description = lock_description
 
552
        self.message = message
790
553
 
791
554
 
792
555
class CommitNotPossible(LockError):
809
572
 
810
573
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
811
574
 
812
 
    # TODO: There should also be an error indicating that you need a write
813
 
    # lock and don't have any lock at all... mbp 20070226
814
 
 
815
575
    def __init__(self, obj):
816
576
        self.obj = obj
817
577
 
818
578
 
819
 
class ReadOnlyLockError(LockError):
820
 
 
821
 
    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
822
 
 
823
 
    def __init__(self, fname, msg):
824
 
        LockError.__init__(self, '')
825
 
        self.fname = fname
826
 
        self.msg = msg
827
 
 
828
 
 
829
579
class OutSideTransaction(BzrError):
830
580
 
831
 
    _fmt = ("A transaction related operation was attempted after"
832
 
            " the transaction finished.")
 
581
    _fmt = "A transaction related operation was attempted after the transaction finished."
833
582
 
834
583
 
835
584
class ObjectNotLocked(LockError):
866
615
    # bits?
867
616
 
868
617
    internal_error = False
869
 
 
 
618
    
870
619
    def __init__(self, lock):
871
620
        self.lock = lock
872
621
 
873
622
 
874
623
class LockBroken(LockError):
875
624
 
876
 
    _fmt = ("Lock was broken while still open: %(lock)s"
877
 
            " - check storage consistency!")
 
625
    _fmt = "Lock was broken while still open: %(lock)s - check storage consistency!"
878
626
 
879
627
    internal_error = False
880
628
 
884
632
 
885
633
class LockBreakMismatch(LockError):
886
634
 
887
 
    _fmt = ("Lock was released and re-acquired before being broken:"
888
 
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
 
635
    _fmt = "Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"
889
636
 
890
637
    internal_error = False
891
638
 
905
652
        self.lock = lock
906
653
 
907
654
 
908
 
class TokenLockingNotSupported(LockError):
909
 
 
910
 
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
911
 
 
912
 
    internal_error = True
913
 
 
914
 
    def __init__(self, obj):
915
 
        self.obj = obj
916
 
 
917
 
 
918
 
class TokenMismatch(LockBroken):
919
 
 
920
 
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
921
 
 
922
 
    internal_error = True
923
 
 
924
 
    def __init__(self, given_token, lock_token):
925
 
        self.given_token = given_token
926
 
        self.lock_token = lock_token
927
 
 
928
 
 
929
655
class PointlessCommit(BzrError):
930
656
 
931
657
    _fmt = "No changes to commit"
932
658
 
933
659
 
934
 
class CannotCommitSelectedFileMerge(BzrError):
935
 
 
936
 
    _fmt = 'Selected-file commit of merges is not supported yet:'\
937
 
        ' files %(files_str)s'
938
 
 
939
 
    def __init__(self, files):
940
 
        files_str = ', '.join(files)
941
 
        BzrError.__init__(self, files=files, files_str=files_str)
942
 
 
943
 
 
944
660
class UpgradeReadonly(BzrError):
945
661
 
946
662
    _fmt = "Upgrade URL cannot work with readonly URLs."
970
686
        BzrError.__init__(self, branch=branch, revision=revision)
971
687
 
972
688
 
973
 
class NotLeftParentDescendant(BzrError):
974
 
 
975
 
    _fmt = ("Revision %(old_revision)s is not the left parent of"
976
 
            " %(new_revision)s, but branch %(branch_location)s expects this")
977
 
 
978
 
    internal_error = True
979
 
 
980
 
    def __init__(self, branch, old_revision, new_revision):
981
 
        BzrError.__init__(self, branch_location=branch.base,
982
 
                          old_revision=old_revision,
983
 
                          new_revision=new_revision)
984
 
 
985
 
 
986
689
class NoSuchRevisionSpec(BzrError):
987
690
 
988
691
    _fmt = "No namespace registered for string: %(spec)r"
991
694
        BzrError.__init__(self, spec=spec)
992
695
 
993
696
 
994
 
class NoSuchRevisionInTree(NoSuchRevision):
995
 
    """When using Tree.revision_tree, and the revision is not accessible."""
996
 
    
997
 
    _fmt = "The revision id %(revision_id)s is not present in the tree %(tree)s."
998
 
 
999
 
    def __init__(self, tree, revision_id):
1000
 
        BzrError.__init__(self)
1001
 
        self.tree = tree
1002
 
        self.revision_id = revision_id
1003
 
 
1004
 
 
1005
697
class InvalidRevisionSpec(BzrError):
1006
698
 
1007
 
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
1008
 
            " %(branch)s%(extra)s")
 
699
    _fmt = "Requested revision: %(spec)r does not exist in branch: %(branch)s%(extra)s"
1009
700
 
1010
701
    def __init__(self, spec, branch, extra=None):
1011
702
        BzrError.__init__(self, branch=branch, spec=spec)
1020
711
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1021
712
 
1022
713
 
1023
 
class AppendRevisionsOnlyViolation(BzrError):
1024
 
 
1025
 
    _fmt = ('Operation denied because it would change the main history,'
1026
 
           ' which is not permitted by the append_revisions_only setting on'
1027
 
           ' branch "%(location)s".')
1028
 
 
1029
 
    def __init__(self, location):
1030
 
       import bzrlib.urlutils as urlutils
1031
 
       location = urlutils.unescape_for_display(location, 'ascii')
1032
 
       BzrError.__init__(self, location=location)
1033
 
 
1034
 
 
1035
714
class DivergedBranches(BzrError):
1036
 
 
1037
 
    _fmt = ("These branches have diverged."
1038
 
            " Use the merge command to reconcile them.")
 
715
    
 
716
    _fmt = "These branches have diverged.  Use the merge command to reconcile them."""
1039
717
 
1040
718
    internal_error = False
1041
719
 
1044
722
        self.branch2 = branch2
1045
723
 
1046
724
 
1047
 
class NotLefthandHistory(BzrError):
1048
 
 
1049
 
    _fmt = "Supplied history does not follow left-hand parents"
1050
 
 
1051
 
    internal_error = True
1052
 
 
1053
 
    def __init__(self, history):
1054
 
        BzrError.__init__(self, history=history)
1055
 
 
1056
 
 
1057
725
class UnrelatedBranches(BzrError):
1058
726
 
1059
 
    _fmt = ("Branches have no common ancestor, and"
1060
 
            " no merge base revision was specified.")
 
727
    _fmt = "Branches have no common ancestor, and no merge base revision was specified."
1061
728
 
1062
729
    internal_error = False
1063
730
 
1073
740
 
1074
741
class NoCommonRoot(BzrError):
1075
742
 
1076
 
    _fmt = ("Revisions are not derived from the same root: "
1077
 
           "%(revision_a)s %(revision_b)s.")
 
743
    _fmt = "Revisions are not derived from the same root: " \
 
744
           "%(revision_a)s %(revision_b)s."
1078
745
 
1079
746
    def __init__(self, revision_a, revision_b):
1080
747
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
1103
770
    def __init__(self, bases):
1104
771
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1105
772
                DeprecationWarning)
1106
 
        msg = ("The correct base is unclear, because %s are all equally close"
1107
 
                % ", ".join(bases))
 
773
        msg = "The correct base is unclear, because %s are all equally close" %\
 
774
            ", ".join(bases)
1108
775
        BzrError.__init__(self, msg)
1109
776
        self.bases = bases
1110
777
 
1132
799
 
1133
800
class BoundBranchOutOfDate(BzrError):
1134
801
 
1135
 
    _fmt = ("Bound branch %(branch)s is out of date"
1136
 
            " with master branch %(master)s.")
 
802
    _fmt = "Bound branch %(branch)s is out of date with master branch %(master)s."
1137
803
 
1138
804
    def __init__(self, branch, master):
1139
805
        BzrError.__init__(self)
1143
809
        
1144
810
class CommitToDoubleBoundBranch(BzrError):
1145
811
 
1146
 
    _fmt = ("Cannot commit to branch %(branch)s."
1147
 
            " It is bound to %(master)s, which is bound to %(remote)s.")
 
812
    _fmt = "Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."
1148
813
 
1149
814
    def __init__(self, branch, master, remote):
1150
815
        BzrError.__init__(self)
1164
829
 
1165
830
class BoundBranchConnectionFailure(BzrError):
1166
831
 
1167
 
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
1168
 
            " => %(target)s: %(error)s")
 
832
    _fmt = "Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"
1169
833
 
1170
834
    def __init__(self, branch, target, error):
1171
835
        BzrError.__init__(self)
1225
889
 
1226
890
class WeaveTextDiffers(WeaveError):
1227
891
 
1228
 
    _fmt = ("Weaves differ on text content. Revision:"
1229
 
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
892
    _fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
1230
893
 
1231
894
    def __init__(self, revision_id, weave_a, weave_b):
1232
895
        WeaveError.__init__(self)
1237
900
 
1238
901
class WeaveTextDiffers(WeaveError):
1239
902
 
1240
 
    _fmt = ("Weaves differ on text content. Revision:"
1241
 
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
903
    _fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
1242
904
 
1243
905
    def __init__(self, revision_id, weave_a, weave_b):
1244
906
        WeaveError.__init__(self)
1272
934
        self.file_id = file_id
1273
935
 
1274
936
 
1275
 
class VersionedFileInvalidChecksum(VersionedFileError):
1276
 
 
1277
 
    _fmt = "Text did not match its checksum: %(message)s"
1278
 
 
1279
 
 
1280
937
class KnitError(BzrError):
1281
938
    
1282
939
    _fmt = "Knit error"
1346
1003
 
1347
1004
class TooManyConcurrentRequests(BzrError):
1348
1005
 
1349
 
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
1350
 
            " Be sure to finish_writing and finish_reading on the"
1351
 
            " currently open request.")
 
1006
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit. "
 
1007
            "Be sure to finish_writing and finish_reading on the "
 
1008
            "current request that is open.")
1352
1009
 
1353
1010
    internal_error = True
1354
1011
 
1437
1094
        InvalidHttpResponse.__init__(self, path, msg)
1438
1095
 
1439
1096
 
1440
 
class RedirectRequested(TransportError):
1441
 
 
1442
 
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1443
 
 
1444
 
    def __init__(self, source, target, is_permament=False, qual_proto=None):
1445
 
        self.source = source
1446
 
        self.target = target
1447
 
        if is_permament:
1448
 
            self.permanently = ' permanently'
1449
 
        else:
1450
 
            self.permanently = ''
1451
 
        self.is_permament = is_permament
1452
 
        self._qualified_proto = qual_proto
1453
 
        TransportError.__init__(self)
1454
 
 
1455
 
    def _requalify_url(self, url):
1456
 
        """Restore the qualified proto in front of the url"""
1457
 
        # When this exception is raised, source and target are in
1458
 
        # user readable format. But some transports may use a
1459
 
        # different proto (http+urllib:// will present http:// to
1460
 
        # the user. If a qualified proto is specified, the code
1461
 
        # trapping the exception can get the qualified urls to
1462
 
        # properly handle the redirection themself (creating a
1463
 
        # new transport object from the target url for example).
1464
 
        # But checking that the scheme of the original and
1465
 
        # redirected urls are the same can be tricky. (see the
1466
 
        # FIXME in BzrDir.open_from_transport for the unique use
1467
 
        # case so far).
1468
 
        if self._qualified_proto is None:
1469
 
            return url
1470
 
 
1471
 
        # The TODO related to NotBranchError mention that doing
1472
 
        # that kind of manipulation on the urls may not be the
1473
 
        # exception object job. On the other hand, this object is
1474
 
        # the interface between the code and the user so
1475
 
        # presenting the urls in different ways is indeed its
1476
 
        # job...
1477
 
        import urlparse
1478
 
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1479
 
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1480
 
                                   query, fragment))
1481
 
 
1482
 
    def get_source_url(self):
1483
 
        return self._requalify_url(self.source)
1484
 
 
1485
 
    def get_target_url(self):
1486
 
        return self._requalify_url(self.target)
1487
 
 
1488
 
 
1489
 
class TooManyRedirections(TransportError):
1490
 
 
1491
 
    _fmt = "Too many redirections"
1492
 
 
1493
1097
class ConflictsInTree(BzrError):
1494
1098
 
1495
1099
    _fmt = "Working tree has conflicts."
1534
1138
 
1535
1139
class CantReprocessAndShowBase(BzrError):
1536
1140
 
1537
 
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
1538
 
           "the relationship of conflicting lines to the base")
 
1141
    _fmt = "Can't reprocess and show base, because reprocessing obscures " \
 
1142
           "the relationship of conflicting lines to the base"
1539
1143
 
1540
1144
 
1541
1145
class GraphCycleError(BzrError):
1590
1194
 
1591
1195
 
1592
1196
class MustUseDecorated(Exception):
1593
 
 
1594
 
    _fmt = "A decorating function has requested its original command be used."
1595
 
 
 
1197
    
 
1198
    _fmt = """A decorating function has requested its original command be used."""
 
1199
    
1596
1200
 
1597
1201
class NoBundleFound(BzrError):
1598
1202
 
1615
1219
 
1616
1220
class MissingText(BzrError):
1617
1221
 
1618
 
    _fmt = ("Branch %(base)s is missing revision"
1619
 
            " %(text_revision)s of %(file_id)s")
 
1222
    _fmt = "Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"
1620
1223
 
1621
1224
    def __init__(self, branch, text_revision, file_id):
1622
1225
        BzrError.__init__(self)
1625
1228
        self.text_revision = text_revision
1626
1229
        self.file_id = file_id
1627
1230
 
1628
 
class DuplicateFileId(BzrError):
1629
 
 
1630
 
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
1631
 
 
1632
 
    def __init__(self, file_id, entry):
1633
 
        BzrError.__init__(self)
1634
 
        self.file_id = file_id
1635
 
        self.entry = entry
1636
 
 
1637
1231
 
1638
1232
class DuplicateKey(BzrError):
1639
1233
 
1640
1234
    _fmt = "Key %(key)s is already present in map"
1641
1235
 
1642
1236
 
1643
 
class DuplicateHelpPrefix(BzrError):
1644
 
 
1645
 
    _fmt = "The prefix %(prefix)s is in the help search path twice."
1646
 
 
1647
 
    def __init__(self, prefix):
1648
 
        self.prefix = prefix
1649
 
 
1650
 
 
1651
1237
class MalformedTransform(BzrError):
1652
1238
 
1653
1239
    _fmt = "Tree transform is malformed %(conflicts)r"
1669
1255
 
1670
1256
    _fmt = "Bad parameter: %(param)r"
1671
1257
 
1672
 
    internal_error = True
1673
 
 
1674
1258
    # This exception should never be thrown, but it is a base class for all
1675
1259
    # parameter-to-function errors.
1676
1260
 
1694
1278
    _fmt = "Moving the root directory is not supported at this time"
1695
1279
 
1696
1280
 
1697
 
class BzrMoveFailedError(BzrError):
1698
 
 
1699
 
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1700
 
 
1701
 
    def __init__(self, from_path='', to_path='', extra=None):
1702
 
        BzrError.__init__(self)
1703
 
        if extra:
1704
 
            self.extra = ': ' + str(extra)
1705
 
        else:
1706
 
            self.extra = ''
1707
 
 
1708
 
        has_from = len(from_path) > 0
1709
 
        has_to = len(to_path) > 0
1710
 
        if has_from:
1711
 
            self.from_path = osutils.splitpath(from_path)[-1]
1712
 
        else:
1713
 
            self.from_path = ''
1714
 
 
1715
 
        if has_to:
1716
 
            self.to_path = osutils.splitpath(to_path)[-1]
1717
 
        else:
1718
 
            self.to_path = ''
1719
 
 
1720
 
        self.operator = ""
1721
 
        if has_from and has_to:
1722
 
            self.operator = " =>"
1723
 
        elif has_from:
1724
 
            self.from_path = "from " + from_path
1725
 
        elif has_to:
1726
 
            self.operator = "to"
1727
 
        else:
1728
 
            self.operator = "file"
1729
 
 
1730
 
 
1731
 
class BzrRenameFailedError(BzrMoveFailedError):
1732
 
 
1733
 
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1734
 
 
1735
 
    def __init__(self, from_path, to_path, extra=None):
1736
 
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1737
 
 
1738
 
class BzrRemoveChangedFilesError(BzrError):
1739
 
    """Used when user is trying to remove changed files."""
1740
 
 
1741
 
    _fmt = ("Can't remove changed or unknown files:\n%(changes_as_text)s"
1742
 
        "Use --keep to not delete them, or --force to delete them regardless.")
1743
 
 
1744
 
    def __init__(self, tree_delta):
1745
 
        BzrError.__init__(self)
1746
 
        self.changes_as_text = tree_delta.get_changes_as_text()
1747
 
        #self.paths_as_string = '\n'.join(changed_files)
1748
 
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1749
 
 
1750
 
 
1751
1281
class BzrBadParameterNotString(BzrBadParameter):
1752
1282
 
1753
1283
    _fmt = "Parameter %(param)s is not a string or unicode string."
1760
1290
 
1761
1291
class BzrBadParameterUnicode(BzrBadParameter):
1762
1292
 
1763
 
    _fmt = ("Parameter %(param)s is unicode but"
1764
 
            " only byte-strings are permitted.")
 
1293
    _fmt = "Parameter %(param)s is unicode but only byte-strings are permitted."
1765
1294
 
1766
1295
 
1767
1296
class BzrBadParameterContainsNewline(BzrBadParameter):
1853
1382
        self.tree = tree
1854
1383
 
1855
1384
 
1856
 
class PublicBranchOutOfDate(BzrError):
1857
 
 
1858
 
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
1859
 
        '"%(revstring)s".'
1860
 
 
1861
 
    def __init__(self, public_location, revstring):
1862
 
        import bzrlib.urlutils as urlutils
1863
 
        public_location = urlutils.unescape_for_display(public_location,
1864
 
                                                        'ascii')
1865
 
        BzrError.__init__(self, public_location=public_location,
1866
 
                          revstring=revstring)
1867
 
 
1868
 
 
1869
1385
class MergeModifiedFormatError(BzrError):
1870
1386
 
1871
1387
    _fmt = "Error in merge modified format"
1878
1394
 
1879
1395
class CorruptRepository(BzrError):
1880
1396
 
1881
 
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
1882
 
            "Please run bzr reconcile on this repository.")
 
1397
    _fmt = """An error has been detected in the repository %(repo_path)s.
 
1398
Please run bzr reconcile on this repository."""
1883
1399
 
1884
1400
    def __init__(self, repo):
1885
1401
        BzrError.__init__(self)
1907
1423
 
1908
1424
class InvalidProgressBarType(BzrError):
1909
1425
 
1910
 
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
1911
 
            " is not a supported type Select one of: %(valid_types)s")
 
1426
    _fmt = """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
 
1427
Select one of: %(valid_types)s"""
1912
1428
 
1913
1429
    def __init__(self, bar_type, valid_types):
1914
1430
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1916
1432
 
1917
1433
class UnsupportedOperation(BzrError):
1918
1434
 
1919
 
    _fmt = ("The method %(mname)s is not supported on"
1920
 
            " objects of type %(tname)s.")
 
1435
    _fmt = "The method %(mname)s is not supported on objects of type %(tname)s."
1921
1436
 
1922
1437
    def __init__(self, method, method_self):
1923
1438
        self.method = method
1930
1445
 
1931
1446
 
1932
1447
class NonAsciiRevisionId(UnsupportedOperation):
1933
 
    """Raised when a commit is attempting to set a non-ascii revision id
1934
 
       but cant.
1935
 
    """
 
1448
    """Raised when a commit is attempting to set a non-ascii revision id but cant."""
1936
1449
 
1937
1450
 
1938
1451
class BinaryFile(BzrError):
1951
1464
 
1952
1465
class TestamentMismatch(BzrError):
1953
1466
 
1954
 
    _fmt = """Testament did not match expected value.
1955
 
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
 
1467
    _fmt = """Testament did not match expected value.  
 
1468
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
1956
1469
       {%(measured)s}"""
1957
1470
 
1958
1471
    def __init__(self, revision_id, expected, measured):
2027
1540
        BadInventoryFormat.__init__(self, msg=msg)
2028
1541
 
2029
1542
 
2030
 
class RootNotRich(BzrError):
2031
 
 
2032
 
    _fmt = """This operation requires rich root data storage"""
2033
 
 
2034
 
 
2035
1543
class NoSmartMedium(BzrError):
2036
1544
 
2037
1545
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
2038
1546
 
2039
 
    internal_error = True
2040
 
 
2041
1547
    def __init__(self, transport):
2042
1548
        self.transport = transport
2043
1549
 
2059
1565
        self.vendor = vendor
2060
1566
 
2061
1567
 
2062
 
class SSHVendorNotFound(BzrError):
2063
 
 
2064
 
    _fmt = ("Don't know how to handle SSH connections."
2065
 
            " Please set BZR_SSH environment variable.")
2066
 
 
2067
 
 
2068
1568
class GhostRevisionUnusableHere(BzrError):
2069
1569
 
2070
1570
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
2076
1576
 
2077
1577
class IllegalUseOfScopeReplacer(BzrError):
2078
1578
 
2079
 
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
2080
 
            " %(msg)s%(extra)s")
 
1579
    _fmt = "ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"
2081
1580
 
2082
1581
    internal_error = True
2083
1582
 
2105
1604
 
2106
1605
class ImportNameCollision(BzrError):
2107
1606
 
2108
 
    _fmt = ("Tried to import an object to the same name as"
2109
 
            " an existing object. %(name)s")
2110
 
 
2111
 
    internal_error = True
2112
 
 
2113
 
    def __init__(self, name):
2114
 
        BzrError.__init__(self)
2115
 
        self.name = name
2116
 
 
2117
 
 
2118
 
class NotAMergeDirective(BzrError):
2119
 
    """File starting with %(firstline)r is not a merge directive"""
2120
 
    def __init__(self, firstline):
2121
 
        BzrError.__init__(self, firstline=firstline)
2122
 
 
2123
 
 
2124
 
class NoMergeSource(BzrError):
2125
 
    """Raise if no merge source was specified for a merge directive"""
2126
 
 
2127
 
    _fmt = "A merge directive must provide either a bundle or a public"\
2128
 
        " branch location."
2129
 
 
2130
 
 
2131
 
class IllegalMergeDirectivePayload(BzrError):
2132
 
    """A merge directive contained something other than a patch or bundle"""
2133
 
 
2134
 
    _fmt = "Bad merge directive payload %(start)r"
2135
 
 
2136
 
    def __init__(self, start):
2137
 
        BzrError(self)
2138
 
        self.start = start
2139
 
 
2140
 
 
2141
 
class PatchVerificationFailed(BzrError):
2142
 
    """A patch from a merge directive could not be verified"""
2143
 
 
2144
 
    _fmt = "Preview patch does not match requested changes."
2145
 
 
2146
 
 
2147
 
class PatchMissing(BzrError):
2148
 
    """Raise a patch type was specified but no patch supplied"""
2149
 
 
2150
 
    _fmt = "patch_type was %(patch_type)s, but no patch was supplied."
2151
 
 
2152
 
    def __init__(self, patch_type):
2153
 
        BzrError.__init__(self)
2154
 
        self.patch_type = patch_type
2155
 
 
2156
 
 
2157
 
class UnsupportedInventoryKind(BzrError):
2158
 
    
2159
 
    _fmt = """Unsupported entry kind %(kind)s"""
2160
 
 
2161
 
    def __init__(self, kind):
2162
 
        self.kind = kind
2163
 
 
2164
 
 
2165
 
class BadSubsumeSource(BzrError):
2166
 
 
2167
 
    _fmt = """Can't subsume %(other_tree)s into %(tree)s.  %(reason)s"""
2168
 
 
2169
 
    def __init__(self, tree, other_tree, reason):
2170
 
        self.tree = tree
2171
 
        self.other_tree = other_tree
2172
 
        self.reason = reason
2173
 
 
2174
 
 
2175
 
class SubsumeTargetNeedsUpgrade(BzrError):
2176
 
    
2177
 
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
2178
 
 
2179
 
    def __init__(self, other_tree):
2180
 
        self.other_tree = other_tree
2181
 
 
2182
 
 
2183
 
class BadReferenceTarget(BzrError):
2184
 
 
2185
 
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s.  %(reason)s"
2186
 
 
2187
 
    internal_error = True
2188
 
 
2189
 
    def __init__(self, tree, other_tree, reason):
2190
 
        self.tree = tree
2191
 
        self.other_tree = other_tree
2192
 
        self.reason = reason
2193
 
 
2194
 
 
2195
 
class NoSuchTag(BzrError):
2196
 
 
2197
 
    _fmt = "No such tag: %(tag_name)s"
2198
 
 
2199
 
    def __init__(self, tag_name):
2200
 
        self.tag_name = tag_name
2201
 
 
2202
 
 
2203
 
class TagsNotSupported(BzrError):
2204
 
 
2205
 
    _fmt = ("Tags not supported by %(branch)s;"
2206
 
            " you may be able to use bzr upgrade --dirstate-tags.")
2207
 
 
2208
 
    def __init__(self, branch):
2209
 
        self.branch = branch
2210
 
 
2211
 
        
2212
 
class TagAlreadyExists(BzrError):
2213
 
 
2214
 
    _fmt = "Tag %(tag_name)s already exists."
2215
 
 
2216
 
    def __init__(self, tag_name):
2217
 
        self.tag_name = tag_name
2218
 
 
2219
 
 
2220
 
class MalformedBugIdentifier(BzrError):
2221
 
 
2222
 
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
2223
 
 
2224
 
    def __init__(self, bug_id, reason):
2225
 
        self.bug_id = bug_id
2226
 
        self.reason = reason
2227
 
 
2228
 
 
2229
 
class UnknownBugTrackerAbbreviation(BzrError):
2230
 
 
2231
 
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
2232
 
            "on %(branch)s")
2233
 
 
2234
 
    def __init__(self, abbreviation, branch):
2235
 
        self.abbreviation = abbreviation
2236
 
        self.branch = branch
2237
 
 
2238
 
 
2239
 
class UnexpectedSmartServerResponse(BzrError):
2240
 
 
2241
 
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
2242
 
 
2243
 
    def __init__(self, response_tuple):
2244
 
        self.response_tuple = response_tuple
2245
 
 
2246
 
 
2247
 
class ContainerError(BzrError):
2248
 
    """Base class of container errors."""
2249
 
 
2250
 
 
2251
 
class UnknownContainerFormatError(ContainerError):
2252
 
 
2253
 
    _fmt = "Unrecognised container format: %(container_format)r"
2254
 
    
2255
 
    def __init__(self, container_format):
2256
 
        self.container_format = container_format
2257
 
 
2258
 
 
2259
 
class UnexpectedEndOfContainerError(ContainerError):
2260
 
 
2261
 
    _fmt = "Unexpected end of container stream"
2262
 
 
2263
 
    internal_error = False
2264
 
 
2265
 
 
2266
 
class UnknownRecordTypeError(ContainerError):
2267
 
 
2268
 
    _fmt = "Unknown record type: %(record_type)r"
2269
 
 
2270
 
    def __init__(self, record_type):
2271
 
        self.record_type = record_type
2272
 
 
2273
 
 
2274
 
class InvalidRecordError(ContainerError):
2275
 
 
2276
 
    _fmt = "Invalid record: %(reason)s"
2277
 
 
2278
 
    def __init__(self, reason):
2279
 
        self.reason = reason
2280
 
 
2281
 
 
2282
 
class ContainerHasExcessDataError(ContainerError):
2283
 
 
2284
 
    _fmt = "Container has data after end marker: %(excess)r"
2285
 
 
2286
 
    def __init__(self, excess):
2287
 
        self.excess = excess
2288
 
 
2289
 
 
2290
 
class DuplicateRecordNameError(ContainerError):
2291
 
 
2292
 
    _fmt = "Container has multiple records with the same name: \"%(name)s\""
2293
 
 
2294
 
    def __init__(self, name):
2295
 
        self.name = name
2296
 
 
2297
 
 
2298
 
class NoDestinationAddress(BzrError):
2299
 
 
2300
 
    _fmt = "Message does not have a destination address."
2301
 
 
2302
 
    internal_error = True
2303
 
 
2304
 
 
2305
 
class SMTPError(BzrError):
2306
 
 
2307
 
    _fmt = "SMTP error: %(error)s"
2308
 
 
2309
 
    def __init__(self, error):
2310
 
        self.error = error
 
1607
    _fmt = "Tried to import an object to the same name as an existing object. %(name)s"
 
1608
 
 
1609
    internal_error = True
 
1610
 
 
1611
    def __init__(self, name):
 
1612
        BzrError.__init__(self)
 
1613
        self.name = name