~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: Jelmer Vernooij
  • Date: 2011-04-09 19:25:42 UTC
  • mto: (5777.5.1 inventoryworkingtree)
  • mto: This revision was merged to the branch mainline in revision 5781.
  • Revision ID: jelmer@samba.org-20110409192542-8bbedp36s7nj928e
Split InventoryTree out of Tree.

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
from bzrlib import (
21
21
    osutils,
22
22
    symbol_versioning,
23
 
    i18n,
24
 
    trace,
25
23
    )
26
 
from bzrlib.i18n import gettext
27
24
from bzrlib.patches import (
28
25
    MalformedHunkHeader,
29
26
    MalformedLine,
57
54
    Base class for errors raised by bzrlib.
58
55
 
59
56
    :cvar internal_error: if True this was probably caused by a bzr bug and
60
 
        should be displayed with a traceback; if False (or absent) this was
61
 
        probably a user or environment error and they don't need the gory
62
 
        details.  (That can be overridden by -Derror on the command line.)
 
57
    should be displayed with a traceback; if False (or absent) this was
 
58
    probably a user or environment error and they don't need the gory details.
 
59
    (That can be overridden by -Derror on the command line.)
63
60
 
64
61
    :cvar _fmt: Format string to display the error; this is expanded
65
 
        by the instance's dict.
 
62
    by the instance's dict.
66
63
    """
67
64
 
68
65
    internal_error = False
143
140
        """Return format string for this exception or None"""
144
141
        fmt = getattr(self, '_fmt', None)
145
142
        if fmt is not None:
146
 
            i18n.install()
147
 
            unicode_fmt = unicode(fmt) #_fmt strings should be ascii
148
 
            if type(fmt) == unicode:
149
 
                trace.mutter("Unicode strings in error.fmt are deprecated")
150
 
            return gettext(unicode_fmt)
 
143
            return fmt
151
144
        fmt = getattr(self, '__doc__', None)
152
145
        if fmt is not None:
153
146
            symbol_versioning.warn("%s uses its docstring as a format, "
311
304
class RootMissing(InternalBzrError):
312
305
 
313
306
    _fmt = ("The root entry of a tree must be the first entry supplied to "
314
 
        "the commit builder.")
 
307
        "record_entry_contents.")
315
308
 
316
309
 
317
310
class NoPublicBranch(BzrError):
628
621
 
629
622
    _fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
630
623
 
631
 
    def __init__(self, url, extra=""):
 
624
    def __init__(self, url, extra):
632
625
        PathError.__init__(self, url, extra=extra)
633
626
 
634
627
 
871
864
        """Construct a new AlreadyVersionedError.
872
865
 
873
866
        :param path: This is the path which is versioned,
874
 
            which should be in a user friendly form.
 
867
        which should be in a user friendly form.
875
868
        :param context_info: If given, this is information about the context,
876
 
            which could explain why this is expected to not be versioned.
 
869
        which could explain why this is expected to not be versioned.
877
870
        """
878
871
        BzrError.__init__(self)
879
872
        self.path = path
892
885
        """Construct a new NotVersionedError.
893
886
 
894
887
        :param path: This is the path which is not versioned,
895
 
            which should be in a user friendly form.
 
888
        which should be in a user friendly form.
896
889
        :param context_info: If given, this is information about the context,
897
 
            which could explain why this is expected to be versioned.
 
890
        which could explain why this is expected to be versioned.
898
891
        """
899
892
        BzrError.__init__(self)
900
893
        self.path = path
1666
1659
 
1667
1660
    def __init__(self, exc_info):
1668
1661
        import traceback
1669
 
        # GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1670
1662
        self.exc_type, self.exc_value, self.exc_tb = exc_info
1671
1663
        self.exc_info = exc_info
1672
1664
        traceback_strings = traceback.format_exception(
1711
1703
    _fmt = "Connection closed: %(msg)s %(orig_error)s"
1712
1704
 
1713
1705
 
1714
 
class ConnectionTimeout(ConnectionError):
1715
 
 
1716
 
    _fmt = "Connection Timeout: %(msg)s%(orig_error)s"
1717
 
 
1718
 
 
1719
1706
class InvalidRange(TransportError):
1720
1707
 
1721
1708
    _fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
1728
1715
 
1729
1716
class InvalidHttpResponse(TransportError):
1730
1717
 
1731
 
    _fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
 
1718
    _fmt = "Invalid http response for %(path)s: %(msg)s"
1732
1719
 
1733
1720
    def __init__(self, path, msg, orig_error=None):
1734
1721
        self.path = path
1735
 
        if orig_error is None:
1736
 
            orig_error = ''
1737
 
        else:
1738
 
            # This is reached for obscure and unusual errors so we want to
1739
 
            # preserve as much info as possible to ease debug.
1740
 
            orig_error = ': %r' % (orig_error,)
1741
1722
        TransportError.__init__(self, msg, orig_error=orig_error)
1742
1723
 
1743
1724
 
1750
1731
        InvalidHttpResponse.__init__(self, path, msg)
1751
1732
 
1752
1733
 
1753
 
class HttpBoundaryMissing(InvalidHttpResponse):
1754
 
    """A multipart response ends with no boundary marker.
1755
 
 
1756
 
    This is a special case caused by buggy proxies, described in
1757
 
    <https://bugs.launchpad.net/bzr/+bug/198646>.
1758
 
    """
1759
 
 
1760
 
    _fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1761
 
 
1762
 
    def __init__(self, path, msg):
1763
 
        InvalidHttpResponse.__init__(self, path, msg)
1764
 
 
1765
 
 
1766
1734
class InvalidHttpContentType(InvalidHttpResponse):
1767
1735
 
1768
1736
    _fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1796
1764
    _fmt = "Working tree has conflicts."
1797
1765
 
1798
1766
 
1799
 
class ConfigContentError(BzrError):
1800
 
 
1801
 
    _fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1802
 
 
1803
 
    def __init__(self, filename):
1804
 
        BzrError.__init__(self)
1805
 
        self.filename = filename
1806
 
 
1807
 
 
1808
1767
class ParseConfigError(BzrError):
1809
1768
 
1810
 
    _fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1811
 
 
1812
1769
    def __init__(self, errors, filename):
1813
 
        BzrError.__init__(self)
1814
 
        self.filename = filename
1815
 
        self.errors = '\n'.join(e.msg for e in errors)
1816
 
 
1817
 
 
1818
 
class ConfigOptionValueError(BzrError):
1819
 
 
1820
 
    _fmt = """Bad value "%(value)s" for option "%(name)s"."""
1821
 
 
1822
 
    def __init__(self, name, value):
1823
 
        BzrError.__init__(self, name=name, value=value)
 
1770
        if filename is None:
 
1771
            filename = ""
 
1772
        message = "Error(s) parsing config file %s:\n%s" % \
 
1773
            (filename, ('\n'.join(e.msg for e in errors)))
 
1774
        BzrError.__init__(self, message)
1824
1775
 
1825
1776
 
1826
1777
class NoEmailInUsername(BzrError):
1834
1785
 
1835
1786
class SigningFailed(BzrError):
1836
1787
 
1837
 
    _fmt = 'Failed to GPG sign data with command "%(command_line)s"'
 
1788
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1838
1789
 
1839
1790
    def __init__(self, command_line):
1840
1791
        BzrError.__init__(self, command_line=command_line)
1841
1792
 
1842
1793
 
1843
 
class SignatureVerificationFailed(BzrError):
1844
 
 
1845
 
    _fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1846
 
 
1847
 
    def __init__(self, error):
1848
 
        BzrError.__init__(self, error=error)
1849
 
 
1850
 
 
1851
 
class DependencyNotPresent(BzrError):
1852
 
 
1853
 
    _fmt = 'Unable to import library "%(library)s": %(error)s'
1854
 
 
1855
 
    def __init__(self, library, error):
1856
 
        BzrError.__init__(self, library=library, error=error)
1857
 
 
1858
 
 
1859
 
class GpgmeNotInstalled(DependencyNotPresent):
1860
 
 
1861
 
    _fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1862
 
 
1863
 
    def __init__(self, error):
1864
 
        DependencyNotPresent.__init__(self, 'gpgme', error)
1865
 
 
1866
 
 
1867
1794
class WorkingTreeNotRevision(BzrError):
1868
1795
 
1869
1796
    _fmt = ("The working tree for %(basedir)s has changed since"
2122
2049
    _fmt = "Parameter %(param)s contains a newline."
2123
2050
 
2124
2051
 
 
2052
class DependencyNotPresent(BzrError):
 
2053
 
 
2054
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
2055
 
 
2056
    def __init__(self, library, error):
 
2057
        BzrError.__init__(self, library=library, error=error)
 
2058
 
 
2059
 
2125
2060
class ParamikoNotPresent(DependencyNotPresent):
2126
2061
 
2127
2062
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2362
2297
    """
2363
2298
 
2364
2299
 
2365
 
class GhostTagsNotSupported(BzrError):
2366
 
 
2367
 
    _fmt = "Ghost tags not supported by format %(format)r."
2368
 
 
2369
 
    def __init__(self, format):
2370
 
        self.format = format
2371
 
 
2372
 
 
2373
2300
class BinaryFile(BzrError):
2374
2301
 
2375
2302
    _fmt = "File is binary but should be text."
2738
2665
 
2739
2666
    This is distinct from ErrorFromSmartServer so that it is possible to
2740
2667
    distinguish between the following two cases:
2741
 
 
2742
 
    - ErrorFromSmartServer was uncaught.  This is logic error in the client
2743
 
      and so should provoke a traceback to the user.
2744
 
    - ErrorFromSmartServer was caught but its error_tuple could not be
2745
 
      translated.  This is probably because the server sent us garbage, and
2746
 
      should not provoke a traceback.
 
2668
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2669
        and so should provoke a traceback to the user.
 
2670
      - ErrorFromSmartServer was caught but its error_tuple could not be
 
2671
        translated.  This is probably because the server sent us garbage, and
 
2672
        should not provoke a traceback.
2747
2673
    """
2748
2674
 
2749
2675
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
2805
2731
    _fmt = "Container has multiple records with the same name: %(name)s"
2806
2732
 
2807
2733
    def __init__(self, name):
2808
 
        self.name = name.decode("utf-8")
 
2734
        self.name = name
2809
2735
 
2810
2736
 
2811
2737
class NoDestinationAddress(InternalBzrError):
3148
3074
    _fmt = "Shelf corrupt."
3149
3075
 
3150
3076
 
3151
 
class DecompressCorruption(BzrError):
3152
 
 
3153
 
    _fmt = "Corruption while decompressing repository file%(orig_error)s"
3154
 
 
3155
 
    def __init__(self, orig_error=None):
3156
 
        if orig_error is not None:
3157
 
            self.orig_error = ", %s" % (orig_error,)
3158
 
        else:
3159
 
            self.orig_error = ""
3160
 
        BzrError.__init__(self)
3161
 
 
3162
 
 
3163
3077
class NoSuchShelfId(BzrError):
3164
3078
 
3165
3079
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
3335
3249
    def __init__(self, name, string):
3336
3250
        self.name = name
3337
3251
        self.string = string
3338
 
 
3339
 
 
3340
 
class NoCompatibleInter(BzrError):
3341
 
 
3342
 
    _fmt = ('No compatible object available for operations from %(source)r '
3343
 
            'to %(target)r.')
3344
 
 
3345
 
    def __init__(self, source, target):
3346
 
        self.source = source
3347
 
        self.target = target
3348
 
 
3349
 
 
3350
 
class HpssVfsRequestNotAllowed(BzrError):
3351
 
 
3352
 
    _fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3353
 
            "%(method)s, %(arguments)s.")
3354
 
 
3355
 
    def __init__(self, method, arguments):
3356
 
        self.method = method
3357
 
        self.arguments = arguments