100
106
                # __str__() should always return a 'str' object
 
101
107
                # never a 'unicode' object.
 
103
 
        except Exception as e:
 
105
 
        return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
 
109
        except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
 
 
110
            return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
 
 
111
                % (self.__class__.__name__,
 
 
113
                   getattr(self, '_fmt', None),
 
 
116
    def __unicode__(self):
 
 
118
        if isinstance(u, str):
 
 
119
            # Try decoding the str using the default encoding.
 
 
121
        elif not isinstance(u, unicode):
 
 
122
            # Try to make a unicode object from it, because __unicode__ must
 
 
123
            # return a unicode object.
 
 
129
        if isinstance(s, unicode):
 
 
132
            # __str__ must return a str.
 
 
137
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
 
139
    def _get_format_string(self):
 
 
140
        """Return format string for this exception or None"""
 
 
141
        fmt = getattr(self, '_fmt', None)
 
 
144
        fmt = getattr(self, '__doc__', None)
 
 
146
            symbol_versioning.warn("%s uses its docstring as a format, "
 
 
147
                    "it should use _fmt instead" % self.__class__.__name__,
 
 
150
        return 'Unprintable exception %s: dict=%r, fmt=%r' \
 
106
151
            % (self.__class__.__name__,
 
108
153
               getattr(self, '_fmt', None),
 
115
 
            return self._format().encode('utf-8')
 
117
 
        __unicode__ = _format
 
120
 
        return '%s(%s)' % (self.__class__.__name__, str(self))
 
122
 
    def _get_format_string(self):
 
123
 
        """Return format string for this exception or None"""
 
124
 
        fmt = getattr(self, '_fmt', None)
 
126
 
            from breezy.i18n import gettext
 
127
 
            return gettext(fmt)  # _fmt strings should be ascii
 
129
156
    def __eq__(self, other):
 
130
157
        if self.__class__ is not other.__class__:
 
131
158
            return NotImplemented
 
132
159
        return self.__dict__ == other.__dict__
 
138
162
class InternalBzrError(BzrError):
 
139
163
    """Base class for errors that are internal in nature.
 
 
146
170
    internal_error = True
 
 
173
class BzrNewError(BzrError):
 
 
174
    """Deprecated error base class."""
 
 
175
    # base classes should override the docstring with their human-
 
 
176
    # readable explanation
 
 
178
    def __init__(self, *args, **kwds):
 
 
179
        # XXX: Use the underlying BzrError to always generate the args
 
 
180
        # attribute if it doesn't exist.  We can't use super here, because
 
 
181
        # exceptions are old-style classes in python2.4 (but new in 2.5).
 
 
183
        symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
 
 
184
             'please convert %s to use BzrError instead'
 
 
185
             % self.__class__.__name__,
 
 
188
        BzrError.__init__(self, *args)
 
 
189
        for key, value in kwds.items():
 
 
190
            setattr(self, key, value)
 
 
194
            # __str__() should always return a 'str' object
 
 
195
            # never a 'unicode' object.
 
 
196
            s = self.__doc__ % self.__dict__
 
 
197
            if isinstance(s, unicode):
 
 
198
                return s.encode('utf8')
 
 
200
        except (TypeError, NameError, ValueError, KeyError), e:
 
 
201
            return 'Unprintable exception %s(%r): %r' \
 
 
202
                % (self.__class__.__name__,
 
 
206
class AlreadyBuilding(BzrError):
 
 
208
    _fmt = "The tree builder is already building a tree."
 
149
211
class BranchError(BzrError):
 
150
212
    """Base class for concrete 'errors about a branch'."""
 
 
311
409
        self.not_locked = not_locked
 
 
412
class BzrOptionError(BzrCommandError):
 
 
414
    _fmt = "Error in command line options"
 
 
417
class BadIndexFormatSignature(BzrError):
 
 
419
    _fmt = "%(value)s is not an index of type %(_type)s."
 
 
421
    def __init__(self, value, _type):
 
 
422
        BzrError.__init__(self)
 
 
427
class BadIndexData(BzrError):
 
 
429
    _fmt = "Error in data for index %(value)s."
 
 
431
    def __init__(self, value):
 
 
432
        BzrError.__init__(self)
 
 
436
class BadIndexDuplicateKey(BzrError):
 
 
438
    _fmt = "The key '%(key)s' is already in index '%(index)s'."
 
 
440
    def __init__(self, key, index):
 
 
441
        BzrError.__init__(self)
 
 
446
class BadIndexKey(BzrError):
 
 
448
    _fmt = "The key '%(key)s' is not a valid key."
 
 
450
    def __init__(self, key):
 
 
451
        BzrError.__init__(self)
 
 
455
class BadIndexOptions(BzrError):
 
 
457
    _fmt = "Could not parse options for index %(value)s."
 
 
459
    def __init__(self, value):
 
 
460
        BzrError.__init__(self)
 
 
464
class BadIndexValue(BzrError):
 
 
466
    _fmt = "The value '%(value)s' is not a valid value."
 
 
468
    def __init__(self, value):
 
 
469
        BzrError.__init__(self)
 
 
473
class BadOptionValue(BzrError):
 
 
475
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
 
 
477
    def __init__(self, name, value):
 
 
478
        BzrError.__init__(self, name=name, value=value)
 
314
481
class StrictCommitFailed(BzrError):
 
316
483
    _fmt = "Commit refused because there are unknown files in the tree"
 
 
402
569
    _fmt = 'Permission denied: "%(path)s"%(extra)s'
 
 
572
class InvalidURL(PathError):
 
 
574
    _fmt = 'Invalid url supplied to transport: "%(path)s"%(extra)s'
 
 
577
class InvalidURLJoin(PathError):
 
 
579
    _fmt = "Invalid URL join request: %(reason)s: %(base)r + %(join_args)r"
 
 
581
    def __init__(self, reason, base, join_args):
 
 
584
        self.join_args = join_args
 
 
585
        PathError.__init__(self, base, reason)
 
 
588
class InvalidRebaseURLs(PathError):
 
 
590
    _fmt = "URLs differ by more than path: %(from_)r and %(to)r"
 
 
592
    def __init__(self, from_, to):
 
 
595
        PathError.__init__(self, from_, 'URLs differ by more than path.')
 
405
598
class UnavailableRepresentation(InternalBzrError):
 
407
600
    _fmt = ("The encoding '%(wanted)s' is not available for key %(key)s which "
 
408
 
            "is encoded as '%(native)s'.")
 
 
601
        "is encoded as '%(native)s'.")
 
410
603
    def __init__(self, key, wanted, native):
 
411
604
        InternalBzrError.__init__(self)
 
 
 
610
class UnknownHook(BzrError):
 
 
612
    _fmt = "The %(type)s hook '%(hook)s' is unknown in this version of bzrlib."
 
 
614
    def __init__(self, hook_type, hook_name):
 
 
615
        BzrError.__init__(self)
 
 
616
        self.type = hook_type
 
 
617
        self.hook = hook_name
 
417
620
class UnsupportedProtocol(PathError):
 
419
622
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
 
421
 
    def __init__(self, url, extra=""):
 
 
624
    def __init__(self, url, extra):
 
422
625
        PathError.__init__(self, url, extra=extra)
 
425
 
class UnstackableLocationError(BzrError):
 
427
 
    _fmt = "The branch '%(branch_url)s' cannot be stacked on '%(target_url)s'."
 
429
 
    def __init__(self, branch_url, target_url):
 
 
628
class UnstackableBranchFormat(BzrError):
 
 
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.")
 
 
633
    def __init__(self, format, url):
 
430
634
        BzrError.__init__(self)
 
431
 
        self.branch_url = branch_url
 
432
 
        self.target_url = target_url
 
435
639
class UnstackableRepositoryFormat(BzrError):
 
437
641
    _fmt = ("The repository '%(url)s'(%(format)s) is not a stackable format. "
 
438
 
            "You will need to upgrade the repository to permit branch stacking.")
 
 
642
        "You will need to upgrade the repository to permit branch stacking.")
 
440
644
    def __init__(self, format, url):
 
441
645
        BzrError.__init__(self)
 
 
488
692
# TODO: Probably this behavior of should be a common superclass
 
489
693
class NotBranchError(PathError):
 
491
 
    _fmt = 'Not a branch: "%(path)s"%(detail)s.'
 
493
 
    def __init__(self, path, detail=None, controldir=None):
 
494
 
        from . import urlutils
 
495
 
        path = urlutils.unescape_for_display(path, 'ascii')
 
496
 
        if detail is not None:
 
497
 
            detail = ': ' + detail
 
499
 
        self.controldir = controldir
 
500
 
        PathError.__init__(self, path=path)
 
503
 
        return '<%s %r>' % (self.__class__.__name__, self.__dict__)
 
505
 
    def _get_format_string(self):
 
506
 
        # GZ 2017-06-08: Not the best place to lazy fill detail in.
 
507
 
        if self.detail is None:
 
508
 
            self.detail = self._get_detail()
 
509
 
        return super(NotBranchError, self)._get_format_string()
 
511
 
    def _get_detail(self):
 
512
 
        if self.controldir is not None:
 
514
 
                self.controldir.open_repository()
 
515
 
            except NoRepositoryPresent:
 
517
 
            except Exception as e:
 
518
 
                # Just ignore unexpected errors.  Raising arbitrary errors
 
519
 
                # during str(err) can provoke strange bugs.  Concretely
 
520
 
                # Launchpad's codehosting managed to raise NotBranchError
 
521
 
                # here, and then get stuck in an infinite loop/recursion
 
522
 
                # trying to str() that error.  All this error really cares
 
523
 
                # about that there's no working repository there, and if
 
524
 
                # open_repository() fails, there probably isn't.
 
525
 
                return ': ' + e.__class__.__name__
 
527
 
                return ': location is a repository'
 
 
695
    _fmt = 'Not a branch: "%(path)s".'
 
 
697
    def __init__(self, path):
 
 
698
       import bzrlib.urlutils as urlutils
 
 
699
       self.path = urlutils.unescape_for_display(path, 'ascii')
 
531
702
class NoSubmitBranch(PathError):
 
 
600
772
        self.format = format
 
603
 
class LineEndingError(BzrError):
 
605
 
    _fmt = ("Line ending corrupted for file: %(file)s; "
 
606
 
            "Maybe your files got corrupted in transport?")
 
608
 
    def __init__(self, file):
 
612
775
class IncompatibleFormat(BzrError):
 
614
 
    _fmt = "Format %(format)s is not compatible with .bzr version %(controldir)s."
 
616
 
    def __init__(self, format, controldir_format):
 
617
 
        BzrError.__init__(self)
 
619
 
        self.controldir = controldir_format
 
622
 
class ParseFormatError(BzrError):
 
624
 
    _fmt = "Parse error on line %(lineno)d of %(format)s format: %(line)s"
 
626
 
    def __init__(self, format, lineno, line, text):
 
627
 
        BzrError.__init__(self)
 
 
777
    _fmt = "Format %(format)s is not compatible with .bzr version %(bzrdir)s."
 
 
779
    def __init__(self, format, bzrdir_format):
 
 
780
        BzrError.__init__(self)
 
 
782
        self.bzrdir = bzrdir_format
 
634
785
class IncompatibleRepositories(BzrError):
 
635
 
    """Report an error that two repositories are not compatible.
 
637
 
    Note that the source and target repositories are permitted to be strings:
 
638
 
    this exception is thrown from the smart server and may refer to a
 
639
 
    repository the client hasn't opened.
 
642
787
    _fmt = "%(target)s\n" \
 
643
 
        "is not compatible with\n" \
 
 
788
            "is not compatible with\n" \
 
647
792
    def __init__(self, source, target, details=None):
 
648
793
        if details is None:
 
 
979
1143
class InvalidRevisionSpec(BzrError):
 
981
 
    _fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
 
982
 
            " %(branch_url)s%(extra)s")
 
 
1145
    _fmt = ("Requested revision: %(spec)r does not exist in branch:"
 
 
1146
            " %(branch)s%(extra)s")
 
984
1148
    def __init__(self, spec, branch, extra=None):
 
985
1149
        BzrError.__init__(self, branch=branch, spec=spec)
 
986
 
        self.branch_url = getattr(branch, 'user_url', str(branch))
 
988
1151
            self.extra = '\n' + str(extra)
 
 
1156
class HistoryMissing(BzrError):
 
 
1158
    _fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
 
993
1161
class AppendRevisionsOnlyViolation(BzrError):
 
995
1163
    _fmt = ('Operation denied because it would change the main history,'
 
996
 
            ' which is not permitted by the append_revisions_only setting on'
 
997
 
            ' branch "%(location)s".')
 
 
1164
           ' which is not permitted by the append_revisions_only setting on'
 
 
1165
           ' branch "%(location)s".')
 
999
1167
    def __init__(self, location):
 
1000
 
        import breezy.urlutils as urlutils
 
1001
 
        location = urlutils.unescape_for_display(location, 'ascii')
 
1002
 
        BzrError.__init__(self, location=location)
 
 
1168
       import bzrlib.urlutils as urlutils
 
 
1169
       location = urlutils.unescape_for_display(location, 'ascii')
 
 
1170
       BzrError.__init__(self, location=location)
 
1005
1173
class DivergedBranches(BzrError):
 
1007
1175
    _fmt = ("These branches have diverged."
 
1008
 
            " Use the missing command to see how.\n"
 
1009
 
            "Use the merge command to reconcile them.")
 
 
1176
            " Use the merge command to reconcile them.")
 
