~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Robert Collins
  • Date: 2007-06-28 02:43:50 UTC
  • mfrom: (2553 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2558.
  • Revision ID: robertc@robertcollins.net-20070628024350-z8bdm0y6yz2uyf4o
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 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
48
48
    """
49
49
    Base class for errors raised by bzrlib.
50
50
 
51
 
    :cvar internal_error: if true (or absent) this was probably caused by a
52
 
    bzr bug and should be displayed with a traceback; if False this was
 
51
    :cvar internal_error: if True this was probably caused by a bzr bug and
 
52
    should be displayed with a traceback; if False (or absent) this was
53
53
    probably a user or environment error and they don't need the gory details.
54
54
    (That can be overridden by -Derror on the command line.)
55
55
 
102
102
                    return s.encode('utf8')
103
103
                return s
104
104
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
105
 
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%s' \
 
105
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
106
106
                % (self.__class__.__name__,
107
107
                   self.__dict__,
108
108
                   getattr(self, '_fmt', None),
109
 
                   str(e))
 
109
                   e)
110
110
 
111
111
    def _get_format_string(self):
112
112
        """Return format string for this exception or None"""
132
132
    # readable explanation
133
133
 
134
134
    def __init__(self, *args, **kwds):
135
 
        # XXX: Use the underlying BzrError to always generate the args attribute
136
 
        # if it doesn't exist.  We can't use super here, because exceptions are
137
 
        # old-style classes in python2.4 (but new in 2.5).  --bmc, 20060426
 
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
138
139
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
139
 
             'please convert %s to use BzrError instead' 
 
140
             'please convert %s to use BzrError instead'
140
141
             % self.__class__.__name__,
141
142
             DeprecationWarning,
142
143
             stacklevel=2)
153
154
                return s.encode('utf8')
154
155
            return s
155
156
        except (TypeError, NameError, ValueError, KeyError), e:
156
 
            return 'Unprintable exception %s(%r): %s' \
 
157
            return 'Unprintable exception %s(%r): %r' \
157
158
                % (self.__class__.__name__,
158
 
                   self.__dict__, str(e))
 
159
                   self.__dict__, e)
159
160
 
160
161
 
161
162
class AlreadyBuilding(BzrError):
174
175
        self.message = message
175
176
 
176
177
 
 
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
 
177
189
class InvalidEntryName(BzrError):
178
190
    
179
191
    _fmt = "Invalid entry name: %(name)s"
211
223
    def __init__(self, revision_id):
212
224
        self.revision_id = revision_id
213
225
 
 
226
 
 
227
class NoHelpTopic(BzrError):
 
228
 
 
229
    _fmt = ("No help could be found for '%(topic)s'. "
 
230
        "Please use 'bzr help topics' to obtain a list of topics.")
 
231
 
 
232
    def __init__(self, topic):
 
233
        self.topic = topic
 
234
 
 
235
 
214
236
class NoSuchId(BzrError):
215
237
 
216
238
    _fmt = "The file id %(file_id)s is not present in the tree %(tree)s."
223
245
 
224
246
class InventoryModified(BzrError):
225
247
 
226
 
    _fmt = ("The current inventory for the tree %(tree)r has been modified, "
227
 
            "so a clean inventory cannot be read without data loss.")
 
248
    _fmt = ("The current inventory for the tree %(tree)r has been modified,"
 
249
            " so a clean inventory cannot be read without data loss.")
228
250
 
229
251
    internal_error = True
230
252
 
342
364
    """Used when renaming and both source and dest exist."""
343
365
 
344
366
    _fmt = ("Could not rename %(source)s => %(dest)s because both files exist."
345
 
         "%(extra)s")
 
367
            "%(extra)s")
346
368
 
347
369
    def __init__(self, source, dest, extra=None):
348
370
        BzrError.__init__(self)
425
447
 
426
448
class ShortReadvError(PathError):
427
449
 
428
 
    _fmt = "readv() read %(actual)s bytes rather than %(length)s bytes at %(offset)s for %(path)s%(extra)s"
 
450
    _fmt = ("readv() read %(actual)s bytes rather than %(length)s bytes"
 
451
            " at %(offset)s for %(path)s%(extra)s")
429
452
 
430
453
    internal_error = True
431
454
 
469
492
       self.path = urlutils.unescape_for_display(path, 'ascii')
470
493
 
471
494
 
 
495
class NoSubmitBranch(PathError):
 
496
 
 
497
    _fmt = 'No submit branch available for branch "%(path)s"'
 
498
 
 
499
    def __init__(self, branch):
 
500
       import bzrlib.urlutils as urlutils
 
501
       self.path = urlutils.unescape_for_display(branch.base, 'ascii')
 
502
 
 
503
 
472
504
class AlreadyBranchError(PathError):
473
505
 
474
506
    _fmt = "Already a branch: %(path)s."
482
514
 
483
515
class AtomicFileAlreadyClosed(PathError):
484
516
 
485
 
    _fmt = "'%(function)s' called on an AtomicFile after it was closed: %(path)s"
 
517
    _fmt = ("'%(function)s' called on an AtomicFile after it was closed:"
 
518
            " %(path)s")
486
519
 
487
520
    def __init__(self, path, function):
488
521
        PathError.__init__(self, path=path, extra=None)
491
524
 
492
525
class InaccessibleParent(PathError):
493
526
 
494
 
    _fmt = "Parent not accessible given base %(base)s and relative path %(path)s"
 
527
    _fmt = ("Parent not accessible given base %(base)s and"
 
528
            " relative path %(path)s")
495
529
 
496
530
    def __init__(self, path, base):
497
531
        PathError.__init__(self, path)
518
552
 
519
553
 
520
554
class UnsupportedFormatError(BzrError):
521
 
    
522
 
    _fmt = "Unsupported branch format: %(format)s"
 
555
 
 
556
    _fmt = "Unsupported branch format: %(format)s\nPlease run 'bzr upgrade'"
523
557
 
524
558
 
525
559
class UnknownFormatError(BzrError):
537
571
        self.bzrdir = bzrdir_format
538
572
 
539
573
 
 
574
class IncompatibleRepositories(BzrError):
 
575
 
 
576
    _fmt = "Repository %(target)s is not compatible with repository"\
 
577
        " %(source)s"
 
578
 
 
579
    def __init__(self, source, target):
 
580
        BzrError.__init__(self, target=target, source=source)
 
581
 
 
582
 
540
583
class IncompatibleRevision(BzrError):
541
584
    
542
585
    _fmt = "Revision is not compatible with %(repo_format)s"
552
595
    _fmt = "%(context_info)s%(path)s is already versioned"
553
596
 
554
597
    def __init__(self, path, context_info=None):
555
 
        """Construct a new NotVersionedError.
 
598
        """Construct a new AlreadyVersionedError.
556
599
 
557
600
        :param path: This is the path which is versioned,
558
601
        which should be in a user friendly form.
621
664
 
622
665
class BadFileKindError(BzrError):
623
666
 
624
 
    _fmt = "Cannot operate on %(filename)s of unsupported kind %(kind)s"
 
667
    _fmt = 'Cannot operate on "%(filename)s" of unsupported kind "%(kind)s"'
 
668
 
 
669
    def __init__(self, filename, kind):
 
670
        BzrError.__init__(self, filename=filename, kind=kind)
625
671
 
626
672
 
627
673
class ForbiddenControlFileError(BzrError):
631
677
 
632
678
class LockError(BzrError):
633
679
 
634
 
    _fmt = "Lock error: %(message)s"
 
680
    _fmt = "Lock error: %(msg)s"
635
681
 
636
682
    internal_error = True
637
683
 
641
687
    #
642
688
    # New code should prefer to raise specific subclasses
643
689
    def __init__(self, message):
644
 
        self.message = message
 
690
        # Python 2.5 uses a slot for StandardError.message,
 
691
        # so use a different variable name
 
692
        # so it is exposed in self.__dict__
 
693
        self.msg = message
 
694
 
 
695
 
 
696
class LockActive(LockError):
 
697
 
 
698
    _fmt = "The lock for '%(lock_description)s' is in use and cannot be broken."
 
699
 
 
700
    internal_error = False
 
701
 
 
702
    def __init__(self, lock_description):
 
703
        self.lock_description = lock_description
645
704
 
646
705
 
647
706
class CommitNotPossible(LockError):
664
723
 
665
724
    _fmt = "A write attempt was made in a read only transaction on %(obj)s"
666
725
 
 
726
    # TODO: There should also be an error indicating that you need a write
 
727
    # lock and don't have any lock at all... mbp 20070226
 
728
 
667
729
    def __init__(self, obj):
668
730
        self.obj = obj
669
731
 
670
732
 
 
733
class ReadOnlyLockError(LockError):
 
734
 
 
735
    _fmt = "Cannot acquire write lock on %(fname)s. %(msg)s"
 
736
 
 
737
    def __init__(self, fname, msg):
 
738
        LockError.__init__(self, '')
 
739
        self.fname = fname
 
740
        self.msg = msg
 
741
 
 
742
 
671
743
class OutSideTransaction(BzrError):
672
744
 
673
 
    _fmt = "A transaction related operation was attempted after the transaction finished."
 
745
    _fmt = ("A transaction related operation was attempted after"
 
746
            " the transaction finished.")
674
747
 
675
748
 
676
749
class ObjectNotLocked(LockError):
707
780
    # bits?
708
781
 
709
782
    internal_error = False
710
 
    
 
783
 
711
784
    def __init__(self, lock):
712
785
        self.lock = lock
713
786
 
714
787
 
715
788
class LockBroken(LockError):
716
789
 
717
 
    _fmt = "Lock was broken while still open: %(lock)s - check storage consistency!"
 
790
    _fmt = ("Lock was broken while still open: %(lock)s"
 
791
            " - check storage consistency!")
718
792
 
719
793
    internal_error = False
720
794
 
724
798
 
725
799
class LockBreakMismatch(LockError):
726
800
 
727
 
    _fmt = "Lock was released and re-acquired before being broken: %(lock)s: held by %(holder)r, wanted to break %(target)r"
 
801
    _fmt = ("Lock was released and re-acquired before being broken:"
 
802
            " %(lock)s: held by %(holder)r, wanted to break %(target)r")
728
803
 
729
804
    internal_error = False
730
805
 
744
819
        self.lock = lock
745
820
 
746
821
 
 
822
class TokenLockingNotSupported(LockError):
 
823
 
 
824
    _fmt = "The object %(obj)s does not support token specifying a token when locking."
 
825
 
 
826
    internal_error = True
 
827
 
 
828
    def __init__(self, obj):
 
829
        self.obj = obj
 
830
 
 
831
 
 
832
class TokenMismatch(LockBroken):
 
833
 
 
834
    _fmt = "The lock token %(given_token)r does not match lock token %(lock_token)r."
 
835
 
 
836
    internal_error = True
 
837
 
 
838
    def __init__(self, given_token, lock_token):
 
839
        self.given_token = given_token
 
840
        self.lock_token = lock_token
 
841
 
 
842
 
747
843
class PointlessCommit(BzrError):
748
844
 
749
845
    _fmt = "No changes to commit"
750
846
 
751
847
 
 
848
class CannotCommitSelectedFileMerge(BzrError):
 
849
 
 
850
    _fmt = 'Selected-file commit of merges is not supported yet:'\
 
851
        ' files %(files_str)s'
 
852
 
 
853
    def __init__(self, files):
 
854
        files_str = ', '.join(files)
 
855
        BzrError.__init__(self, files=files, files_str=files_str)
 
856
 
 
857
 
752
858
class UpgradeReadonly(BzrError):
753
859
 
754
860
    _fmt = "Upgrade URL cannot work with readonly URLs."
780
886
 
781
887
class NotLeftParentDescendant(BzrError):
782
888
 
783
 
    _fmt = "Revision %(old_revision)s is not the left parent of"\
784
 
        " %(new_revision)s, but branch %(branch_location)s expects this"
 
889
    _fmt = ("Revision %(old_revision)s is not the left parent of"
 
890
            " %(new_revision)s, but branch %(branch_location)s expects this")
785
891
 
786
892
    internal_error = True
787
893
 
799
905
        BzrError.__init__(self, spec=spec)
800
906
 
801
907
 
 
908
class NoSuchRevisionInTree(NoSuchRevision):
 
909
    """When using Tree.revision_tree, and the revision is not accessible."""
 
910
    
 
911
    _fmt = "The revision id %(revision_id)s is not present in the tree %(tree)s."
 
912
 
 
913
    def __init__(self, tree, revision_id):
 
914
        BzrError.__init__(self)
 
915
        self.tree = tree
 
916
        self.revision_id = revision_id
 
917
 
 
918
 
802
919
class InvalidRevisionSpec(BzrError):
803
920
 
804
 
    _fmt = "Requested revision: %(spec)r does not exist in branch: %(branch)s%(extra)s"
 
921
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
922
            " %(branch)s%(extra)s")
805
923
 
806
924
    def __init__(self, spec, branch, extra=None):
807
925
        BzrError.__init__(self, branch=branch, spec=spec)
818
936
 
819
937
class AppendRevisionsOnlyViolation(BzrError):
820
938
 
821
 
    _fmt = 'Operation denied because it would change the main history, '\
822
 
           'which is not permitted by the append_revisions_only setting on'\
823
 
           ' branch "%(location)s".'
 
939
    _fmt = ('Operation denied because it would change the main history,'
 
940
           ' which is not permitted by the append_revisions_only setting on'
 
941
           ' branch "%(location)s".')
824
942
 
825
943
    def __init__(self, location):
826
944
       import bzrlib.urlutils as urlutils
829
947
 
830
948
 
831
949
class DivergedBranches(BzrError):
832
 
    
833
 
    _fmt = "These branches have diverged.  Use the merge command to reconcile them."""
 
950
 
 
951
    _fmt = ("These branches have diverged."
 
952
            " Use the merge command to reconcile them.")
834
953
 
835
954
    internal_error = False
836
955
 
851
970
 
852
971
class UnrelatedBranches(BzrError):
853
972
 
854
 
    _fmt = "Branches have no common ancestor, and no merge base revision was specified."
 
973
    _fmt = ("Branches have no common ancestor, and"
 
974
            " no merge base revision was specified.")
855
975
 
856
976
    internal_error = False
857
977
 
867
987
 
868
988
class NoCommonRoot(BzrError):
869
989
 
870
 
    _fmt = "Revisions are not derived from the same root: " \
871
 
           "%(revision_a)s %(revision_b)s."
 
990
    _fmt = ("Revisions are not derived from the same root: "
 
991
           "%(revision_a)s %(revision_b)s.")
872
992
 
873
993
    def __init__(self, revision_a, revision_b):
874
994
        BzrError.__init__(self, revision_a=revision_a, revision_b=revision_b)
897
1017
    def __init__(self, bases):
898
1018
        warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
899
1019
                DeprecationWarning)
