~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/errors.py

  • Committer: John Arbash Meinel
  • Date: 2011-07-18 14:22:20 UTC
  • mto: This revision was merged to the branch mainline in revision 6033.
  • Revision ID: john@arbash-meinel.com-20110718142220-nwylw659oip1ene9
Start at least testing the package_branch regex.
And start testing the is-up-to-date logic.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005-2011 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
54
54
    Base class for errors raised by bzrlib.
55
55
 
56
56
    :cvar internal_error: if True this was probably caused by a bzr bug and
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.)
 
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
 
59
        details.  (That can be overridden by -Derror on the command line.)
60
60
 
61
61
    :cvar _fmt: Format string to display the error; this is expanded
62
 
    by the instance's dict.
 
62
        by the instance's dict.
63
63
    """
64
64
 
65
65
    internal_error = False
304
304
class RootMissing(InternalBzrError):
305
305
 
306
306
    _fmt = ("The root entry of a tree must be the first entry supplied to "
307
 
        "record_entry_contents.")
 
307
        "the commit builder.")
308
308
 
309
309
 
310
310
class NoPublicBranch(BzrError):
713
713
       self.bzrdir = bzrdir
714
714
       PathError.__init__(self, path=path)
715
715
 
 
716
    def __repr__(self):
 
717
        return '<%s %r>' % (self.__class__.__name__, self.__dict__)
 
718
 
716
719
    def _format(self):
717
720
        # XXX: Ideally self.detail would be a property, but Exceptions in
718
721
        # Python 2.4 have to be old-style classes so properties don't work.
723
726
                    self.bzrdir.open_repository()
724
727
                except NoRepositoryPresent:
725
728
                    self.detail = ''
 
729
                except Exception:
 
730
                    # Just ignore unexpected errors.  Raising arbitrary errors
 
731
                    # during str(err) can provoke strange bugs.  Concretely
 
732
                    # Launchpad's codehosting managed to raise NotBranchError
 
733
                    # here, and then get stuck in an infinite loop/recursion
 
734
                    # trying to str() that error.  All this error really cares
 
735
                    # about that there's no working repository there, and if
 
736
                    # open_repository() fails, there probably isn't.
 
737
                    self.detail = ''
726
738
                else:
727
739
                    self.detail = ': location is a repository'
728
740
            else:
852
864
        """Construct a new AlreadyVersionedError.
853
865
 
854
866
        :param path: This is the path which is versioned,
855
 
        which should be in a user friendly form.
 
867
            which should be in a user friendly form.
856
868
        :param context_info: If given, this is information about the context,
857
 
        which could explain why this is expected to not be versioned.
 
869
            which could explain why this is expected to not be versioned.
858
870
        """
859
871
        BzrError.__init__(self)
860
872
        self.path = path
873
885
        """Construct a new NotVersionedError.
874
886
 
875
887
        :param path: This is the path which is not versioned,
876
 
        which should be in a user friendly form.
 
888
            which should be in a user friendly form.
877
889
        :param context_info: If given, this is information about the context,
878
 
        which could explain why this is expected to be versioned.
 
890
            which could explain why this is expected to be versioned.