1011
1178
    def __init__(self, branch1, branch2):
 
1012
1179
        self.branch1 = branch1
 
 
1122
1309
        self.error = error
 
 
1312
class WeaveError(BzrError):
 
 
1314
    _fmt = "Error in processing weave: %(msg)s"
 
 
1316
    def __init__(self, msg=None):
 
 
1317
        BzrError.__init__(self)
 
 
1321
class WeaveRevisionAlreadyPresent(WeaveError):
 
 
1323
    _fmt = "Revision {%(revision_id)s} already present in %(weave)s"
 
 
1325
    def __init__(self, revision_id, weave):
 
 
1327
        WeaveError.__init__(self)
 
 
1328
        self.revision_id = revision_id
 
 
1332
class WeaveRevisionNotPresent(WeaveError):
 
 
1334
    _fmt = "Revision {%(revision_id)s} not present in %(weave)s"
 
 
1336
    def __init__(self, revision_id, weave):
 
 
1337
        WeaveError.__init__(self)
 
 
1338
        self.revision_id = revision_id
 
 
1342
class WeaveFormatError(WeaveError):
 
 
1344
    _fmt = "Weave invariant violated: %(what)s"
 
 
1346
    def __init__(self, what):
 
 
1347
        WeaveError.__init__(self)
 
 