900
 
        msg = "The correct base is unclear, because %s are all equally close" %\
901
 
            ", ".join(bases)
 
1020
        msg = ("The correct base is unclear, because %s are all equally close"
 
1021
                % ", ".join(bases))
902
1022
        BzrError.__init__(self, msg)
903
1023
        self.bases = bases
904
1024
 
926
1046
 
927
1047
class BoundBranchOutOfDate(BzrError):
928
1048
 
929
 
    _fmt = "Bound branch %(branch)s is out of date with master branch %(master)s."
 
1049
    _fmt = ("Bound branch %(branch)s is out of date"
 
1050
            " with master branch %(master)s.")
930
1051
 
931
1052
    def __init__(self, branch, master):
932
1053
        BzrError.__init__(self)
936
1057
        
937
1058
class CommitToDoubleBoundBranch(BzrError):
938
1059
 
939
 
    _fmt = "Cannot commit to branch %(branch)s. It is bound to %(master)s, which is bound to %(remote)s."
 
1060
    _fmt = ("Cannot commit to branch %(branch)s."
 
1061
            " It is bound to %(master)s, which is bound to %(remote)s.")
940
1062
 
941
1063
    def __init__(self, branch, master, remote):
942
1064
        BzrError.__init__(self)
956
1078
 
957
1079
class BoundBranchConnectionFailure(BzrError):
958
1080
 