879
891
        """
880
892
        BzrError.__init__(self)
881
893
        self.path = path
1128
1140
        BzrError.__init__(self, files=files, files_str=files_str)
1129
1141
 
1130
1142
 
 
1143
class ExcludesUnsupported(BzrError):
 
1144
 
 
1145
    _fmt = ('Excluding paths during commit is not supported by '
 
1146
            'repository at %(repository)r.')
 
1147
 
 
1148
    def __init__(self, repository):
 
1149
        BzrError.__init__(self, repository=repository)
 
1150
 
 
1151
 
1131
1152
class BadCommitMessageEncoding(BzrError):
1132
1153
 
1133
1154
    _fmt = 'The specified commit message contains characters unsupported by '\
1694
1715
 
1695
1716
class InvalidHttpResponse(TransportError):
1696
1717
 
1697
 
    _fmt = "Invalid http response for %(path)s: %(msg)s"
 
1718
    _fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1698
1719
 
1699
1720
    def __init__(self, path, msg, orig_error=None):
1700
1721
        self.path = path
 
1722
        if orig_error is None:
 
1723
            orig_error = ''
 
1724
        else:
 
1725
            # This is reached for obscure and unusual errors so we want to
 
1726
            # preserve as much info as possible to ease debug.
 
1727
            orig_error = ': %r' % (orig_error,)
1701
1728
        TransportError.__init__(self, msg, orig_error=orig_error)
1702
1729
 
1703
1730
 
1743
1770
    _fmt = "Working tree has conflicts."
1744
1771
 
1745
1772
 
 
1773
class ConfigContentError(BzrError):
 
1774
 
 
1775
    _fmt = "Config file %(filename)s is not UTF-8 encoded\n"
 
1776
 
 
1777
    def __init__(self, filename):
 
1778
        BzrError.__init__(self)
 
1779
        self.filename = filename
 
1780
 
 
1781
 
1746
1782
class ParseConfigError(BzrError):
1747
1783
 
 
1784
    _fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
 
1785
 
1748
1786
    def __init__(self, errors, filename):
1749
 
        if filename is None:
1750
 
            filename = ""
1751
 
        message = "Error(s) parsing config file %s:\n%s" % \
1752
 
            (filename, ('\n'.join(e.msg for e in errors)))
1753
 
        BzrError.__init__(self, message)
 
1787
        BzrError.__init__(self)
 
1788
        self.filename = filename
 
1789
        self.errors = '\n'.join(e.msg for e in errors)
1754
1790
 
1755
1791
 
1756
1792
class NoEmailInUsername(BzrError):
1764
1800
 
1765
1801
class SigningFailed(BzrError):
1766
1802
 
1767
 
    _fmt = 'Failed to gpg sign data with command "%(command_line)s"'
 
1803
    _fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1768
1804
 
1769
1805
    def __init__(self, command_line):
1770
1806
        BzrError.__init__(self, command_line=command_line)
1771
1807
 
1772
1808
 
 
1809
class SignatureVerificationFailed(BzrError):
 
1810
 
 
1811
    _fmt = 'Failed to verify GPG signature data with error "%(error)s"'
 
1812
 
 
1813
    def __init__(self, error):
 
1814
        BzrError.__init__(self, error=error)
 
1815
 
 
1816
 
 
1817
class DependencyNotPresent(BzrError):
 
1818
 
 
1819
    _fmt = 'Unable to import library "%(library)s": %(error)s'
 
1820
 
 
1821
    def __init__(self, library, error):
 
1822
        BzrError.__init__(self, library=library, error=error)
 
1823
 
 
1824
 
 
1825
class GpgmeNotInstalled(DependencyNotPresent):
 
1826
 
 
1827
    _fmt = 'python-gpgme is not installed, it is needed to verify signatures'
 
1828
 
 
1829
    def __init__(self, error):
 
1830
        DependencyNotPresent.__init__(self, 'gpgme', error)
 
1831
 
 
1832
 
1773
1833
class WorkingTreeNotRevision(BzrError):
1774
1834
 
1775
1835
    _fmt = ("The working tree for %(basedir)s has changed since"
1948
2008
 
1949
2009
class BzrMoveFailedError(BzrError):
1950
2010
 
1951
 
    _fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
2011
    _fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
 
2012
        "%(_has_extra)s%(extra)s")
1952
2013
 
1953
2014
    def __init__(self, from_path='', to_path='', extra=None):
1954
2015
        from bzrlib.osutils import splitpath
1955
2016
        BzrError.__init__(self)
1956
2017
        if extra:
1957
 
            self.extra = ': ' + str(extra)
 
2018
            self.extra, self._has_extra = extra, ': '
1958
2019
        else:
1959
 
            self.extra = ''
 
2020
            self.extra = self._has_extra = ''
1960
2021
 
1961
2022
        has_from = len(from_path) > 0
1962
2023
        has_to = len(to_path) > 0
1983
2044
 
1984
2045
class BzrRenameFailedError(BzrMoveFailedError):
1985
2046
 
1986
 
    _fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
 
2047
    _fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
 
2048
        "%(_has_extra)s%(extra)s")
1987
2049
 
1988
2050
    def __init__(self, from_path, to_path, extra=None):
1989
2051
        BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1990
2052
 
 
2053
 
1991
2054
class BzrRemoveChangedFilesError(BzrError):
1992
2055
    """Used when user is trying to remove changed files."""
1993
2056
 
2011
2074
 
2012
2075
class BzrBadParameterMissing(BzrBadParameter):
2013
2076
 
2014
 
    _fmt = "Parameter $(param)s is required but not present."
 
2077
    _fmt = "Parameter %(param)s is required but not present."
2015
2078
 
2016
2079
 
2017
2080
class BzrBadParameterUnicode(BzrBadParameter):
2025
2088
    _fmt = "Parameter %(param)s contains a newline."
2026
2089
 
2027
2090
 
2028
 
class DependencyNotPresent(BzrError):
2029
 
 
2030
 
    _fmt = 'Unable to import library "%(library)s": %(error)s'
2031
 
 
2032
 
    def __init__(self, library, error):
2033
 
        BzrError.__init__(self, library=library, error=error)
2034
 
 
2035
 
 
2036
2091
class ParamikoNotPresent(DependencyNotPresent):
2037
2092
 
2038
2093
    _fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2641
2696
 
2642
2697
    This is distinct from ErrorFromSmartServer so that it is possible to
2643
2698
    distinguish between the following two cases:
2644
 
      - ErrorFromSmartServer was uncaught.  This is logic error in the client
2645
 
        and so should provoke a traceback to the user.
2646
 
      - ErrorFromSmartServer was caught but its error_tuple could not be
2647
 
        translated.  This is probably because the server sent us garbage, and
2648
 
        should not provoke a traceback.
 
2699
 
 
2700
    - ErrorFromSmartServer was uncaught.  This is logic error in the client
 
2701
      and so should provoke a traceback to the user.
 
2702
    - ErrorFromSmartServer was caught but its error_tuple could not be
 
2703
      translated.  This is probably because the server sent us garbage, and
 
2704
      should not provoke a traceback.
2649
2705
    """