1351
class WeaveParentMismatch(WeaveError):
 
 
1353
    _fmt = "Parents are mismatched between two revisions. %(message)s"
 
 
1356
class WeaveInvalidChecksum(WeaveError):
 
 
1358
    _fmt = "Text did not match it's checksum: %(message)s"
 
 
1361
class WeaveTextDiffers(WeaveError):
 
 
1363
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1364
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1366
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1367
        WeaveError.__init__(self)
 
 
1368
        self.revision_id = revision_id
 
 
1369
        self.weave_a = weave_a
 
 
1370
        self.weave_b = weave_b
 
 
1373
class WeaveTextDiffers(WeaveError):
 
 
1375
    _fmt = ("Weaves differ on text content. Revision:"
 
 
1376
            " {%(revision_id)s}, %(weave_a)s, %(weave_b)s")
 
 
1378
    def __init__(self, revision_id, weave_a, weave_b):
 
 
1379
        WeaveError.__init__(self)
 
 
1380
        self.revision_id = revision_id
 
 
1381
        self.weave_a = weave_a
 
 
1382
        self.weave_b = weave_b
 
1125
1385
class VersionedFileError(BzrError):
 
1127
1387
    _fmt = "Versioned file error"
 
 
1150
1410
class VersionedFileInvalidChecksum(VersionedFileError):
 