959
 
    _fmt = "Unable to connect to target of bound branch %(branch)s => %(target)s: %(error)s"
 
1081
    _fmt = ("Unable to connect to target of bound branch %(branch)s"
 
1082
            " => %(target)s: %(error)s")
960
1083
 
961
1084
    def __init__(self, branch, target, error):
962
1085
        BzrError.__init__(self)
1016
1139
 
1017
1140
class WeaveTextDiffers(WeaveError):
1018
1141
 
1019
 
    _fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
 
1142
    _fmt = ("Weaves differ on text content. Revision:"
 
1143
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1020
1144
 
1021
1145
    def __init__(self, revision_id, weave_a, weave_b):
1022
1146
        WeaveError.__init__(self)
1027
1151
 
1028
1152
class WeaveTextDiffers(WeaveError):
1029
1153
 
1030
 
    _fmt = "Weaves differ on text content. Revision: {%(revision_id)s}, %(weave_a)s, %(weave_b)s"
 
1154
    _fmt = ("Weaves differ on text content. Revision:"
 
1155
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
1031
1156
 
1032
1157
    def __init__(self, revision_id, weave_a, weave_b):
1033
1158
        WeaveError.__init__(self)
1130
1255
 
1131
1256
class TooManyConcurrentRequests(BzrError):
1132
1257
 
1133
 
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit. "
1134
 
            "Be sure to finish_writing and finish_reading on the "
1135
 
            "current request that is open.")
 
1258
    _fmt = ("The medium '%(medium)s' has reached its concurrent request limit."
 
1259
            " Be sure to finish_writing and finish_reading on the"
 
1260
            " currently open request.")
1136
1261
 
1137
1262
    internal_error = True
1138
1263
 
1221
1346
        InvalidHttpResponse.__init__(self, path, msg)
1222
1347
 
1223
1348
 
 
1349
class RedirectRequested(TransportError):
 
1350
 
 
1351
    _fmt = '%(source)s is%(permanently)s redirected to %(target)s'
 
1352
 
 
1353
    def __init__(self, source, target, is_permament=False, qual_proto=None):
 
1354
        self.source = source
 
1355
        self.target = target
 
1356
        if is_permament:
 
1357
            self.permanently = ' permanently'
 
1358
        else:
 
1359
            self.permanently = ''
 
1360
        self.is_permament = is_permament
 
1361
        self._qualified_proto = qual_proto
 
1362
        TransportError.__init__(self)
 
1363
 
 
1364
    def _requalify_url(self, url):
 
1365
        """Restore the qualified proto in front of the url"""
 
1366
        # When this exception is raised, source and target are in
 
1367
        # user readable format. But some transports may use a
 
1368
        # different proto (http+urllib:// will present http:// to
 
1369
        # the user. If a qualified proto is specified, the code
 
1370
        # trapping the exception can get the qualified urls to
 
1371
        # properly handle the redirection themself (creating a
 
1372
        # new transport object from the target url for example).
 
1373
        # But checking that the scheme of the original and
 
1374
        # redirected urls are the same can be tricky. (see the
 
1375
        # FIXME in BzrDir.open_from_transport for the unique use
 
1376
        # case so far).
 
1377
        if self._qualified_proto is None:
 
1378
            return url
 
1379
 
 
1380
        # The TODO related to NotBranchError mention that doing
 
1381
        # that kind of manipulation on the urls may not be the
 
1382
        # exception object job. On the other hand, this object is
 
1383
        # the interface between the code and the user so
 
1384
        # presenting the urls in different ways is indeed its
 
1385
        # job...
 
1386
        import urlparse
 
1387
        proto, netloc, path, query, fragment = urlparse.urlsplit(url)
 
1388
        return urlparse.urlunsplit((self._qualified_proto, netloc, path,
 
1389
                                   query, fragment))
 
1390
 
 
1391
    def get_source_url(self):
 
1392
        return self._requalify_url(self.source)
 
1393
 
 
1394
    def get_target_url(self):
 
1395
        return self._requalify_url(self.target)
 
1396
 
 
1397
 
 
1398
class TooManyRedirections(TransportError):
 
1399
 
 
1400
    _fmt = "Too many redirections"
 
1401
 
1224
1402
class ConflictsInTree(BzrError):
1225
1403
 
1226
1404
    _fmt = "Working tree has conflicts."
1265
1443
 
1266
1444
class CantReprocessAndShowBase(BzrError):
1267
1445
 
1268
 
    _fmt = "Can't reprocess and show base, because reprocessing obscures " \
1269
 
           "the relationship of conflicting lines to the base"
 
1446
    _fmt = ("Can't reprocess and show base, because reprocessing obscures "
 
1447
           "the relationship of conflicting lines to the base")
1270
1448
 
1271
1449
 
1272
1450
class GraphCycleError(BzrError):
1321
1499
 
1322
1500
 
1323
1501
class MustUseDecorated(Exception):
1324
 
    
1325
 
    _fmt = """A decorating function has requested its original command be used."""
1326
 
    
 
1502
 
 
1503
    _fmt = "A decorating function has requested its original command be used."
 
1504
 
1327
1505
 
1328
1506
class NoBundleFound(BzrError):
1329
1507
 
1346
1524
 
1347
1525
class MissingText(BzrError):
1348
1526
 
1349
 
    _fmt = "Branch %(base)s is missing revision %(text_revision)s of %(file_id)s"
 
1527
    _fmt = ("Branch %(base)s is missing revision"
 
1528
            " %(text_revision)s of %(file_id)s")
1350
1529
 
1351
1530
    def __init__(self, branch, text_revision, file_id):
1352
1531
        BzrError.__init__(self)
1356
1535
        self.file_id = file_id
1357
1536
 
1358
1537
 
 
1538
class DuplicateFileId(BzrError):
 
1539
 
 
1540
    _fmt = "File id {%(file_id)s} already exists in inventory as %(entry)s"
 
1541
 
 
1542
    def __init__(self, file_id, entry):
 
1543
        BzrError.__init__(self)
 
1544
        self.file_id = file_id
 
1545
        self.entry = entry
 
1546
 
 
1547
 
1359
1548
class DuplicateKey(BzrError):
1360
1549
 
1361
1550
    _fmt = "Key %(key)s is already present in map"
1362
1551
 
1363
1552
 
 
1553
class DuplicateHelpPrefix(BzrError):
 
1554
 
 
1555
    _fmt = "The prefix %(prefix)s is in the help search path twice."
 
1556
 
 
1557
    def __init__(self, prefix):
 
1558
        self.prefix = prefix
 
1559
 
 
1560
 
1364
1561
class MalformedTransform(BzrError):
1365
1562
 
1366
1563
    _fmt = "Tree transform is malformed %(conflicts)r"
1382
1579
 
1383
1580
    _fmt = "Bad parameter: %(param)r"
1384
1581
 
 
1582
    internal_error = True
 
1583
 
1385
1584
    # This exception should never be thrown, but it is a base class for all
1386
1585
    # parameter-to-function errors.
1387
1586
 
1446
1645
    def __init__(self, from_path, to_path, extra=None):
1447
1646
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1448
1647
 
 
1648
class BzrRemoveChangedFilesError(BzrError):
 
1649
    """Used when user is trying to remove changed files."""
 
1650
 
 
1651
    _fmt = ("Can't remove changed or unknown files:\n%(changes_as_text)s"
 
1652
        "Use --keep to not delete them, or --force to delete them regardless.")
 
1653
 
 
1654
    def __init__(self, tree_delta):
 
1655
        BzrError.__init__(self)
 
1656
        self.changes_as_text = tree_delta.get_changes_as_text()
 
1657
        #self.paths_as_string = '\n'.join(changed_files)
 
1658
        #self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
 
1659
 
1449
1660
 
1450
1661
class BzrBadParameterNotString(BzrBadParameter):
1451
1662
 
1459
1670
 
1460
1671
class BzrBadParameterUnicode(BzrBadParameter):
1461
1672
 
1462
 
    _fmt = "Parameter %(param)s is unicode but only byte-strings are permitted."
 
1673
    _fmt = ("Parameter %(param)s is unicode but"
 
1674
            " only byte-strings are permitted.")
1463
1675
 
1464
1676
 
1465
1677
class BzrBadParameterContainsNewline(BzrBadParameter):
1551
1763
        self.tree = tree
1552
1764
 
1553
1765
 
 
1766
class PublicBranchOutOfDate(BzrError):
 
1767
 
 
1768
    _fmt = 'Public branch "%(public_location)s" lacks revision '\
 
1769
        '"%(revstring)s".'
 
1770
 
 
1771
    def __init__(self, public_location, revstring):
 
1772
        import bzrlib.urlutils as urlutils
 
1773
        public_location = urlutils.unescape_for_display(public_location,
 
1774
                                                        'ascii')
 
1775
        BzrError.__init__(self, public_location=public_location,
 
1776
                          revstring=revstring)
 
1777
 
 
1778
 
1554
1779
class MergeModifiedFormatError(BzrError):
1555
1780
 
1556
1781
    _fmt = "Error in merge modified format"
1563
1788
 
1564
1789
class CorruptRepository(BzrError):
1565
1790
 
1566
 
    _fmt = """An error has been detected in the repository %(repo_path)s.
1567
 
Please run bzr reconcile on this repository."""
 
1791
    _fmt = ("An error has been detected in the repository %(repo_path)s.\n"
 
1792
            "Please run bzr reconcile on this repository.")
1568
1793
 
1569
1794
    def __init__(self, repo):
1570
1795
        BzrError.__init__(self)
1592
1817
 
1593
1818
class InvalidProgressBarType(BzrError):
1594
1819
 
1595
 
    _fmt = """Environment variable BZR_PROGRESS_BAR='%(bar_type)s is not a supported type
1596
 
Select one of: %(valid_types)s"""
 
1820
    _fmt = ("Environment variable BZR_PROGRESS_BAR='%(bar_type)s"
 
1821
            " is not a supported type Select one of: %(valid_types)s")
1597
1822
 
1598
1823
    def __init__(self, bar_type, valid_types):
1599
1824
        BzrError.__init__(self, bar_type=bar_type, valid_types=valid_types)
1601
1826
 
1602
1827
class UnsupportedOperation(BzrError):
1603
1828
 
1604
 
    _fmt = "The method %(mname)s is not supported on objects of type %(tname)s."
 
1829
    _fmt = ("The method %(mname)s is not supported on"
 
1830
            " objects of type %(tname)s.")
1605
1831
 
1606
1832
    def __init__(self, method, method_self):
1607
1833
        self.method = method
1614
1840
 
1615
1841
 
1616
1842
class NonAsciiRevisionId(UnsupportedOperation):
1617
 
    """Raised when a commit is attempting to set a non-ascii revision id but cant."""
 
1843
    """Raised when a commit is attempting to set a non-ascii revision id
 
1844
       but cant.
 
1845
    """
1618
1846
 
1619
1847
 
1620
1848
class BinaryFile(BzrError):
1633
1861
 
1634
1862
class TestamentMismatch(BzrError):
1635
1863
 
1636
 
    _fmt = """Testament did not match expected value.  
1637
 
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured 
 
1864
    _fmt = """Testament did not match expected value.
 
1865
       For revision_id {%(revision_id)s}, expected {%(expected)s}, measured
1638
1866
       {%(measured)s}"""
1639
1867
 
1640
1868
    def __init__(self, revision_id, expected, measured):
1709
1937
        BadInventoryFormat.__init__(self, msg=msg)
1710
1938
 
1711
1939
 
 
1940
class RootNotRich(BzrError):
 
1941
 
 
1942
    _fmt = """This operation requires rich root data storage"""
 
1943
 
 
1944
 
1712
1945
class NoSmartMedium(BzrError):
1713
1946
 
1714
1947
    _fmt = "The transport '%(transport)s' cannot tunnel the smart protocol."
 
1948
 
1715
1949
    internal_error = True
1716
1950
 
1717
1951
    def __init__(self, transport):
1735
1969
        self.vendor = vendor
1736
1970
 
1737
1971
 
 
1972
class SSHVendorNotFound(BzrError):
 
1973
 
 
1974
    _fmt = ("Don't know how to handle SSH connections."
 
1975
            " Please set BZR_SSH environment variable.")
 
1976
 
 
1977
 
1738
1978
class GhostRevisionUnusableHere(BzrError):
1739
1979
 
1740
1980
    _fmt = "Ghost revision {%(revision_id)s} cannot be used here."
1746
1986
 
1747
1987
class IllegalUseOfScopeReplacer(BzrError):
1748
1988
 
1749
 
    _fmt = "ScopeReplacer object %(name)r was used incorrectly: %(msg)s%(extra)s"
 
1989
    _fmt = ("ScopeReplacer object %(name)r was used incorrectly:"
 
1990
            " %(msg)s%(extra)s")
1750
1991
 
1751
1992
    internal_error = True
1752
1993
 
1774
2015
 
1775
2016
class ImportNameCollision(BzrError):
1776
2017
 
1777
 
    _fmt = "Tried to import an object to the same name as an existing object. %(name)s"
 
2018
    _fmt = ("Tried to import an object to the same name as"
 
2019
            " an existing object. %(name)s")
1778
2020
 
1779
2021
    internal_error = True
1780
2022
 
1783
2025
        self.name = name
1784
2026
 
1785
2027
 
 
2028
class NotAMergeDirective(BzrError):
 
2029
    """File starting with %(firstline)r is not a merge directive"""
 
2030
    def __init__(self, firstline):
 
2031
        BzrError.__init__(self, firstline=firstline)
 
2032
 
 
2033
 
1786
2034
class NoMergeSource(BzrError):
1787
2035
    """Raise if no merge source was specified for a merge directive"""
1788
2036
 
1789
2037
    _fmt = "A merge directive must provide either a bundle or a public"\
1790
 
        "branch location."
 
2038
        " branch location."
1791
2039
 
1792
2040
 
1793
2041
class PatchMissing(BzrError):
1798
2046
    def __init__(self, patch_type):
1799
2047
        BzrError.__init__(self)
1800
2048
        self.patch_type = patch_type
 
2049
 
 
2050
 
 
2051
class UnsupportedInventoryKind(BzrError):
 
2052
    
 
2053
    _fmt = """Unsupported entry kind %(kind)s"""
 
2054
 
 
2055
    def __init__(self, kind):
 
2056
        self.kind = kind
 
2057
 
 
2058
 
 
2059
class BadSubsumeSource(BzrError):
 
2060
 
 
2061
    _fmt = """Can't subsume %(other_tree)s into %(tree)s.  %(reason)s"""
 
2062
 
 
2063
    def __init__(self, tree, other_tree, reason):
 
2064
        self.tree = tree
 
2065
        self.other_tree = other_tree
 
2066
        self.reason = reason
 
2067
 
 
2068
 
 
2069
class SubsumeTargetNeedsUpgrade(BzrError):
 
2070
    
 
2071
    _fmt = """Subsume target %(other_tree)s needs to be upgraded."""
 
2072
 
 
2073
    def __init__(self, other_tree):
 
2074
        self.other_tree = other_tree
 
2075
 
 
2076
 
 
2077
class BadReferenceTarget(BzrError):
 
2078
 
 
2079
    _fmt = "Can't add reference to %(other_tree)s into %(tree)s.  %(reason)s"
 
2080
 
 
2081
    internal_error = True
 
2082
 
 
2083
    def __init__(self, tree, other_tree, reason):
 
2084
        self.tree = tree
 
2085
        self.other_tree = other_tree
 
2086
        self.reason = reason
 
2087
 
 
2088
 
 
2089
class NoSuchTag(BzrError):
 
2090
 
 
2091
    _fmt = "No such tag: %(tag_name)s"
 
2092
 
 
2093
    def __init__(self, tag_name):
 
2094
        self.tag_name = tag_name
 
2095
 
 
2096
 
 
2097
class TagsNotSupported(BzrError):
 
2098
 
 
2099
    _fmt = ("Tags not supported by %(branch)s;"
 
2100
            " you may be able to use bzr upgrade --dirstate-tags.")
 
2101
 
 
2102
    def __init__(self, branch):
 
2103
        self.branch = branch
 
2104
 
 
2105
        
 
2106
class TagAlreadyExists(BzrError):
 
2107
 
 
2108
    _fmt = "Tag %(tag_name)s already exists."
 
2109
 
 
2110
    def __init__(self, tag_name):
 
2111
        self.tag_name = tag_name
 
2112
 
 
2113
 
 
2114
class MalformedBugIdentifier(BzrError):
 
2115
 
 
2116
    _fmt = "Did not understand bug identifier %(bug_id)s: %(reason)s"
 
2117
 
 
2118
    def __init__(self, bug_id, reason):
 
2119
        self.bug_id = bug_id
 
2120
        self.reason = reason
 
2121
 
 
2122
 
 
2123
class UnknownBugTrackerAbbreviation(BzrError):
 
2124
 
 
2125
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
2126
            "on %(branch)s")
 
2127
 
 
2128
    def __init__(self, abbreviation, branch):
 
2129
        self.abbreviation = abbreviation
 
2130
        self.branch = branch
 
2131
 
 
2132
 
 
2133
class UnexpectedSmartServerResponse(BzrError):
 
2134
 
 
2135
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
2136
 
 
2137
    def __init__(self, response_tuple):
 
2138
        self.response_tuple = response_tuple
 
2139
 
 
2140
 
 
2141
class NoDestinationAddress(BzrError):
 
2142
 
 
2143
    _fmt = "Message does not have a destination address."
 
2144
 
 
2145
    internal_error = True
 
2146
 
 
2147
 
 
2148
class SMTPError(BzrError):
 
2149
 
 
2150
    _fmt = "SMTP error: %(error)s"
 
2151
 
 
2152
    def __init__(self, error):
 
2153
        self.error = error