2650
2706
 
2651
2707
    _fmt = "Server sent an unexpected error: %(error_tuple)r"
2945
3001
        self.user_encoding = osutils.get_user_encoding()
2946
3002
 
2947
3003
 
 
3004
class NoSuchConfig(BzrError):
 
3005
 
 
3006
    _fmt = ('The "%(config_id)s" configuration does not exist.')
 
3007
 
 
3008
    def __init__(self, config_id):
 
3009
        BzrError.__init__(self, config_id=config_id)
 
3010
 
 
3011
 
 
3012
class NoSuchConfigOption(BzrError):
 
3013
 
 
3014
    _fmt = ('The "%(option_name)s" configuration option does not exist.')
 
3015
 
 
3016
    def __init__(self, option_name):
 
3017
        BzrError.__init__(self, option_name=option_name)
 
3018
 
 
3019
 
2948
3020
class NoSuchAlias(BzrError):
2949
3021
 
2950
3022
    _fmt = ('The alias "%(alias_name)s" does not exist.')
3034
3106
    _fmt = "Shelf corrupt."
3035
3107
 
3036
3108
 
 
3109
class DecompressCorruption(BzrError):
 
3110
 
 
3111
    _fmt = "Corruption while decompressing repository file%(orig_error)s"
 
3112
 
 
3113
    def __init__(self, orig_error=None):
 
3114
        if orig_error is not None:
 
3115
            self.orig_error = ", %s" % (orig_error,)
 
3116
        else:
 
3117
            self.orig_error = ""
 
3118
        BzrError.__init__(self)
 
3119
 
 
3120
 
3037
3121
class NoSuchShelfId(BzrError):
3038
3122
 
3039
3123
    _fmt = 'No changes are shelved with id "%(shelf_id)d".'
3190
3274
    def __init__(self, branch_url):
3191
3275
        self.branch_url = branch_url
3192
3276
 
 
3277
 
 
3278
# FIXME: I would prefer to define the config related exception classes in
 
3279
# config.py but the lazy import mechanism proscribes this -- vila 20101222
 
3280
class OptionExpansionLoop(BzrError):
 
3281
 
 
3282
    _fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
 
3283
 
 
3284
    def __init__(self, string, refs):
 
3285
        self.string = string
 
3286
        self.refs = '->'.join(refs)
 
3287
 
 
3288
 
 
3289
class ExpandingUnknownOption(BzrError):
 
3290
 
 
3291
    _fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
 
3292
 
 
3293
    def __init__(self, name, string):
 
3294
        self.name = name
 
3295
        self.string = string
 
3296
 
 
3297
 
 
3298
class NoCompatibleInter(BzrError):
 
3299
 
 
3300
    _fmt = ('No compatible object available for operations from %(source)r '
 
3301
            'to %(target)r.')
 
3302
 
 
3303
    def __init__(self, source, target):
 
3304
        self.source = source
 
3305
        self.target = target