1152
 
    _fmt = "Text did not match its checksum: %(msg)s"
 
 
1412
    _fmt = "Text did not match its checksum: %(message)s"
 
 
1415
class KnitError(InternalBzrError):
 
 
1420
class KnitCorrupt(KnitError):
 
 
1422
    _fmt = "Knit %(filename)s corrupt: %(how)s"
 
 
1424
    def __init__(self, filename, how):
 
 
1425
        KnitError.__init__(self)
 
 
1426
        self.filename = filename
 
 
1430
class SHA1KnitCorrupt(KnitCorrupt):
 
 
1432
    _fmt = ("Knit %(filename)s corrupt: sha-1 of reconstructed text does not "
 
 
1433
        "match expected sha-1. key %(key)s expected sha %(expected)s actual "
 
 
1436
    def __init__(self, filename, actual, expected, key, content):
 
 
1437
        KnitError.__init__(self)
 
 
1438
        self.filename = filename
 
 
1439
        self.actual = actual
 
 
1440
        self.expected = expected
 
 
1442
        self.content = content
 
 
1445
class KnitDataStreamIncompatible(KnitError):
 
 
1446
    # Not raised anymore, as we can convert data streams.  In future we may
 
 
1447
    # need it again for more exotic cases, so we're keeping it around for now.
 
 
1449
    _fmt = "Cannot insert knit data stream of format \"%(stream_format)s\" into knit of format \"%(target_format)s\"."
 
 
1451
    def __init__(self, stream_format, target_format):
 
 
1452
        self.stream_format = stream_format
 
 
1453
        self.target_format = target_format
 
 
1456
class KnitDataStreamUnknown(KnitError):
 
 
1457
    # Indicates a data stream we don't know how to handle.
 
 
1459
    _fmt = "Cannot parse knit data stream of format \"%(stream_format)s\"."
 
 
1461
    def __init__(self, stream_format):
 
 
1462
        self.stream_format = stream_format
 
 
1465
class KnitHeaderError(KnitError):
 
 
1467
    _fmt = 'Knit header error: %(badline)r unexpected for file "%(filename)s".'
 
 
1469
    def __init__(self, badline, filename):
 
 
1470
        KnitError.__init__(self)
 
 
1471
        self.badline = badline
 
 
1472
        self.filename = filename
 
 
1474
class KnitIndexUnknownMethod(KnitError):
 
 
1475
    """Raised when we don't understand the storage method.
 
 
1477
    Currently only 'fulltext' and 'line-delta' are supported.
 
 
1480
    _fmt = ("Knit index %(filename)s does not have a known method"
 
 
1481
            " in options: %(options)r")
 
 
1483
    def __init__(self, filename, options):
 
 
1484
        KnitError.__init__(self)
 
 
1485
        self.filename = filename
 
 
1486
        self.options = options
 
1155
1489
class RetryWithNewPacks(BzrError):
 
 
1395
1703
    _fmt = "Working tree has conflicts."
 
1398
 
class DependencyNotPresent(BzrError):
 
1400
 
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
1402
 
    def __init__(self, library, error):
 
1403
 
        BzrError.__init__(self, library=library, error=error)
 
 
1706
class ParseConfigError(BzrError):
 
 
1708
    def __init__(self, errors, filename):
 
 
1709
        if filename is None:
 
 
1711
        message = "Error(s) parsing config file %s:\n%s" % \
 
 
1712
            (filename, ('\n'.join(e.msg for e in errors)))
 
 
1713
        BzrError.__init__(self, message)
 
 
1716
class NoEmailInUsername(BzrError):
 
 
1718
    _fmt = "%(username)r does not seem to contain a reasonable email address"
 
 
1720
    def __init__(self, username):
 
 
1721
        BzrError.__init__(self)
 
 
1722
        self.username = username
 
 
1725
class SigningFailed(BzrError):
 
 
1727
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
 
1729
    def __init__(self, command_line):
 
 
1730
        BzrError.__init__(self, command_line=command_line)
 
1406
1733
class WorkingTreeNotRevision(BzrError):
 
 
1736
2075
    keep, and delete it when you are done."""
 
1738
2077
    def __init__(self, limbo_dir):
 
1739
 
        BzrError.__init__(self)
 
1740
 
        self.limbo_dir = limbo_dir
 
 
2078
       BzrError.__init__(self)
 
 
2079
       self.limbo_dir = limbo_dir
 
1743
2082
class ImmortalPendingDeletion(BzrError):
 
1745
2084
    _fmt = ("Unable to delete transform temporary directory "
 
1746
 
            "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
1747
 
            "contains any files you wish to keep, and delete it when you are done.")
 
 
2085
    "%(pending_deletion)s.  Please examine %(pending_deletion)s to see if it "
 
 
2086
    "contains any files you wish to keep, and delete it when you are done.")
 
1749
2088
    def __init__(self, pending_deletion):
 
1750
 
        BzrError.__init__(self, pending_deletion=pending_deletion)
 
 
2089
       BzrError.__init__(self, pending_deletion=pending_deletion)
 
1753
2092
class OutOfDateTree(BzrError):
 
1755
 
    _fmt = "Working tree is out of date, please run 'brz update'.%(more)s"
 
 
2094
    _fmt = "Working tree is out of date, please run 'bzr update'."
 
1757
 
    def __init__(self, tree, more=None):
 
 
2096
    def __init__(self, tree):
 
1762
2097
        BzrError.__init__(self)
 
1763
2098
        self.tree = tree
 
1767
2101
class PublicBranchOutOfDate(BzrError):
 
 
2132
2493
        self.tag_name = tag_name
 
 
2496
class MalformedBugIdentifier(BzrError):
 
 
2498
    _fmt = ('Did not understand bug identifier %(bug_id)s: %(reason)s. '
 
 
2499
            'See "bzr help bugs" for more information on this feature.')
 
 
2501
    def __init__(self, bug_id, reason):
 
 
2502
        self.bug_id = bug_id
 
 
2503
        self.reason = reason
 
 
2506
class InvalidBugTrackerURL(BzrError):
 
 
2508
    _fmt = ("The URL for bug tracker \"%(abbreviation)s\" doesn't "
 
 
2509
            "contain {id}: %(url)s")
 
 
2511
    def __init__(self, abbreviation, url):
 
 
2512
        self.abbreviation = abbreviation
 
 
2516
class UnknownBugTrackerAbbreviation(BzrError):
 
 
2518
    _fmt = ("Cannot find registered bug tracker called %(abbreviation)s "
 
 
2521
    def __init__(self, abbreviation, branch):
 
 
2522
        self.abbreviation = abbreviation
 
 
2523
        self.branch = branch
 
 
2526
class InvalidLineInBugsProperty(BzrError):
 
 
2528
    _fmt = ("Invalid line in bugs property: '%(line)s'")
 
 
2530
    def __init__(self, line):
 
 
2534
class InvalidBugStatus(BzrError):
 
 
2536
    _fmt = ("Invalid bug status: '%(status)s'")
 
 
2538
    def __init__(self, status):
 
 
2539
        self.status = status
 
2135
2542
class UnexpectedSmartServerResponse(BzrError):
 
2137
2544
    _fmt = "Could not understand response from smart server: %(response_tuple)r"
 
 
2243
2654
        self.reason = reason
 
 
2657
class SMTPError(BzrError):
 
 
2659
    _fmt = "SMTP error: %(error)s"
 
 
2661
    def __init__(self, error):
 
 
2665
class NoMessageSupplied(BzrError):
 
 
2667
    _fmt = "No message supplied."
 
 
2670
class NoMailAddressSpecified(BzrError):
 
 
2672
    _fmt = "No mail-to address (--mail-to) or output (-o) specified."
 
 
2675
class UnknownMailClient(BzrError):
 
 
2677
    _fmt = "Unknown mail client: %(mail_client)s"
 
 
2679
    def __init__(self, mail_client):
 
 
2680
        BzrError.__init__(self, mail_client=mail_client)
 
 
2683
class MailClientNotFound(BzrError):
 
 
2685
    _fmt = "Unable to find mail client with the following names:"\
 
 
2686
        " %(mail_command_list_string)s"
 
 
2688
    def __init__(self, mail_command_list):
 
 
2689
        mail_command_list_string = ', '.join(mail_command_list)
 
 
2690
        BzrError.__init__(self, mail_command_list=mail_command_list,
 
 
2691
                          mail_command_list_string=mail_command_list_string)
 
 
2693
class SMTPConnectionRefused(SMTPError):
 
 
2695
    _fmt = "SMTP connection to %(host)s refused"
 
 
2697
    def __init__(self, error, host):
 
 
2702
class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
 
 
2704
    _fmt = "Please specify smtp_server.  No server at default %(host)s."
 
 
2707
class BzrDirError(BzrError):
 
 
2709
    def __init__(self, bzrdir):
 
 
2710
        import bzrlib.urlutils as urlutils
 
 
2711
        display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
 
 
2713
        BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
 
 
2716
class UnsyncedBranches(BzrDirError):
 
 
2718
    _fmt = ("'%(display_url)s' is not in sync with %(target_url)s.  See"
 
 
2719
            " bzr help sync-for-reconfigure.")
 
 
2721
    def __init__(self, bzrdir, target_branch):
 
 
2722
        BzrDirError.__init__(self, bzrdir)
 
 
2723
        import bzrlib.urlutils as urlutils
 
 
2724
        self.target_url = urlutils.unescape_for_display(target_branch.base,
 
 
2728
class AlreadyBranch(BzrDirError):
 
 
2730
    _fmt = "'%(display_url)s' is already a branch."
 
 
2733
class AlreadyTree(BzrDirError):
 
 
2735
    _fmt = "'%(display_url)s' is already a tree."
 
 
2738
class AlreadyCheckout(BzrDirError):
 
 
2740
    _fmt = "'%(display_url)s' is already a checkout."
 
 
2743
class AlreadyLightweightCheckout(BzrDirError):
 
 
2745
    _fmt = "'%(display_url)s' is already a lightweight checkout."
 
 
2748
class AlreadyUsingShared(BzrDirError):
 
 
2750
    _fmt = "'%(display_url)s' is already using a shared repository."
 
 
2753
class AlreadyStandalone(BzrDirError):
 
 
2755
    _fmt = "'%(display_url)s' is already standalone."
 
 
2758
class AlreadyWithTrees(BzrDirError):
 
 
2760
    _fmt = ("Shared repository '%(display_url)s' already creates "
 
 
2764
class AlreadyWithNoTrees(BzrDirError):
 
 
2766
    _fmt = ("Shared repository '%(display_url)s' already doesn't create "
 
 
2770
class ReconfigurationNotSupported(BzrDirError):
 
 
2772
    _fmt = "Requested reconfiguration of '%(display_url)s' is not supported."
 
 
2775
class NoBindLocation(BzrDirError):
 
 
2777
    _fmt = "No location could be found to bind to at %(display_url)s."
 
2246
2780
class UncommittedChanges(BzrError):
 
2248
 
    _fmt = ('Working tree "%(display_url)s" has uncommitted changes'
 
2249
 
            ' (See brz status).%(more)s')
 
2251
 
    def __init__(self, tree, more=None):
 
2256
 
        import breezy.urlutils as urlutils
 
2257
 
        user_url = getattr(tree, "user_url", None)
 
2258
 
        if user_url is None:
 
2259
 
            display_url = str(tree)
 
2261
 
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2262
 
        BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
 
2265
 
class StoringUncommittedNotSupported(BzrError):
 
2267
 
    _fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
 
2270
 
    def __init__(self, branch):
 
2271
 
        import breezy.urlutils as urlutils
 
2272
 
        user_url = getattr(branch, "user_url", None)
 
2273
 
        if user_url is None:
 
2274
 
            display_url = str(branch)
 
2276
 
            display_url = urlutils.unescape_for_display(user_url, 'ascii')
 
2277
 
        BzrError.__init__(self, branch=branch, display_url=display_url)
 
2280
 
class ShelvedChanges(UncommittedChanges):
 
2282
 
    _fmt = ('Working tree "%(display_url)s" has shelved changes'
 
2283
 
            ' (See brz shelve --list).%(more)s')
 
 
2782
    _fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
 
 
2784
    def __init__(self, tree):
 
 
2785
        import bzrlib.urlutils as urlutils
 
 
2786
        display_url = urlutils.unescape_for_display(
 
 
2787
            tree.bzrdir.root_transport.base, 'ascii')
 
 
2788
        BzrError.__init__(self, tree=tree, display_url=display_url)
 
 
2791
class MissingTemplateVariable(BzrError):
 
 
2793
    _fmt = 'Variable {%(name)s} is not available.'
 
 
2795
    def __init__(self, name):
 
 
2799
class NoTemplate(BzrError):
 
 
2801
    _fmt = 'No template specified.'
 
 
2804
class UnableCreateSymlink(BzrError):
 
 
2806
    _fmt = 'Unable to create symlink %(path_str)son this platform'
 
 
2808
    def __init__(self, path=None):
 
 
2812
                path_str = repr(str(path))
 
 
2813
            except UnicodeEncodeError:
 
 
2814
                path_str = repr(path)
 
 
2816
        self.path_str = path_str
 
 
2819
class UnsupportedTimezoneFormat(BzrError):
 
 
2821
    _fmt = ('Unsupported timezone format "%(timezone)s", '
 
 
2822
            'options are "utc", "original", "local".')
 
 
2824
    def __init__(self, timezone):
 
 
2825
        self.timezone = timezone
 
 
2828
class CommandAvailableInPlugin(StandardError):
 
 
2830
    internal_error = False
 
 
2832
    def __init__(self, cmd_name, plugin_metadata, provider):
 
 
2834
        self.plugin_metadata = plugin_metadata
 
 
2835
        self.cmd_name = cmd_name
 
 
2836
        self.provider = provider
 
 
2840
        _fmt = ('"%s" is not a standard bzr command. \n'
 
 
2841
                'However, the following official plugin provides this command: %s\n'
 
 
2842
                'You can install it by going to: %s'
 
 
2843
                % (self.cmd_name, self.plugin_metadata['name'],
 
 
2844
                    self.plugin_metadata['url']))
 
 
2849
class NoPluginAvailable(BzrError):
 
2286
2853
class UnableEncodePath(BzrError):
 
 
2303
2870
        BzrError.__init__(self, alias_name=alias_name)
 
 
2873
class DirectoryLookupFailure(BzrError):
 
 
2874
    """Base type for lookup errors."""
 
 
2879
class InvalidLocationAlias(DirectoryLookupFailure):
 
 
2881
    _fmt = '"%(alias_name)s" is not a valid location alias.'
 
 
2883
    def __init__(self, alias_name):
 
 
2884
        DirectoryLookupFailure.__init__(self, alias_name=alias_name)
 
 
2887
class UnsetLocationAlias(DirectoryLookupFailure):
 
 
2889
    _fmt = 'No %(alias_name)s location assigned.'
 
 
2891
    def __init__(self, alias_name):
 
 
2892
        DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
 
2306
2895
class CannotBindAddress(BzrError):
 
2308
2897
    _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
 
2310
2899
    def __init__(self, host, port, orig_error):
 
2311
 
        # nb: in python2.4 socket.error doesn't have a useful repr
 
2312
2900
        BzrError.__init__(self, host=host, port=port,
 
2313
 
                          orig_error=repr(orig_error.args))
 
 
2901
            orig_error=orig_error[1])
 
 
2904
class UnknownRules(BzrError):
 
 
2906
    _fmt = ('Unknown rules detected: %(unknowns_str)s.')
 
 
2908
    def __init__(self, unknowns):
 
 
2909
        BzrError.__init__(self, unknowns_str=", ".join(unknowns))
 
 
2912
class HookFailed(BzrError):
 
 
2913
    """Raised when a pre_change_branch_tip hook function fails anything other
 
 
2914
    than TipChangeRejected.
 
 
2917
    _fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
 
 
2918
            "%(traceback_text)s%(exc_value)s")
 
 
2920
    def __init__(self, hook_stage, hook_name, exc_info):
 
 
2922
        self.hook_stage = hook_stage
 
 
2923
        self.hook_name = hook_name
 
 
2924
        self.exc_info = exc_info
 
 
2925
        self.exc_type = exc_info[0]
 
 
2926
        self.exc_value = exc_info[1]
 
 
2927
        self.exc_tb = exc_info[2]
 
 
2928
        self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
 
2316
2931
class TipChangeRejected(BzrError):
 
 
2337
2965
    _fmt = 'The user aborted the operation.'
 
 
2968
class MustHaveWorkingTree(BzrError):
 
 
2970
    _fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
 
 
2972
    def __init__(self, format, url):
 
 
2973
        BzrError.__init__(self, format=format, url=url)
 
 
2976
class NoSuchView(BzrError):
 
 
2977
    """A view does not exist.
 
 
2980
    _fmt = u"No such view: %(view_name)s."
 
 
2982
    def __init__(self, view_name):
 
 
2983
        self.view_name = view_name
 
 
2986
class ViewsNotSupported(BzrError):
 
 
2987
    """Views are not supported by a tree format.
 
 
2990
    _fmt = ("Views are not supported by %(tree)s;"
 
 
2991
            " use 'bzr upgrade' to change your tree to a later format.")
 
 
2993
    def __init__(self, tree):
 
 
2997
class FileOutsideView(BzrError):
 
 
2999
    _fmt = ('Specified file "%(file_name)s" is outside the current view: '
 
 
3002
    def __init__(self, file_name, view_files):
 
 
3003
        self.file_name = file_name
 
 
3004
        self.view_str = ", ".join(view_files)
 
2340
3007
class UnresumableWriteGroup(BzrError):
 
2342
3009
    _fmt = ("Repository %(repository)s cannot resume write group "
 
 
2359
3026
    def __init__(self, repository):
 
2360
3027
        self.repository = repository
 
2363
 
class LossyPushToSameVCS(BzrError):
 
2365
 
    _fmt = ("Lossy push not possible between %(source_branch)r and "
 
2366
 
            "%(target_branch)r that are in the same VCS.")
 
2368
 
    internal_error = True
 
2370
 
    def __init__(self, source_branch, target_branch):
 
2371
 
        self.source_branch = source_branch
 
2372
 
        self.target_branch = target_branch
 
2375
 
class NoRoundtrippingSupport(BzrError):
 
2377
 
    _fmt = ("Roundtripping is not supported between %(source_branch)r and "
 
2378
 
            "%(target_branch)r.")
 
2380
 
    internal_error = True
 
2382
 
    def __init__(self, source_branch, target_branch):
 
2383
 
        self.source_branch = source_branch
 
2384
 
        self.target_branch = target_branch
 
2387
 
class NoColocatedBranchSupport(BzrError):
 
2389
 
    _fmt = ("%(controldir)r does not support co-located branches.")
 
2391
 
    def __init__(self, controldir):
 
2392
 
        self.controldir = controldir
 
2395
 
class RecursiveBind(BzrError):
 
2397
 
    _fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
 
2398
 
            'Please use `brz unbind` to fix.')
 
2400
 
    def __init__(self, branch_url):
 
2401
 
        self.branch_url = branch_url
 
2404
 
class UnsupportedKindChange(BzrError):
 
2406
 
    _fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
 
2407
 
            "%(path)s not supported by format %(format)r")
 
2409
 
    def __init__(self, path, from_kind, to_kind, format):
 
2411
 
        self.from_kind = from_kind
 
2412
 
        self.to_kind = to_kind
 
2413
 
        self.format = format
 
2416
 
class ChangesAlreadyStored(BzrCommandError):
 
2418
 
    _fmt = ('Cannot store uncommitted changes because this branch already'
 
2419
 
            ' stores uncommitted changes.')
 
2422
 
class RevnoOutOfBounds(InternalBzrError):
 
2424
 
    _fmt = ("The requested revision number %(revno)d is outside of the "
 
2425
 
            "expected boundaries (%(minimum)d <= %(maximum)d).")
 
2427
 
    def __init__(self, revno, bounds):
 
2428
 
        InternalBzrError.__init__(
 
2429
 
            self, revno=revno, minimum=bounds[0], maximum=bounds[1])